https://github.com/leozhang1/QtInterpreter这个链接 Value.cpp代码 展示
时间: 2023-10-07 08:07:13 浏览: 87
以下是该链接中 Value.cpp 的代码:
```
#include "Value.h"
#include "Object.h"
#include <sstream>
Value::Value(int intValue)
: m_type(Int)
{
m_data.intValue = intValue;
}
Value::Value(double doubleValue)
: m_type(Double)
{
m_data.doubleValue = doubleValue;
}
Value::Value(bool boolValue)
: m_type(Bool)
{
m_data.boolValue = boolValue;
}
Value::Value(const std::string& stringValue)
: m_type(String)
{
m_data.stringValue = new std::string(stringValue);
}
Value::Value(Object* objectValue)
: m_type(ObjectPtr)
{
m_data.objectValue = objectValue;
}
Value::Value(const Value& other)
: m_type(other.m_type)
{
switch (m_type) {
case Int:
m_data.intValue = other.m_data.intValue;
break;
case Double:
m_data.doubleValue = other.m_data.doubleValue;
break;
case Bool:
m_data.boolValue = other.m_data.boolValue;
break;
case String:
m_data.stringValue = new std::string(*other.m_data.stringValue);
break;
case ObjectPtr:
m_data.objectValue = other.m_data.objectValue;
break;
}
}
Value::~Value()
{
if (m_type == String) {
delete m_data.stringValue;
}
}
Value::Type Value::type() const
{
return m_type;
}
int Value::asInt() const
{
if (m_type == Int) {
return m_data.intValue;
} else if (m_type == Double) {
return static_cast<int>(m_data.doubleValue);
} else if (m_type == Bool) {
return m_data.boolValue ? 1 : 0;
} else if (m_type == String) {
std::stringstream ss(*m_data.stringValue);
int i;
ss >> i;
return i;
} else if (m_type == ObjectPtr) {
throw std::runtime_error("Cannot convert object to int");
}
throw std::runtime_error("Unknown value type");
}
double Value::asDouble() const
{
if (m_type == Int) {
return static_cast<double>(m_data.intValue);
} else if (m_type == Double) {
return m_data.doubleValue;
} else if (m_type == Bool) {
return m_data.boolValue ? 1.0 : 0.0;
} else if (m_type == String) {
std::stringstream ss(*m_data.stringValue);
double d;
ss >> d;
return d;
} else if (m_type == ObjectPtr) {
throw std::runtime_error("Cannot convert object to double");
}
throw std::runtime_error("Unknown value type");
}
bool Value::asBool() const
{
if (m_type == Int) {
return m_data.intValue != 0;
} else if (m_type == Double) {
return m_data.doubleValue != 0.0;
} else if (m_type == Bool) {
return m_data.boolValue;
} else if (m_type == String) {
std::string stringValue = *m_data.stringValue;
return !stringValue.empty() && stringValue != "false" && stringValue != "0";
} else if (m_type == ObjectPtr) {
throw std::runtime_error("Cannot convert object to bool");
}
throw std::runtime_error("Unknown value type");
}
std::string Value::asString() const
{
if (m_type == Int) {
std::stringstream ss;
ss << m_data.intValue;
return ss.str();
} else if (m_type == Double) {
std::stringstream ss;
ss << m_data.doubleValue;
return ss.str();
} else if (m_type == Bool) {
return m_data.boolValue ? "true" : "false";
} else if (m_type == String) {
return *m_data.stringValue;
} else if (m_type == ObjectPtr) {
throw std::runtime_error("Cannot convert object to string");
}
throw std::runtime_error("Unknown value type");
}
Object* Value::asObject() const
{
if (m_type == ObjectPtr) {
return m_data.objectValue;
}
throw std::runtime_error("Value is not an object");
}
Value& Value::operator=(const Value& other)
{
if (this != &other) {
if (m_type == String) {
delete m_data.stringValue;
}
m_type = other.m_type;
switch (m_type) {
case Int:
m_data.intValue = other.m_data.intValue;
break;
case Double:
m_data.doubleValue = other.m_data.doubleValue;
break;
case Bool:
m_data.boolValue = other.m_data.boolValue;
break;
case String:
m_data.stringValue = new std::string(*other.m_data.stringValue);
break;
case ObjectPtr:
m_data.objectValue = other.m_data.objectValue;
break;
}
}
return *this;
}
```
这里是一个用于嵌入式解释器的 C++ 类库。Value 类是该库中的一个重要组成部分,它表示解释器中的值。包括整型、浮点型、布尔型、字符串和对象指针。Value 类提供了许多方法,用于获取 Value 对象的值,并且支持值之间的相互赋值。此外,Value 类还提供了析构函数,用于在对象生命周期结束时释放相应的资源。
阅读全文