[Feat] 详细区分左值(LvObject)与右值(RvObject -> ObjectPtr)

[Impl] 重构evaluator.cpp + hpp 全部
[Feat] 增加对于IndexExpr的解析
[Fix][Impl] 现在点运算符不由BinaryExpr负责,增加MemberExpr,单独实现解析
[Impl] 项目目录全部翻修, src/目录下单独文件夹放置每一个模块
This commit is contained in:
2025-12-24 17:51:49 +08:00
parent 3227230aa2
commit fc35368d85
70 changed files with 1558 additions and 1233 deletions

100
src/Core/fig_string.hpp Normal file
View File

@@ -0,0 +1,100 @@
#pragma once
#include <string>
#include <string_view>
namespace Fig
{
// using String = std::u8string;
// using StringView = std::u8string_view;
class FStringView : public std::u8string_view
{
public:
using std::u8string_view::u8string_view;
static FStringView fromBasicStringView(std::string_view sv)
{
return FStringView(reinterpret_cast<const char8_t*>(sv.data()), sv.size());
}
explicit FStringView(std::string_view sv)
{
*this = fromBasicStringView(sv);
}
explicit FStringView()
{
*this = fromBasicStringView(std::string_view(""));
}
};
class FString : public std::u8string
{
public:
using std::u8string::u8string;
explicit FString(const std::u8string &str)
{
*this = fromU8String(str);
}
explicit FString(std::string str)
{
*this = fromBasicString(str);
}
explicit FString(FStringView sv)
{
*this = fromStringView(sv);
}
std::string toBasicString() const
{
return std::string(this->begin(), this->end());
}
FStringView toStringView() const
{
return FStringView(this->data(), this->size());
}
static FString fromBasicString(const std::string &str)
{
return FString(str.begin(), str.end());
}
static FString fromStringView(FStringView sv)
{
return FString(reinterpret_cast<const char*> (sv.data()));
}
static FString fromU8String(const std::u8string &str)
{
return FString(str.begin(), str.end());
}
size_t length()
{
// get UTF8-String real length
size_t len = 0;
for (auto it = this->begin(); it != this->end(); ++it)
{
if ((*it & 0xC0) != 0x80)
{
++len;
}
}
return len;
}
};
}; // namespace Fig
namespace std
{
template <>
struct hash<Fig::FString>
{
std::size_t operator()(const Fig::FString &s) const
{
return std::hash<std::u8string>{}(static_cast<const std::u8string &>(s));
}
};
}