#pragma once #include "cplt_fwd.hpp" #include "Utils/Color.hpp" #include #include #include class BaseValue { public: enum Kind { KD_Numeric, KD_Text, KD_DateTime, KD_DatabaseRowId, KD_List, KD_BaseObject, KD_SaleDatabaseRow, KD_PurchaseDatabaseRow, KD_BaseObjectLast = KD_PurchaseDatabaseRow, /// An unspecified type, otherwise known as "any" in some contexts. InvalidKind, KindCount = InvalidKind, }; struct KindInfo { ImGui::IconType PinIcon; RgbaColor PinColor; }; private: Kind mKind; public: static const KindInfo& QueryInfo(Kind kind); static const char* Format(Kind kind); static std::unique_ptr CreateByKind(Kind kind); static bool IsInstance(const BaseValue* value); 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; // TODO get constant editor /// The functions \c ReadFrom, \c WriteTo will only be valid to call if this function returns true. virtual bool SupportsConstant() const; virtual void ReadFrom(std::istream& stream); virtual void WriteTo(std::ostream& stream); }; class BaseObjectDescription { public: struct Property { std::string Name; BaseValue::Kind Kind; bool Mutatable = true; }; public: std::vector Properties; }; class BaseObjectValue : public BaseValue { public: /// \param kind A value kind enum, within the range of KD_BaseObject and KD_BaseObjectLast (both inclusive). static const BaseObjectDescription& QueryObjectInfo(Kind kind); static bool IsInstance(const BaseValue* value); BaseObjectValue(Kind kind); const BaseObjectDescription& GetObjectDescription() const; virtual const BaseValue* GetProperty(int idx) const = 0; virtual bool SetProperty(int idx, std::unique_ptr value) = 0; };