ActiveLib
Loading...
Searching...
No Matches
ValueSetting.h
1
6#ifndef ACTIVE_SETTING_VALUE_SETTING
7#define ACTIVE_SETTING_VALUE_SETTING
8
9#include "Active/Container/Vector.h"
10#include "Active/Setting/Setting.h"
11#include "Active/Setting/Values/Value.h"
12#include "Active/Setting/Values/ValueBase.h"
13
14#include <set>
15
16namespace active::setting {
17
19 class ValueSetting : public setting::Setting, public container::Vector<Value> {
20 public:
21
22 // MARK: - Types
23
24 //The base class of this setting
27 using Unique = std::unique_ptr<ValueSetting>;
29 using Shared = std::shared_ptr<ValueSetting>;
31 using Option = std::optional<ValueSetting>;
32
33 // MARK: - Constructors
34
43 explicit ValueSetting(const utility::NameID& nameID) : Setting{nameID} {}
50 ValueSetting(const Value& value, size_t rows = 1, size_t cols = 1);
56 ValueSetting(Value&& value, const utility::NameID::Option nameID = std::nullopt);
62 template<typename T>
63 ValueSetting(const std::vector<T>& values, const utility::NameID::Option nameID = std::nullopt) :
64 setting::Setting(nameID) {
65 for (auto& value: values)
67 }
73 template<typename T>
74 ValueSetting(const std::set<T>& values, const utility::NameID::Option nameID = std::nullopt) :
75 setting::Setting(nameID) {
76 for (auto& value: values)
78 }
84 explicit ValueSetting(bool val, const utility::NameID::Option nameID = std::nullopt);
90 explicit ValueSetting(int32_t val, const utility::NameID::Option nameID = std::nullopt);
96 explicit ValueSetting(uint32_t val, const utility::NameID::Option nameID = std::nullopt);
102 explicit ValueSetting(int64_t val, const utility::NameID::Option nameID = std::nullopt);
108 explicit ValueSetting(double val, const utility::NameID::Option nameID = std::nullopt);
114 explicit ValueSetting(const utility::Guid& val, const utility::NameID::Option nameID = std::nullopt);
120 explicit ValueSetting(const utility::String& val, const utility::NameID::Option nameID = std::nullopt);
126 explicit ValueSetting(const utility::Time& val, const utility::NameID::Option nameID = std::nullopt);
127
129 ValueSetting(const ValueSetting& source) = default;
131 ValueSetting(ValueSetting&& source) noexcept;
132
136 virtual ~ValueSetting() = default;
137
142 virtual ValueSetting* clonePtr() const override { return new ValueSetting(*this); }
143
144 // MARK: - Operators (const)
145
152 const Value& operator()(size_t row = 0, size_t col = 0) const { return *(*this)[getValueIndex(row, col)]; }
158 virtual bool operator==(const Setting& ref) const override;
164 virtual bool operator<(const Setting& ref) const override;
165
166 // MARK: - Operators (mutating)
167
174 Value& operator()(size_t row = 0, size_t col = 0) { return *(*this)[getValueIndex(row, col)]; }
180 virtual Setting& operator=(const Setting& source) override;
181 ValueSetting& operator=(ValueSetting&& source) = default;
182
183 // MARK: - Conversion operators
184
189 operator bool() const { return getValue<bool>(); }
194 operator int32_t() const { return getValue<int32_t>(); }
199 operator uint32_t() const { return getValue<uint32_t>(); }
204 operator int64_t() const { return getValue<int64_t>(); }
209 operator double() const { return getValue<double>(); }
214 operator active::utility::String() const { return getValue<utility::String>(); }
219 operator active::utility::Guid() const { return getValue<utility::Guid>(); }
224 operator active::utility::Time() const { return getValue<utility::Time>(); }
225
230 template<typename T>
231 operator std::vector<T>() const {
232 std::vector<T> result;
233 for (const auto& value : *this)
234 result.push_back(*value);
235 return result;
236 }
237
238 // MARK: - Functions (const)
239
244 std::optional<Value::Type> getDefaultType() const { return m_type; }
249 size_t getColumnSize() const { return m_columns; }
250
252 bool empty() const override { return base::empty(); }
259 bool isGood(size_t row = 0, size_t col = 0) const { return (*this)[getValueIndex(row, col)]->isGood(); }
266 Value::Status status(size_t row = 0, size_t col = 0) const { return (*this)[getValueIndex(row, col)]->status; }
271 bool boolVal(size_t row = 0, size_t col = 0) const { return getValue<bool>(row, col); }
276 int32_t int32Val(size_t row = 0, size_t col = 0) const { return getValue<int32_t>(row, col); }
281 uint32_t uint32Val(size_t row = 0, size_t col = 0) const { return getValue<uint32_t>(row, col); }
286 int64_t int64Val(size_t row = 0, size_t col = 0) const { return getValue<int64_t>(row, col); }
291 double doubleVal(size_t row = 0, size_t col = 0) const { return getValue<double>(row, col); }
296 active::utility::String stringVal(size_t row = 0, size_t col = 0) const { return getValue<utility::String>(row, col); }
301 active::utility::Guid guidVal(size_t row = 0, size_t col = 0) const { return getValue<utility::Guid>(row, col); }
306 active::utility::Time timeVal(size_t row = 0, size_t col = 0) const { return getValue<utility::Time>(row, col); }
307
308 // MARK: - Functions (mutating)
309
314 void setDefaultType(std::optional<Value::Type> type = std::nullopt) { m_type = type; }
319 void setColumnSize(size_t size) { m_columns = std::max(base::size(), std::min(size_t(1), size)); }
320
324 void clear() override { base::clear(); }
328 void setDefault() override;
329
330 protected:
332 size_t getValueIndex(size_t row = 0, size_t col = 0) const {
333 auto result = row * m_columns + col;
334 if (result >= base::size())
335 throw std::out_of_range("");
336 return result;
337 }
339 template<typename T>
340 T getValue(size_t row = 0, size_t col = 0) const {
341 return *(*this)[getValueIndex(row, col)];
342 }
343
344 private:
346 std::optional<Value::Type> m_type;
348 size_t m_columns = 1;
349 };
350
351}
352
353#endif //ACTIVE_SETTING_VALUE_SETTING
Definition Vector.h:26
void emplace_back(Value &&item)
Definition Vector.h:109
Base class for an identified setting for interprocess communication.
Definition Setting.h:15
Definition ValueBase.h:21
Definition Value.h:31
Status
The value status (defines whether a value has been explicitly set and (if so) if it's meaningful.
Definition Value.h:44
Setting containing any number of values, e.g. bool, string etc.
Definition ValueSetting.h:19
bool isGood(size_t row=0, size_t col=0) const
Definition ValueSetting.h:259
virtual Setting & operator=(const Setting &source) override
Definition ValueSetting.cpp:192
Value & operator()(size_t row=0, size_t col=0)
Definition ValueSetting.h:174
ValueSetting(const std::vector< T > &values, const utility::NameID::Option nameID=std::nullopt)
Definition ValueSetting.h:63
std::optional< Value::Type > getDefaultType() const
Definition ValueSetting.h:244
size_t getColumnSize() const
Definition ValueSetting.h:249
bool empty() const override
True if the setting is empty.
Definition ValueSetting.h:252
std::optional< ValueSetting > Option
Optional.
Definition ValueSetting.h:31
const Value & operator()(size_t row=0, size_t col=0) const
Definition ValueSetting.h:152
active::utility::String stringVal(size_t row=0, size_t col=0) const
Definition ValueSetting.h:296
virtual ~ValueSetting()=default
Value::Status status(size_t row=0, size_t col=0) const
Definition ValueSetting.h:266
size_t getValueIndex(size_t row=0, size_t col=0) const
Get the index of a value at a specified row/column (NB: index must be in range or an exception will b...
Definition ValueSetting.h:332
ValueSetting()
Definition ValueSetting.h:38
bool boolVal(size_t row=0, size_t col=0) const
Definition ValueSetting.h:271
std::unique_ptr< ValueSetting > Unique
Unique pointer.
Definition ValueSetting.h:27
ValueSetting(const utility::NameID &nameID)
Definition ValueSetting.h:43
T getValue(size_t row=0, size_t col=0) const
Get the value at a specified row/column (NB: index must be in range or an exception will be thrown)
Definition ValueSetting.h:340
void setDefault() override
Definition ValueSetting.cpp:205
virtual bool operator==(const Setting &ref) const override
Definition ValueSetting.cpp:148
active::utility::Guid guidVal(size_t row=0, size_t col=0) const
Definition ValueSetting.h:301
void setColumnSize(size_t size)
Definition ValueSetting.h:319
active::utility::Time timeVal(size_t row=0, size_t col=0) const
Definition ValueSetting.h:306
ValueSetting(const std::set< T > &values, const utility::NameID::Option nameID=std::nullopt)
Definition ValueSetting.h:74
ValueSetting(const ValueSetting &source)=default
Use default copy constructor.
int64_t int64Val(size_t row=0, size_t col=0) const
Definition ValueSetting.h:286
virtual bool operator<(const Setting &ref) const override
Definition ValueSetting.cpp:170
void clear() override
Definition ValueSetting.h:324
void setDefaultType(std::optional< Value::Type > type=std::nullopt)
Definition ValueSetting.h:314
uint32_t uint32Val(size_t row=0, size_t col=0) const
Definition ValueSetting.h:281
std::shared_ptr< ValueSetting > Shared
Shared pointer.
Definition ValueSetting.h:29
double doubleVal(size_t row=0, size_t col=0) const
Definition ValueSetting.h:291
int32_t int32Val(size_t row=0, size_t col=0) const
Definition ValueSetting.h:276
virtual ValueSetting * clonePtr() const override
Definition ValueSetting.h:142
Definition Guid.h:16
Definition NameID.h:21
std::optional< NameID > Option
Optional.
Definition NameID.h:27
A Unicode-aware string class.
Definition String.h:51
A class to represent a date/time.
Definition Time.h:19
Definition Transportable.h:13