8 #ifndef JXXON_Json_INCLUDED 9 #define JXXON_Json_INCLUDED 20 template<
typename T,
typename Enable =
void>
23 template<
typename T,
typename Enable =
void>
26 template<
typename T,
typename Enable =
void>
27 class GetArrayElements;
29 template<
typename T,
typename Enable =
void>
30 class SetArrayElements;
32 template<
typename T,
typename Enable =
void>
35 template<
typename T,
typename Enable =
void>
76 virtual Json toJson()
const = 0;
93 virtual void addElement(
const T& element) = 0;
96 virtual void forEach(
const std::function<
void(
const T& element)>& f)
const = 0;
101 template<
typename T,
template<
typename,
typename...>
class Base,
typename... Args>
111 explicit Array(
typename Base<T, Args...>::size_type n) : Base<T, Args...>(n)
116 Array(
typename Base<T, Args...>::size_type n,
const T& value) : Base<T, Args...>(n, value)
121 template<
typename InputIterator>
122 Array(InputIterator first, InputIterator last) : Base<T, Args...>(first, last)
137 Array(std::initializer_list<T> initializerList) : Base<T, Args...>(initializerList)
142 Array(
const typename Base<T, Args...>::DelegateType& other) : Base<T, Args...>(other)
147 Array(
typename Base<T, Args...>::DelegateType&& other) : Base<T, Args...>(std::move(other))
155 Accessor::GetArrayElements<T>
get(json);
167 return static_cast<Array&
>(Base<T, Args...>::operator=(other));
173 return static_cast<Array&
>(Base<T, Args...>::operator=(std::move(other)));
179 return static_cast<Array&
>(Base<T, Args...>::operator=(initializerList));
185 return static_cast<Array&
>(Base<T, Args...>::operator=(other));
191 return static_cast<Array&
>(Base<T, Args...>::operator=(std::move(other)));
197 Accessor::SetArrayElements<T>
set(json);
214 virtual void addElement(
const std::string& key,
const T& value) = 0;
217 virtual void forEach(
const std::function<
void(
const std::string& key,
const T& value)>& f)
const = 0;
222 template<
typename T,
template<
typename,
typename...>
class Base,
typename... Args>
232 template<
typename InputIterator>
233 Map(InputIterator first, InputIterator last) : Base<T, Args...>(first, last)
238 Map(
const Map& other) : Base<T, Args...>(other)
243 Map(
Map&& other) : Base<T, Args...>(std::move(other))
248 Map(std::initializer_list<std::pair<const std::string, T>> initializerList) : Base<T, Args...>(initializerList)
253 Map(
const typename Base<T, Args...>::DelegateType& other) : Base<T, Args...>(other)
258 Map(
typename Base<T, Args...>::DelegateType&& other) : Base<T, Args...>(std::move(other))
266 Accessor::GetMapElements<T>
get(json);
278 return static_cast<Map&
>(Base<T, Args...>::operator=(other));
284 return static_cast<Map&
>(Base<T, Args...>::operator=(std::move(other)));
288 Map&
operator=(std::initializer_list<std::pair<const std::string, T>> initializerList)
290 return static_cast<Map&
>(Base<T, Args...>::operator=(initializerList));
296 return static_cast<Map&
>(Base<T, Args...>::operator=(other));
302 return static_cast<Map&
>(Base<T, Args...>::operator=(std::move(other)));
308 Accessor::SetMapElements<T>
set(json);
318 Json& operator=(
const Json& other) =
delete;
324 Json(
const std::string& document);
335 std::string toString()
const;
339 T
get(
const std::string& name)
const 341 return Accessor::GetProperty<T>(*
this, name)();
346 void set(
const std::string& name,
const T& value)
348 Accessor::SetProperty<T>(*
this, name)(value);
351 template<
typename T,
typename Enable>
352 friend class Accessor::GetProperty;
354 template<
typename T,
typename Enable>
355 friend class Accessor::SetProperty;
357 template<
typename T,
typename Enable>
358 friend class Accessor::GetArrayElements;
360 template<
typename T,
typename Enable>
361 friend class Accessor::SetArrayElements;
363 template<
typename T,
typename Enable>
364 friend class Accessor::GetMapElements;
366 template<
typename T,
typename Enable>
367 friend class Accessor::SetMapElements;
370 friend std::istream& operator>>(std::istream& in,
Json& json);
373 friend std::ostream& operator<<(std::ostream& out,
const Json& json);
377 std::unique_ptr<Impl> pimpl;
379 Json(std::unique_ptr<Impl>&& pimpl);
381 void setTypeObject();
382 Json getChild(
const std::string& name)
const;
383 void setChild(
const std::string& name,
const Json& child);
385 void append(
const Json& element);
386 void append(
const std::function<
void(
const Json& element)>& append)
const;
387 void insert(
const std::string& key,
const Json& element);
388 void insert(
const std::function<
void(
const std::string& key,
const Json& element)>& insert)
const;
394 class GetProperty<T, typename std::enable_if<std::is_base_of<Json::Serializable, T>::value>::type>
397 GetProperty(
const Json& json,
const std::string& name) : json(json), name(name)
403 auto child(json.getChild(name));
404 return child.
isNull() ? T() : T(child);
409 const std::string& name;
413 class GetProperty<T, typename std::enable_if<std::is_convertible<T, std::shared_ptr<Json::Serializable>>::value>::type>
416 GetProperty(
const Json& json,
const std::string& name) : json(json), name(name)
422 auto child(json.getChild(name));
423 return child.isNull() ? T() : std::make_shared<typename T::element_type>(child);
428 const std::string& name;
432 class SetProperty<T, typename std::enable_if<std::is_base_of<Json::Serializable, T>::value>::type>
435 SetProperty(
Json& json,
const std::string& name) : json(json), name(name)
437 json.setTypeObject();
440 void operator()(
const T& value)
442 json.setChild(name, value.toJson());
447 const std::string& name;
451 class SetProperty<T, typename std::enable_if<std::is_convertible<T, std::shared_ptr<Json::Serializable>>::value>::type>
454 SetProperty(
Json& json,
const std::string& name) : json(json), name(name)
456 json.setTypeObject();
459 void operator()(
const T& value)
462 json.setChild(name, value->toJson());
468 const std::string& name;
474 typename std::enable_if<
475 !std::is_base_of<Json::Serializable, T>::value &&
476 !std::is_convertible<T, std::shared_ptr<Json::Serializable>>::value>::type>
479 GetProperty(
const Json& json,
const std::string& name);
480 T operator()()
const;
484 const std::string& name;
490 typename std::enable_if<
491 !std::is_base_of<Json::Serializable, T>::value &&
492 !std::is_convertible<T, std::shared_ptr<Json::Serializable>>::value>::type>
495 SetProperty(
Json& json,
const std::string& name);
496 void operator()(
const T& value);
500 const std::string& name;
504 class GetArrayElements<T, typename std::enable_if<std::is_base_of<Json::Serializable, T>::value>::type>
507 GetArrayElements(
const Json& json) : json(json)
513 json.append([&array](
const Json& element) { array.
addElement(element.
isNull() ? T() : T(element)); });
521 class GetArrayElements<T, typename std::enable_if<std::is_convertible<T, std::shared_ptr<Json::Serializable>>::value>::type>
524 GetArrayElements(
const Json& json) : json(json)
530 json.append([&array](
const Json& element) {
531 array.
addElement(element.
isNull() ? T() : std::make_shared<typename T::element_type>(element));
540 class SetArrayElements<T, typename std::enable_if<std::is_base_of<Json::Serializable, T>::value>::type>
543 SetArrayElements(
Json& json) : json(json)
550 array.
forEach([&](
const T& element) { json.append(element.toJson()); });
558 class SetArrayElements<T, typename std::enable_if<std::is_convertible<T, std::shared_ptr<Json::Serializable>>::value>::type>
561 SetArrayElements(
Json& json) : json(json)
568 array.
forEach([&](
const T& element) { json.append(element ? element->toJson() :
Json()); });
576 class GetArrayElements<
578 typename std::enable_if<
579 !std::is_base_of<Json::Serializable, T>::value &&
580 !std::is_convertible<T, std::shared_ptr<Json::Serializable>>::value>::type>
583 GetArrayElements(
const Json& json);
591 class SetArrayElements<
593 typename std::enable_if<
594 !std::is_base_of<Json::Serializable, T>::value &&
595 !std::is_convertible<T, std::shared_ptr<Json::Serializable>>::value>::type>
598 SetArrayElements(
Json& json);
606 class GetMapElements<T, typename std::enable_if<std::is_base_of<Json::Serializable, T>::value>::type>
609 GetMapElements(
const Json& json) : json(json)
616 [&map](
const std::string& key,
const Json& element) { map.
addElement(key, element.
isNull() ? T() : T(element)); });
624 class GetMapElements<T, typename std::enable_if<std::is_convertible<T, std::shared_ptr<Json::Serializable>>::value>::type>
627 GetMapElements(
const Json& json) : json(json)
633 json.insert([&map](
const std::string& key,
const Json& element) {
634 map.
addElement(key, element.
isNull() ? T() : std::make_shared<typename T::element_type>(element));
643 class SetMapElements<T, typename std::enable_if<std::is_base_of<Json::Serializable, T>::value>::type>
646 SetMapElements(
Json& json) : json(json)
648 json.setTypeObject();
653 map.
forEach([&](
const std::string& key,
const T& value) { json.insert(key, value.toJson()); });
661 class SetMapElements<T, typename std::enable_if<std::is_convertible<T, std::shared_ptr<Json::Serializable>>::value>::type>
664 SetMapElements(
Json& json) : json(json)
666 json.setTypeObject();
671 map.
forEach([&](
const std::string& key,
const T& value) { json.insert(key, value ? value->toJson() :
Json()); });
679 class GetMapElements<
681 typename std::enable_if<
682 !std::is_base_of<Json::Serializable, T>::value &&
683 !std::is_convertible<T, std::shared_ptr<Json::Serializable>>::value>::type>
686 GetMapElements(
const Json& json);
694 class SetMapElements<
696 typename std::enable_if<
697 !std::is_base_of<Json::Serializable, T>::value &&
698 !std::is_convertible<T, std::shared_ptr<Json::Serializable>>::value>::type>
701 SetMapElements(
Json& json);
712 #endif // JXXON_Json_INCLUDED */ Array & operator=(Array &&other)
Move assign array.
Definition: Json.h:171
Map(InputIterator first, InputIterator last)
Construct map with emplace constructed elements of range [first, last).
Definition: Json.h:233
Array & operator=(const typename Base< T, Args... >::DelegateType &other)
Copy assign delegate type array.
Definition: Json.h:183
Map & operator=(Map &&other)
Move assign map.
Definition: Json.h:282
Interface implemented by JSON array type containers.
Definition: Json.h:84
Array & operator=(const Array &other)
Copy assign array.
Definition: Json.h:165
~MapType()
Virtual destructor.
Definition: Json.h:209
Array(const Array &other)
Copy construct array.
Definition: Json.h:127
Map & operator=(typename Base< T, Args... >::DelegateType &&other)
Move assign delegate type map.
Definition: Json.h:300
virtual void forEach(const std::function< void(const T &element)> &f) const =0
Iterate through array.
JXXON root namespace.
Definition: Deque.h:14
Map(Map &&other)
Move construct map.
Definition: Json.h:243
Interface implemented by (de)serializable classes. Preferrably use the type alias JXXON::Serializable...
Definition: Json.h:72
virtual void addElement(const std::string &key, const T &value)=0
Add element to map.
Map & operator=(const Map &other)
Copy assign map.
Definition: Json.h:276
virtual void addElement(const T &element)=0
Add element to array. Ordered containers like vector or list must append element at the end...
Array & operator=(typename Base< T, Args... >::DelegateType &&other)
Move assign delegate type array.
Definition: Json.h:189
Map & operator=(const typename Base< T, Args... >::DelegateType &other)
Copy assign delegate type map.
Definition: Json.h:294
~Array()
Virtual destructor.
Definition: Json.h:160
Array(typename Base< T, Args... >::DelegateType &&other)
Move construct array from delegate type.
Definition: Json.h:147
Array()
Construct empty array.
Definition: Json.h:106
Array(Array &&other)
Move construct array.
Definition: Json.h:132
Array(typename Base< T, Args... >::size_type n, const T &value)
Construct array of size n of copy of value constructed elements.
Definition: Json.h:116
Array(std::initializer_list< T > initializerList)
Initializer list constructor.
Definition: Json.h:137
Array(const Json &json)
Construct array from Json object.
Definition: Json.h:152
~ArrayType()
Virtual destructor.
Definition: Json.h:88
Array(typename Base< T, Args... >::size_type n)
Construct array of size n of default constructed elements.
Definition: Json.h:111
Array(InputIterator first, InputIterator last)
Construct array with emplace constructed elements of range [first, last).
Definition: Json.h:122
Map(const Map &other)
Copy construct map.
Definition: Json.h:238
Map(std::initializer_list< std::pair< const std::string, T >> initializerList)
Initializer list constructor.
Definition: Json.h:248
Map & operator=(std::initializer_list< std::pair< const std::string, T >> initializerList)
Initializer list assignment.
Definition: Json.h:288
virtual Json toJson() const override
Return Json object.
Definition: Json.h:194
bool isNull() const
Return true if object is representing a null value.
Map(const Json &json)
Construct map from Json object.
Definition: Json.h:263
Interface implemented by JSON map type containers.
Definition: Json.h:205
Map(typename Base< T, Args... >::DelegateType &&other)
Move construct map from delegate type.
Definition: Json.h:258
~Map()
Virtual destructor.
Definition: Json.h:271
Array(const typename Base< T, Args... >::DelegateType &other)
Copy construct array from delegate type.
Definition: Json.h:142
Map()
Construct empty map.
Definition: Json.h:227
Map(const typename Base< T, Args... >::DelegateType &other)
Copy construct map from delegate type.
Definition: Json.h:253
virtual Json toJson() const override
Return Json object.
Definition: Json.h:305
virtual void forEach(const std::function< void(const std::string &key, const T &value)> &f) const =0
Iterate through map.
Array & operator=(std::initializer_list< T > initializerList)
Initializer list assignment.
Definition: Json.h:177