From 7a325e1b3be04bc54941431458903022da1643ac Mon Sep 17 00:00:00 2001 From: rtk0c Date: Thu, 3 Jun 2021 10:06:55 -0700 Subject: Create template inheritance hierarchy, object value RTTI system --- core/src/Model/Workflow/Values/Basic.cpp | 117 +++++++++++++++++++++++++ core/src/Model/Workflow/Values/Basic.hpp | 67 ++++++++++++++ core/src/Model/Workflow/Values/BasicValues.cpp | 117 ------------------------- core/src/Model/Workflow/Values/BasicValues.hpp | 52 ----------- core/src/Model/Workflow/Values/Database.cpp | 88 +++++++++++++++++++ core/src/Model/Workflow/Values/Database.hpp | 51 +++++++++++ core/src/Model/Workflow/Values/fwd.hpp | 10 ++- 7 files changed, 332 insertions(+), 170 deletions(-) create mode 100644 core/src/Model/Workflow/Values/Basic.cpp create mode 100644 core/src/Model/Workflow/Values/Basic.hpp delete mode 100644 core/src/Model/Workflow/Values/BasicValues.cpp delete mode 100644 core/src/Model/Workflow/Values/BasicValues.hpp create mode 100644 core/src/Model/Workflow/Values/Database.cpp create mode 100644 core/src/Model/Workflow/Values/Database.hpp (limited to 'core/src/Model/Workflow/Values') diff --git a/core/src/Model/Workflow/Values/Basic.cpp b/core/src/Model/Workflow/Values/Basic.cpp new file mode 100644 index 0000000..d6a2395 --- /dev/null +++ b/core/src/Model/Workflow/Values/Basic.cpp @@ -0,0 +1,117 @@ +#include "Basic.hpp" + +#include +#include +#include + +bool NumericValue::IsInstance(const BaseValue* value) +{ + return value->GetKind() == KD_Numeric; +} + +NumericValue::NumericValue() + : BaseValue(BaseValue::KD_Numeric) +{ +} + +template +static std::string NumberToString(T value) +{ + char buf[kMaxSize]; + +#if PLATFORM_WIN32 + auto res = std::to_chars(buf, buf + kMaxSize, value); + if (res.ec == std::errc()) { + return std::string(buf, res.ptr); + } else { + return ""; + } +#else + // TODO libstdc++ doesn't have floating point charconv yet + return std::to_string(value); +#endif +} + +std::string NumericValue::GetTruncatedString() const +{ + constexpr auto kMaxSize = std::numeric_limits::digits10; + return ::NumberToString((int64_t)mValue); +} + +std::string NumericValue::GetRoundedString() const +{ + constexpr auto kMaxSize = std::numeric_limits::digits10; + return ::NumberToString((int64_t)std::round(mValue)); +} + +std::string NumericValue::GetString() const +{ + constexpr auto kMaxSize = std::numeric_limits::max_digits10; + return ::NumberToString(mValue); +} + +int64_t NumericValue::GetInt() const +{ + return static_cast(mValue); +} + +double NumericValue::GetValue() const +{ + return mValue; +} + +void NumericValue::SetValue(double value) +{ + mValue = value; +} + +bool TextValue::IsInstance(const BaseValue* value) +{ + return value->GetKind() == KD_Text; +} + +TextValue::TextValue() + : BaseValue(BaseValue::KD_Text) +{ +} + +const std::string& TextValue::GetValue() const +{ + return mValue; +} + +void TextValue::SetValue(const std::string& value) +{ + mValue = value; +} + +bool DateTimeValue::IsInstance(const BaseValue* value) +{ + return value->GetKind() == KD_DateTime; +} + +DateTimeValue::DateTimeValue() + : BaseValue(BaseValue::KD_DateTime) +{ +} + +std::string DateTimeValue::GetString() const +{ + namespace chrono = std::chrono; + auto t = chrono::system_clock::to_time_t(mValue); + + char data[32]; + std::strftime(data, sizeof(data), "%Y-%m-%d %H:%M:%S", std::localtime(&t)); + + return std::string(data); +} + +const std::chrono::time_point& DateTimeValue::GetValue() const +{ + return mValue; +} + +void DateTimeValue::SetValue(const std::chrono::time_point& value) +{ + mValue = value; +} diff --git a/core/src/Model/Workflow/Values/Basic.hpp b/core/src/Model/Workflow/Values/Basic.hpp new file mode 100644 index 0000000..38e0531 --- /dev/null +++ b/core/src/Model/Workflow/Values/Basic.hpp @@ -0,0 +1,67 @@ +#pragma once + +#include "Model/Workflow/Value.hpp" + +#include +#include +#include + +class NumericValue : public BaseValue +{ +private: + double mValue; + +public: + static bool IsInstance(const BaseValue* value); + NumericValue(); + + NumericValue(const NumericValue&) = delete; + NumericValue& operator=(const NumericValue&) = delete; + NumericValue(NumericValue&&) = default; + NumericValue& operator=(NumericValue&&) = default; + + std::string GetTruncatedString() const; + std::string GetRoundedString() const; + 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(); + + TextValue(const TextValue&) = delete; + TextValue& operator=(const TextValue&) = delete; + TextValue(TextValue&&) = default; + TextValue& operator=(TextValue&&) = default; + + 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(); + + DateTimeValue(const DateTimeValue&) = delete; + DateTimeValue& operator=(const DateTimeValue&) = delete; + DateTimeValue(DateTimeValue&&) = default; + DateTimeValue& operator=(DateTimeValue&&) = default; + + std::string GetString() const; + const std::chrono::time_point& GetValue() const; + void SetValue(const std::chrono::time_point& value); +}; diff --git a/core/src/Model/Workflow/Values/BasicValues.cpp b/core/src/Model/Workflow/Values/BasicValues.cpp deleted file mode 100644 index 748c652..0000000 --- a/core/src/Model/Workflow/Values/BasicValues.cpp +++ /dev/null @@ -1,117 +0,0 @@ -#include "BasicValues.hpp" - -#include -#include -#include - -bool NumericValue::IsInstance(const BaseValue* value) -{ - return value->GetKind() == KD_Numeric; -} - -NumericValue::NumericValue() - : BaseValue(BaseValue::KD_Numeric) -{ -} - -template -static std::string NumberToString(T value) -{ - char buf[kMaxSize]; - -#if PLATFORM_WIN32 - auto res = std::to_chars(buf, buf + kMaxSize, value); - if (res.ec == std::errc()) { - return std::string(buf, res.ptr); - } else { - return ""; - } -#else - // TODO libstdc++ doesn't have floating point charconv yet - return std::to_string(value); -#endif -} - -std::string NumericValue::GetTruncatedString() const -{ - constexpr auto kMaxSize = std::numeric_limits::digits10; - return ::NumberToString((int64_t)mValue); -} - -std::string NumericValue::GetRoundedString() const -{ - constexpr auto kMaxSize = std::numeric_limits::digits10; - return ::NumberToString((int64_t)std::round(mValue)); -} - -std::string NumericValue::GetString() const -{ - constexpr auto kMaxSize = std::numeric_limits::max_digits10; - return ::NumberToString(mValue); -} - -int64_t NumericValue::GetInt() const -{ - return static_cast(mValue); -} - -double NumericValue::GetValue() const -{ - return mValue; -} - -void NumericValue::SetValue(double value) -{ - mValue = value; -} - -bool TextValue::IsInstance(const BaseValue* value) -{ - return value->GetKind() == KD_Text; -} - -TextValue::TextValue() - : BaseValue(BaseValue::KD_Text) -{ -} - -const std::string& TextValue::GetValue() const -{ - return mValue; -} - -void TextValue::SetValue(const std::string& value) -{ - mValue = value; -} - -bool DateTimeValue::IsInstance(const BaseValue* value) -{ - return value->GetKind() == KD_DateTime; -} - -DateTimeValue::DateTimeValue() - : BaseValue(BaseValue::KD_DateTime) -{ -} - -std::string DateTimeValue::GetString() const -{ - namespace chrono = std::chrono; - auto t = chrono::system_clock::to_time_t(mValue); - - char data[32]; - std::strftime(data, sizeof(data), "%Y-%m-%d %H:%M:%S", std::localtime(&t)); - - return std::string(data); -} - -const std::chrono::time_point& DateTimeValue::GetValue() const -{ - return mValue; -} - -void DateTimeValue::SetValue(const std::chrono::time_point& value) -{ - mValue = value; -} diff --git a/core/src/Model/Workflow/Values/BasicValues.hpp b/core/src/Model/Workflow/Values/BasicValues.hpp deleted file mode 100644 index 795876e..0000000 --- a/core/src/Model/Workflow/Values/BasicValues.hpp +++ /dev/null @@ -1,52 +0,0 @@ -#pragma once - -#include "Model/Workflow/Value.hpp" - -#include -#include -#include - -class NumericValue : public BaseValue -{ -private: - double mValue; - -public: - static bool IsInstance(const BaseValue* value); - NumericValue(); - - std::string GetTruncatedString() const; - std::string GetRoundedString() const; - 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); -}; diff --git a/core/src/Model/Workflow/Values/Database.cpp b/core/src/Model/Workflow/Values/Database.cpp new file mode 100644 index 0000000..12d2b80 --- /dev/null +++ b/core/src/Model/Workflow/Values/Database.cpp @@ -0,0 +1,88 @@ +#include "Database.hpp" + +#include "Model/TransactionsModel.hpp" +#include "Model/Workflow/ValueInternals.hpp" + +#include + +TableKind DatabaseRowIdValue::GetTable() const +{ + return mTable; +} + +int64_t DatabaseRowIdValue::GetRowId() const +{ + return mRowId; +} + +bool DatabaseRowIdValue::IsInstance(const BaseValue* value) +{ + return value->GetKind() == KD_DatabaseRowId; +} + +DatabaseRowIdValue::DatabaseRowIdValue() + : BaseValue(KD_DatabaseRowId) + , mTable{ TableKind::Sales } + , mRowId{ std::numeric_limits::max() } +{ +} + +bool SaleDatabaseRowValue::IsInstance(const BaseValue* value) +{ + return value->GetKind() == KD_SaleDatabaseRow; +} + +SaleDatabaseRowValue::SaleDatabaseRowValue() + : BaseObjectValue(KD_SaleDatabaseRow) +{ +} + +const BaseValue* SaleDatabaseRowValue::GetProperty(int idx) const +{ + switch (idx) { + case 0: return &mCustomerName; + case 1: return &mDeadline; + case 2: return &mDeliveryTime; + default: return nullptr; + } +} + +bool SaleDatabaseRowValue::SetProperty(int idx, std::unique_ptr value) +{ + switch (idx) { + case 0: return false; + case 1: CHECK_VALUE_TYPE_AND_MOVE(DateTimeValue, mDeadline, value.get()); break; + case 2: CHECK_VALUE_TYPE_AND_MOVE(DateTimeValue, mDeliveryTime, value.get()); break; + } + return true; +} + +bool PurchaseDatabaseRowValue::IsInstance(const BaseValue* value) +{ + return value->GetKind() == KD_PurchaseDatabaseRow; +} + +PurchaseDatabaseRowValue::PurchaseDatabaseRowValue() + : BaseObjectValue(KD_PurchaseDatabaseRow) +{ +} + +const BaseValue* PurchaseDatabaseRowValue::GetProperty(int idx) const +{ + switch (idx) { + case 0: return &mFactoryName; + case 1: return &mOrderTime; + case 2: return &mDeliveryTime; + default: return nullptr; + } +} + +bool PurchaseDatabaseRowValue::SetProperty(int idx, std::unique_ptr value) +{ + switch (idx) { + case 0: return false; + case 1: CHECK_VALUE_TYPE_AND_MOVE(DateTimeValue, mOrderTime, value.get()); break; + case 2: CHECK_VALUE_TYPE_AND_MOVE(DateTimeValue, mDeliveryTime, value.get()); break; + } + return true; +} diff --git a/core/src/Model/Workflow/Values/Database.hpp b/core/src/Model/Workflow/Values/Database.hpp new file mode 100644 index 0000000..e8a4f83 --- /dev/null +++ b/core/src/Model/Workflow/Values/Database.hpp @@ -0,0 +1,51 @@ +#pragma once + +#include "Model/Workflow/Value.hpp" +#include "Model/Workflow/Values/Basic.hpp" +#include "cplt_fwd.hpp" + +class DatabaseRowIdValue : public BaseValue +{ +private: + TableKind mTable; + int64_t mRowId; + +public: + static bool IsInstance(const BaseValue* value); + DatabaseRowIdValue(); + + TableKind GetTable() const; + int64_t GetRowId() const; +}; + +class SaleDatabaseRowValue : public BaseObjectValue +{ +private: + int mCustomerId; + TextValue mCustomerName; + DateTimeValue mDeadline; + DateTimeValue mDeliveryTime; + +public: + static bool IsInstance(const BaseValue* value); + SaleDatabaseRowValue(); + + virtual const BaseValue* GetProperty(int idx) const; + virtual bool SetProperty(int idx, std::unique_ptr value); +}; + +class PurchaseDatabaseRowValue : public BaseObjectValue +{ +private: + int mFactoryId; + TextValue mFactoryName; + DateTimeValue mOrderTime; + DateTimeValue mDeliveryTime; + +public: + static bool IsInstance(const BaseValue* value); + PurchaseDatabaseRowValue(); + + virtual const BaseValue* GetProperty(int idx) const; + virtual bool SetProperty(int idx, std::unique_ptr value); +}; diff --git a/core/src/Model/Workflow/Values/fwd.hpp b/core/src/Model/Workflow/Values/fwd.hpp index 24f8119..de26226 100644 --- a/core/src/Model/Workflow/Values/fwd.hpp +++ b/core/src/Model/Workflow/Values/fwd.hpp @@ -1,6 +1,14 @@ #pragma once -// BasicValues.hpp +// Basic.hpp class NumericValue; class TextValue; class DateTimeValue; + +// Database.hpp +class DatabaseRowIdValue; +class SaleDatabaseRowValue; +class PurchaseDatabaseRowValue; + +// List.hpp +class ListValue; -- cgit v1.2.3-70-g09d2