100 lines
2.2 KiB
C++
100 lines
2.2 KiB
C++
#include "object.hh"
|
|
#include <string>
|
|
|
|
std::string Object::to_string() {
|
|
switch (type) {
|
|
case ObjectType::NIL:
|
|
return "nil";
|
|
case ObjectType::BOOL: {
|
|
bool val = std::get<bool>(value);
|
|
return (val ? "true" : "false");
|
|
}
|
|
case ObjectType::IDENTIFIER:
|
|
case ObjectType::STRING_LIT: {
|
|
std::string val = std::get<std::string>(value);
|
|
return val;
|
|
}
|
|
case ObjectType::NUMBER: {
|
|
double val = std::get<double>(value);
|
|
return std::to_string(val);
|
|
}
|
|
}
|
|
}
|
|
|
|
bool Object::operator==(const Object &other) {
|
|
if (type != other.type) {
|
|
return false;
|
|
}
|
|
|
|
switch (type) {
|
|
case ObjectType::NIL: return true;
|
|
case ObjectType::BOOL: {
|
|
bool left = std::get<bool>(value);
|
|
bool right = std::get<bool>(other.value);
|
|
|
|
return left == right;
|
|
}
|
|
case ObjectType::IDENTIFIER:
|
|
case ObjectType::STRING_LIT: {
|
|
std::string left = std::get<std::string>(value);
|
|
std::string right = std::get<std::string>(other.value);
|
|
|
|
return left == right;
|
|
}
|
|
case ObjectType::NUMBER: {
|
|
double left = std::get<double>(value);
|
|
double right = std::get<double>(other.value);
|
|
|
|
return left == right;
|
|
}
|
|
}
|
|
}
|
|
|
|
std::ostream &operator<<(std::ostream &os, const ObjectType &type) {
|
|
switch (type) {
|
|
case ObjectType::NIL:
|
|
os << "ObjectType::NIL";
|
|
break;
|
|
case ObjectType::BOOL:
|
|
os << "ObjectType::BOOL";
|
|
case ObjectType::IDENTIFIER:
|
|
os << "ObjectType::IDENTIFIER";
|
|
break;
|
|
case ObjectType::STRING_LIT:
|
|
os << "ObjectType::STRING_LIT";
|
|
break;
|
|
case ObjectType::NUMBER:
|
|
os << "ObjectType::NUMBER";
|
|
break;
|
|
}
|
|
|
|
return os;
|
|
}
|
|
|
|
std::ostream &operator<<(std::ostream &os, const Object &obj) {
|
|
os << "Object(" << obj.type;
|
|
|
|
switch (obj.type) {
|
|
case ObjectType::NIL:
|
|
break;
|
|
case ObjectType::BOOL:
|
|
os << ", " << std::to_string(std::get<bool>(obj.value));
|
|
break;
|
|
case ObjectType::IDENTIFIER:
|
|
case ObjectType::STRING_LIT:
|
|
os << ", " << std::get<std::string>(obj.value);
|
|
break;
|
|
case ObjectType::NUMBER:
|
|
os << ", " << std::get<double>(obj.value);
|
|
break;
|
|
}
|
|
|
|
os << ')';
|
|
|
|
return os;
|
|
}
|
|
|
|
bool Object::operator!=(const Object &other) {
|
|
return !operator==(other);
|
|
}
|