#pragma once #include #include #include class BaseValue { public: enum Kind { KD_Numeric, KD_Text, KD_DateTime, /// An unspecified type, otherwise known as "any" in some contexts. KindInvalid, KindCount = KindInvalid, }; private: Kind mKind; public: BaseValue(Kind kind); virtual ~BaseValue() = default; BaseValue(const BaseValue&) = delete; BaseValue& operator=(const BaseValue&) = delete; BaseValue(BaseValue&&) = default; BaseValue& operator=(BaseValue&&) = default; Kind GetKind() const; }; class NumericValue : public BaseValue { private: double mValue; public: static bool IsInstance(const BaseValue* value); NumericValue(); std::string GetString() const; int64_t GetInt() const; double GetValue() const; void SetValue(double value); }; class TextValue : public BaseValue { private: std::string mValue; public: static bool IsInstance(const BaseValue* value); TextValue(); const std::string& GetValue() const; void SetValue(const std::string& value); }; class DateTimeValue : public BaseValue { private: std::chrono::time_point mValue; public: static bool IsInstance(const BaseValue* value); DateTimeValue(); std::string GetString() const; const std::chrono::time_point& GetValue() const; void SetValue(const std::chrono::time_point& value); };