#include "object.hh" #include #include std::string Object::to_string() { switch (type) { case ObjectType::NIL: return "nil"; case ObjectType::BOOL: { bool val = std::get(value); return (val ? "true" : "false"); } case ObjectType::IDENTIFIER: case ObjectType::STRING_LIT: { std::string val = std::get(value); return val; } case ObjectType::NUMBER: { double val = std::get(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(value); bool right = std::get(other.value); return left == right; } case ObjectType::IDENTIFIER: case ObjectType::STRING_LIT: { std::string left = std::get(value); std::string right = std::get(other.value); return left == right; } case ObjectType::NUMBER: { double left = std::get(value); double right = std::get(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(obj.value)); break; case ObjectType::IDENTIFIER: case ObjectType::STRING_LIT: os << ", " << std::get(obj.value); break; case ObjectType::NUMBER: os << ", " << std::get(obj.value); break; } os << ')'; return os; } bool Object::operator!=(const Object &other) { return !operator==(other); }