ComSDK
 Указатель Классы Пространства имен Функции Переменные Определения типов Перечисления Элементы перечислений Друзья Группы Страницы
serializer.h
1 //===========================================================================
2 #ifndef comfrm_ifc_SerializerH
3 #define comfrm_ifc_SerializerH
4 //===========================================================================
5 // Заготовка модуля Serializer была сгенерирована специальным средством RAD разработки SA2-DE.
6 // Все права защищены. (2016)
7 //
8 // В данном файле представлен исходный текст основного заголовочного файла модуля.
9 //
10 // В данном файле представлен паттерн класса.
11 // Описание класса:
12 // Отображение, сопоставляющее строкам произвольные типы данных
13 // ======================================= //
14 // Параметры новой разработки.
15 // ======================================= //
16 // Имя комплекса: GCAD (gcd)
17 // Имя решения: GCAD_2 (gc3)
18 // Имя проекта: Default (def)
19 // Полный SID: defgc3
20 // Время создания: 13:29:19
21 // Дата создания: 2016-03-10
22 // ======================================= //
23 // ============================================================================================ //
24 // [prd]Period: 03/2016
25 // [aut]Author: Першин Антон
26 // [did]DeveloperID: ap
27 // [pid]ProblemID: 00001
28 // [rvs = did.date.pid]Revision: //#ap.2016-03-10.00001
29 // [dsc]Description: Создание файла.
30 // [ccm]CodeComment: rvs.{[s]Start | [e]End | []}{[n]New | [o]Old | [d]Develop}
31 // ============================================================================================ //
32 
33 //========================================================================
34 // ДОПОЛНИТЕЛЬНЫЕ ПОДКЛЮЧЕНИЯ (Типы и модули, необходимые для .h - файла)
35 //------------------------------------------------------------------------
36 #include "libtools.h"
37 #include "serializertools.h"
38 
39 #include <vector>
40 #include <forward_list>
41 #include <stack>
42 #include <unordered_set>
43 #include <unordered_map>
44 #include <map>
45 #include <type_traits>
46 
47 #define INIT_SERIALIZER(n) \
48  protected: \
49  const char* __internal_ClassName__() const \
50  { \
51  return #n; \
52  }
53 
54 
55 //========================================================================
56 namespace com {
57  namespace srl {
63  template < typename T >
64  struct stc_TypeName
65  {
66  static const char* get()
67  {
68  return "UNKNOWN";
69  }
70  };
71 
72  //template < typename T >
73  class MAC_DLLEXPORT Serializer
74  {
75  public:
76  Serializer(){}
77 
82  std::string getClassName()
83  {
84  return __internal_ClassName__();
85  }
86 
87  virtual bool serialize(std::ostream& o_out) const = 0;
88  virtual bool deserialize(std::ostream& o_in) = 0;
89 
90  template < class T >
91  bool serializeMember(std::ostream& o_out, const T& p_member) const;
92 
93  protected:
94  virtual const char* __internal_ClassName__() const = 0;
95  };
96 
97  template < typename T >
99  {
100  public:
101  template < class Q = T >
102  typename std::enable_if<std::is_fundamental< Q >::value>::type
103  serializeType(std::ostream& o_out, const Q& p_member, bool& o_ok)
104  {
105  o_ok = com::srl::serializeBaseType(o_out, p_member);
106  }
107 
108  template < class Q = T >
109  //typename std::enable_if<std::is_same< std::string, Q >::value>::type
110  typename std::enable_if<std::is_base_of< std::basic_string< char >, Q >::value>::type
111  serializeType(std::ostream& o_out, const Q& p_member, bool& o_ok)
112  {
113  o_ok = com::srl::serializeStdString(o_out, p_member);
114  }
115 
116  template < class Q = T >
117  typename std::enable_if<std::is_simple_stl_container< Q >::value>::type
118  serializeType(std::ostream& o_out, const Q& p_member, bool& o_ok)
119  {
120  //o_ok = com::srl::serializeSTLContainer(o_out, p_member, );
121  o_ok = serializeSimpleSTLContainer(o_out, p_member);
122  }
123 
124  template < class Q = T >
125  typename std::enable_if<std::is_std_set< Q >::value>::type
126  serializeType(std::ostream& o_out, const Q& p_member, bool& o_ok)
127  {
128  //o_ok = com::srl::serializeSTLContainer(o_out, p_member, );
129  o_ok = serializeSTLSet(o_out, p_member);
130  }
131 
132  template < class Q = T >
133  typename std::enable_if<std::is_std_map< Q >::value>::type
134  serializeType(std::ostream& o_out, const Q& p_member, bool& o_ok)
135  {
136  //o_ok = com::srl::serializeSTLContainer(o_out, p_member, );
137  o_ok = serializeSTLMap(o_out, p_member);
138  }
139 
140  template < class Q = T >
141  typename std::enable_if<std::is_std_unordered_map< Q >::value>::type
142  serializeType(std::ostream& o_out, const Q& p_member, bool& o_ok)
143  {
144  //o_ok = com::srl::serializeSTLContainer(o_out, p_member, );
145  o_ok = serializeSTLUnorderedMap(o_out, p_member);
146  }
147 
148  template < class Q = T >
149  typename std::enable_if<std::is_base_of< Serializer, typename std::remove_pointer< Q >::type >::value>::type
150  serializeType(std::ostream& o_out, const Q& p_member, bool& o_ok)
151  {
152  try
153  {
154  const Serializer& memberIfc = dynamic_cast< const Serializer& >(p_member);
155  o_ok = memberIfc.serialize(o_out);
156  }
157  catch(std::bad_cast p_exc)
158  {
159  o_ok = false;
160  }
161  }
162 
163  template < class Q = T >
164  typename std::enable_if<std::is_base_of< Serializer, typename std::remove_pointer< Q >::type >::value>::type
165  //typename std::enable_if<std::is_pointer< Q >::value>::type
166  serializeType(std::ostream& o_out, Q* const p_member, bool& o_ok)
167  {
168  try
169  {
170  const Serializer* memberIfc = dynamic_cast< const Serializer* >(p_member);
171  o_ok = memberIfc->serialize(o_out);
172  }
173  catch(std::bad_cast p_exc)
174  {
175  o_ok = false;
176  }
177  }
178 
183  template <template <typename VT, typename AT> class Container, class Value, class Alloc>
184  bool serializeSimpleSTLContainer(std::ostream& o_out, const Container< Value, Alloc >& p_member)
185  {
186  return serializeValueLikedContainer< Container< Value, Alloc >, Value >(o_out, p_member);
187  }
188 
193  template <template <typename VT, typename CT, typename AT> class Set, class Value, class Comp, class Alloc>
194  bool serializeSTLSet(std::ostream& o_out, const Set< Value, Comp, Alloc >& p_member)
195  {
196  return serializeValueLikedContainer< Set< Value, Comp, Alloc >, Value >(o_out, p_member);
197  }
198 
203  template <template <typename KT, typename VT, typename CT, typename AT> class Map, class Key, class Value, class Comp, class Alloc>
204  bool serializeSTLMap(std::ostream& o_out, const Map< Key, Value, Comp, Alloc >& p_member)
205  {
206  return serializeKeyValueLikedContainer<Map< Key, Value, Comp, Alloc >, Key, Value>(o_out, p_member);
207  }
208 
213  template <template <typename KT, typename VT, typename HT, typename PT, typename AT> class UnorderedMap, class Key, class Value, class Hash, class Pred, class Alloc>
214  bool serializeSTLUnorderedMap(std::ostream& o_out, const UnorderedMap< Key, Value, Hash, Pred, Alloc >& p_member)
215  {
216  return serializeKeyValueLikedContainer<UnorderedMap< Key, Value, Hash, Pred, Alloc >, Key, Value>(o_out, p_member);
217  }
218 
219  private:
220  template <class Container, class Value>
221  bool serializeValueLikedContainer(std::ostream& o_out, const Container& p_member)
222  {
223  bool ok = true;
225  for (auto it = p_member.begin(); it != p_member.end(); ++it)
226  {
227  bool iterOk = false;
228  ts.serializeType(o_out, *it, iterOk);
229  ok &= iterOk;
230  }
231 
232  return ok;
233  }
234 
235  template <class Container, class Key, class Value>
236  bool serializeKeyValueLikedContainer(std::ostream& o_out, const Container& p_member)
237  {
238  bool ok = true;
239  tmp_TypeSerializer< Key > keyTS;
240  tmp_TypeSerializer< Value > valTS;
241  for (auto it = p_member.begin(); it != p_member.end(); ++it)
242  {
243  bool iterOk = false;
244  keyTS.serializeType(o_out, it->first, iterOk);
245  ok &= iterOk;
246  valTS.serializeType(o_out, it->second, iterOk);
247  ok &= iterOk;
248  }
249 
250  return ok;
251  }
252  };
253 
254  template < class T >
255  bool Serializer::serializeMember(std::ostream& o_out, const T& p_member) const
256  {
257  tmp_TypeSerializer< T > ts;
258  bool ok = false;
259  ts.serializeType(o_out, p_member, ok);
260  return ok;
261  }
262  }
263 }
264 
265 //===========================================================================
266 #endif
267 //===========================================================================
268 
bool serializeSTLMap(std::ostream &o_out, const Map< Key, Value, Comp, Alloc > &p_member)
Definition: serializer.h:204
Definition: serializer.h:73
Интерфейс для сериализации классов
Definition: serializer.h:64
bool serializeSTLSet(std::ostream &o_out, const Set< Value, Comp, Alloc > &p_member)
Definition: serializer.h:194
bool serializeSTLUnorderedMap(std::ostream &o_out, const UnorderedMap< Key, Value, Hash, Pred, Alloc > &p_member)
Definition: serializer.h:214
bool serializeSimpleSTLContainer(std::ostream &o_out, const Container< Value, Alloc > &p_member)
Definition: serializer.h:184
Definition: serializer.h:98
std::string getClassName()
Definition: serializer.h:82