ActiveLib
Loading...
Searching...
No Matches
Handler.h
1
6#ifndef ACTIVE_SERIALISE_DOC_HANDLER
7#define ACTIVE_SERIALISE_DOC_HANDLER
8
9#include "Active/Serialise/Document/Transportable.h"
10
11#include <concepts>
12#include <functional>
13#include <memory>
14
16
22 template<typename T> requires Reconstructable<T>
23 void* reconstructFunc(const Object& incoming) {
24 try {
25 return new T(incoming);
26 } catch(...) {
27 return nullptr; //Object constructors should throw an exception if incoming data isn't viable (NB: only use for unrecoverable problems)
28 }
29 }
30
37 class Handler {
38 public:
39
40 // MARK: Types
41
43 using Shared = std::shared_ptr<Handler>;
44
45 //Factory function for reconstructing instances from a serialised document object
46 using Reconstruction = std::function<void*(const Object& object)>;
47
48 // MARK: Constructors
49
54
55 // MARK: Functions (const)
56
62 template<typename T, class Obj> requires Reconstructable<T> && Typed<Obj>
63 T* reconstruct(const Obj& incoming) const {
64 if (auto maker = reconstruction.find(incoming.docType); (maker != reconstruction.end()) && (maker->second.first == &typeid(T)))
65 return reinterpret_cast<T*>(maker->second.second(incoming));
66 return nullptr;
67 } //reconstruct
68
69 // MARK: Functions (mutating)
70
75 template<typename T> requires Transportable<T>
76 void add(std::initializer_list<active::utility::String> const& tags) {
77 for (const auto& tag : tags) {
78 add<T>(tag);
79 }
80 }
81
86 template<typename T> requires Transportable<T>
87 void add(const active::utility::String& tag) {
88 reconstruction[tag] = std::make_pair( &typeid(T), reconstructFunc<T>);
89 }
90
91 private:
93 std::unordered_map<active::utility::String, std::pair<const std::type_info*, Reconstruction>> reconstruction;
94 };
95
96}
97
98#endif //ACTIVE_SERIALISE_DOC_HANDLER
Definition Handler.h:37
std::shared_ptr< Handler > Shared
Shared pointer.
Definition Handler.h:43
Handler()
Definition Handler.h:53
T * reconstruct(const Obj &incoming) const
Definition Handler.h:63
void add(const active::utility::String &tag)
Definition Handler.h:87
void add(std::initializer_list< active::utility::String > const &tags)
Definition Handler.h:76
Definition Object.h:26
A Unicode-aware string class.
Definition String.h:51
Concept for classes that can reconstruct an instance from a serialised document object.
Definition Transportable.h:31
Concept for classes that can be transported in a serialised document.
Definition Transportable.h:35
Concept for classes that specify a document type name to reconstruct objects from serialised data.
Definition Transportable.h:39
Definition Handler.h:15
void * reconstructFunc(const Object &incoming)
Definition Handler.h:23