#pragma once #include #include #include class BaseValue { public: enum Type { NumericType, TextType, DateTimeType, /// An unspecified type, otherwise known as "any" in some contexts. InvalidType, TypeCount = InvalidType, }; private: Type mType; public: BaseValue(Type type); virtual ~BaseValue() = default; BaseValue(const BaseValue&) = delete; BaseValue& operator=(const BaseValue&) = delete; BaseValue(BaseValue&&) = default; BaseValue& operator=(BaseValue&&) = default; Type GetType() const; }; class NumericValue : public BaseValue { private: double mValue; public: NumericValue(); int64_t GetInt() const; double GetValue() const; void SetValue(double value); }; class TextValue : public BaseValue { private: std::string mValue; public: TextValue(); const std::string& GetValue() const; void SetValue(const std::string& value); }; class DateTimeValue : public BaseValue { private: std::chrono::time_point mValue; public: DateTimeValue(); const std::chrono::time_point& GetValue() const; void SetValue(const std::chrono::time_point& value); };