2025-06-29 12:37:07 +01:00

106 lines
2.4 KiB
C++

#include "object.hh"
#include <cstddef>
#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);
std::string output{std::to_string(val)};
if (val == ((int)val)) {
size_t decimal_index{output.find(".")};
output = output.substr(0, decimal_index);
}
return output;
}
}
}
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);
}