9#include "debugprint.hpp"
11#include "starcoord.hpp"
12#include "quantity.hpp"
20 using Type = uint32_t;
21 static constexpr Type type_invalid = 0;
22 static constexpr Type type_integer = 1;
23 static constexpr Type type_double = 2;
24 static constexpr Type type_string = 3;
25 static constexpr Type type_bool = 4;
26 static constexpr Type type_id = 5;
27 static constexpr Type type_starcoord = 6;
28 static constexpr Type type_quantity = 7;
29 static constexpr Type type_vector_integer = 8;
30 static constexpr Type type_vector_double = 9;
31 static constexpr Type type_vector_string = 10;
32 static constexpr Type type_vector_bool = 11;
33 static constexpr Type type_vector_id = 12;
34 static constexpr Type type_vector_starcoord = 13;
35 static constexpr Type type_vector_quantity = 14;
37 using vector_integer = std::vector<int64_t>;
38 using vector_double = std::vector<double>;
39 using vector_bool = std::vector<bool>;
40 using vector_id = std::vector<ObjectId>;
41 using vector_string = std::vector<std::string>;
42 using vector_starcoord = std::vector<StarCoord>;
43 using vector_quantity = std::vector<Quantity>;
45 using DataItemMetadata = std::pair<Type, bool>;
46 using DataItemVariant = std::variant<std::monostate,
67 static void registerDataItem(
const std::string &dataItem, Type dataType,
bool clientWritable) {
68 if ( _dataitems_library.find( dataItem ) != _dataitems_library.end() )
69 DebugPrint() <<
"overwriting dataItem '" << dataItem <<
"' because it's already registered! (only LAST one will be registered...)";
70 _dataitems_library[ dataItem ] = DataItemMetadata(dataType, clientWritable);
79 auto library_find = _dataitems_library.find(dataItem);
80 if (library_find != _dataitems_library.end())
81 return library_find->second;
82 return DataItemMetadata(type_invalid,
false);
98 : _name( other._name )
99 , _item( other._item ) {}
109 if (metadata.first != type_invalid) {
110 switch ( metadata.first ) {
111 case type_integer: _item.emplace<int64_t>();
break;
112 case type_double: _item.emplace<
double>();
break;
113 case type_string: _item.emplace<std::string>();
break;
114 case type_bool: _item.emplace<
bool>();
break;
115 case type_id: _item.emplace<
ObjectId>();
break;
116 case type_starcoord: _item.emplace<
StarCoord>();
break;
117 case type_quantity: _item.emplace<
Quantity>();
break;
118 case type_vector_integer: _item.emplace<vector_integer>();
break;
119 case type_vector_double: _item.emplace<vector_double>();
break;
120 case type_vector_string: _item.emplace<vector_string>();
break;
121 case type_vector_bool: _item.emplace<vector_bool>();
break;
122 case type_vector_id: _item.emplace<vector_id>();
break;
123 case type_vector_starcoord: _item.emplace<vector_starcoord>();
break;
124 case type_vector_quantity: _item.emplace<vector_quantity>();
break;
126 DebugPrint() <<
"unable to create DataItem (" <<
name <<
"): type is invalid??";
130 DebugPrint() <<
"unregistered DataItem: '" <<
name <<
"', dataItem not created.";
138 return !std::holds_alternative<std::monostate>(_item);
145 const std::string&
name()
const {
150 return _item.index();
161 template <
typename T,
162 typename = std::enable_if_t<!std::is_same_v<std::decay_t<T>,
DataItem> &&
163 !std::is_same_v<std::decay_t<T>, nlohmann::json>
166 std::get<std::decay_t<T>>(_item) = std::forward<T>(value);
174 template <
typename T>
176 return std::get<std::decay_t<T>>(_item);
183 template <
typename T>
184 operator const T&()
const {
185 return std::get<std::decay_t<T>>(_item);
192 template <
typename T>
194 return std::get<std::decay_t<T>>(_item);
201 template <
typename T>
202 const T&
as()
const {
203 return std::get<std::decay_t<T>>(_item);
211 template <
typename T,
212 typename = std::enable_if_t<!std::is_same_v<std::decay_t<T>,
DataItem> &&
213 !std::is_same_v<std::decay_t<T>, nlohmann::json>
216 if (
auto* ptr = std::get_if<std::decay_t<T>>(&_item))
217 return *ptr == value;
226 template <
typename T,
227 typename = std::enable_if_t<!std::is_same_v<std::decay_t<T>,
DataItem> &&
228 !std::is_same_v<std::decay_t<T>, nlohmann::json>
231 if (
auto* ptr = std::get_if<std::decay_t<T>>(&_item))
232 return *ptr != value;
237 return _item != other._item;
241 return _item == other._item;
249 template <
typename T>
251 T* ret = std::get_if<std::decay_t<T>>(&_item);
252 if ( ret ==
nullptr )
253 DebugPrint() <<
"DataItem->access: '" << _name <<
"' type mismatch!";
258 size_t i = _item.index();
259 if ( i == other._item.index() ) {
261 case type_integer: std::get<type_integer>(_item) += std::get<type_integer>(other._item);
break;
262 case type_double: std::get<type_double>(_item) += std::get<type_double>(other._item);
break;
263 case type_quantity: std::get<type_quantity>(_item) += std::get<type_quantity>(other._item);
break;
264 default:
DebugPrint() <<
"DataItem '" << _name <<
"' += '" << other._name <<
"' types are not compatible!";
268 DebugPrint() <<
"DataItem '" << _name <<
"' += '" << other._name <<
"' type mismatch!";
272 template <
typename T,
273 typename = std::enable_if_t<!std::is_same_v<std::decay_t<T>,
DataItem> &&
274 !std::is_same_v<std::decay_t<T>, nlohmann::json>
276 DataItem& operator+=(
const T& value ) {
277 std::get<std::decay_t<T>>(_item) += value;
288 switch ( _item.index() )
291 _item = JSON.get<int64_t>();
294 _item = JSON.get<
double>();
297 _item = JSON.get<std::string>();
300 _item = JSON.is_boolean() ? JSON.get<
bool>() : JSON != 0;
311 case type_vector_integer:
312 _item = JSON.get<vector_integer>();
314 case type_vector_double:
315 _item = JSON.get<vector_double>();
317 case type_vector_string:
318 _item = JSON.get<vector_string>();
320 case type_vector_bool:
321 _item = JSON.get<vector_bool>();
324 _item = JSON.get<vector_id>();
326 case type_vector_starcoord:
327 _item = JSON.get<vector_starcoord>();
329 case type_vector_quantity:
330 _item = JSON.get<vector_quantity>();
333 DebugPrint() <<
"error creating DataItem from JSON (" << _name <<
"). Type is invalid??";
348 inline static std::unordered_map<std::string, DataItemMetadata> _dataitems_library;
351 DataItemVariant _item;
Definition dataitem.hpp:18
bool operator==(const T &value) const
for usage like if ( DataItem == 5 )
Definition dataitem.hpp:215
static DataItemMetadata getDataItemMetadata(const std::string &dataItem)
Return data item type (if exist)
Definition dataitem.hpp:78
T & as()
for usage like double DataItem.as<std::vector<int64_t>>().push_back( ... )
Definition dataitem.hpp:193
DataItem(const DataItem &other)
Copy constructor.
Definition dataitem.hpp:97
DataItemVariant & raw()
get the raw std::variant inside
Definition dataitem.hpp:342
const std::string & name() const
return name of dataitem
Definition dataitem.hpp:145
DataItem()
Create an invalid DataItem.
Definition dataitem.hpp:89
DataItem(const std::string &name)
Initialize a DataItem, it requires the name of the DataItem to match the metadata.
Definition dataitem.hpp:105
const T & as() const
for usage like double DataItem.as<std::vector<int64_t>>().push_back( ... )
Definition dataitem.hpp:202
bool isValid() const
return true if the data item contains a valid type&value
Definition dataitem.hpp:137
bool operator!=(const T &value) const
for usage like if ( DataItem != 5 )
Definition dataitem.hpp:230
static void registerDataItem(const std::string &dataItem, Type dataType, bool clientWritable)
Globally add valid dataItems (With type) to the dataItems library.
Definition dataitem.hpp:67
DataItem & operator=(T &&value)
for usage like DataItem x = 5
Definition dataitem.hpp:165
T * accessPtr()
get a pointer to the data
Definition dataitem.hpp:250
DataItem & operator=(const nlohmann::json &JSON)
set data item value from JSON
Definition dataitem.hpp:286
Definition debugprint.hpp:10
Definition quantity.hpp:9
Definition starcoord.hpp:16