28 #include <unordered_map>
42 const auto id = std::type_index{
typeid(obj)};
43 const auto it = getInstance().serializers.find(
id);
44 if (it == getInstance().serializers.end())
46 it->second->deserialize(obj, el);
50 const auto id = std::type_index{
typeid(obj)};
51 const auto it = getInstance().serializers.find(
id);
52 if (it == getInstance().serializers.end())
54 return it->second->serialize(obj, el);
58 getInstance().serializers.emplace(
typeid(T), std::make_unique<serializerImpl<T>>());
62 static Serializer& getInstance();
65 virtual ~serializer() {}
66 virtual void deserialize(Object &obj, xml::Element &el) = 0;
67 virtual xml::Element serialize(
const Object &obj, xml::Element &parent) = 0;
69 template<
typename T>
struct serializerImpl:
public serializer
71 virtual void deserialize(Object &obj, xml::Element &el)
override
75 virtual xml::Element serialize(
const Object &obj, xml::Element &parent)
override
77 return static_cast<const T&
>(obj).
Serialize(parent);
80 std::unordered_map<std::type_index, std::unique_ptr<serializer>> serializers;
88 const auto id = std::type_index{
typeid(obj)};
89 const auto it = getInstance().cloners.find(
id);
90 if (it == getInstance().cloners.end())
92 return it->second->clone(obj);
96 getInstance().cloners.emplace(
typeid(T), std::make_unique<clonerImpl<T>>());
101 auto s = std::string{};
102 for (
const auto &c : getInstance().cloners)
111 static Cloner& getInstance();
115 virtual UObject clone(
const Object &o)
const = 0;
117 template<
typename T>
struct clonerImpl:
public cloner
119 virtual UObject clone(
const Object &o)
const override {
return std::make_unique<T>(
static_cast<const T&
>(o)); }
121 std::unordered_map<std::type_index, std::unique_ptr<cloner>> cloners;
129 const auto id1 = std::type_index{
typeid(o1)};
130 const auto id2 = std::type_index{
typeid(o2)};
132 throw ExceptionDomain{
"Cannot compute distance between objects of different classes."};
133 const auto it = getInstance().rulers.find(id1);
134 if (it == getInstance().rulers.end())
136 return it->second->distance(o1, o2);
140 getInstance().rulers.emplace(
typeid(T), std::make_unique<rulerImpl<T>>());
144 static Ruler& getInstance();
148 virtual double distance(
const Object &o1,
const Object &o2)
const = 0;
150 template<
typename T>
struct rulerImpl:
public ruler
152 virtual double distance(
const Object &o1,
const Object &o2)
const override {
return Distance(static_cast<const T&>(o1), static_cast<const T&>(o2)); }
154 std::unordered_map<std::type_index, std::unique_ptr<ruler>> rulers;
static xml::Element Serialize(const Object &obj, xml::Element &el)
static void Deserialize(Object &obj, xml::Element &el)
A protocol is not implemented.
static std::string GetClasses()
static UObject Clone(const Object &obj)
static double ComputeDistance(const Object &o1, const Object &o2)
double Distance(const Int &i1, const Int &i2) noexcept
A character string class.