COVISE Core
tokenbuffer_serializer.h
Go to the documentation of this file.
1/* This file is part of COVISE.
2
3 You can use it under the terms of the GNU Lesser General Public License
4 version 2.1 or later, see lgpl-2.1.txt.
5
6 * License: LGPL 2+ */
7#include "tokenbuffer.h"
8
9#include <util/coExport.h>
10
11#include <string>
12#include <vector>
13#include <set>
14#include <map>
15#include <utility>
16
17
18#ifndef TOKEN_BUFFER_SERIALIZER_H
19#define TOKEN_BUFFER_SERIALIZER_H
20namespace covise
21{
22class DataHandle;
23
25
27{
28 TODETERMINE=-1,
29 UNDEFINED = 0,
30 BOOL, //1
31 INT, //2
32 FLOAT, //3
33 STRING, //4
34 DOUBLE, //5
35 VECTOR, //6
36 SET, //7
37 MAP, //8
38 PAIR, //9
40 Enum
41};
42
45
46
47//how a sharedMap has changed
49{
50 WHOLE, //every entry -> sent whole map (with types)
51 ENTRY_CHANGE, // send position and new value
52
53};
54template<class T>
56{
58}
59template <typename T>
62}
63template<class T>
65{
67}
68template<class T>
70{
72}
73template<class K, class V>
75{
77}
78template<class K, class V>
80{
82}
83template <>
85
86template <>
88template <>
90template <>
91NETEXPORT TokenBufferDataType getTokenBufferDataType<std::string>(const std::string& type);
92template <>
94template <>
96
97//tries to convert the serializedWithType tokenbuffer to a string
99
101//pay attention to order or it may not compile!
102
104
105template<class T>
107{
108 tb << value;
109}
110
111template <class K, class V>
113{
114 tb << value.first;
115 tb << value.second;
116 return tb;
117}
118
119template <class K, class V>
120void serialize(covise::TokenBuffer& tb, const std::pair<K, V>& value)
121{
122 tb << getTokenBufferDataType(value.first);
123 tb << getTokenBufferDataType(value.second);
124 serialize(tb, value.first);
125 serialize(tb, value.second);
126}
127
128
129template <class T>
131{
132 tb << static_cast<int>(value.size());
133 for (const T &entry: value)
134 {
135 tb << entry;
136 }
137 return tb;
138}
139
140template <class T>
141void serialize(covise::TokenBuffer& tb, const std::vector<T>& value)
142{
143 int size = value.size();
144 if (size == 0)
145 {
147 } else
148 {
149 tb << getTokenBufferDataType(value.front());
150 }
151 tb << size;
152 for (const T &entry: value)
153 {
154 serialize(tb, entry);
155 }
156}
157
158template <class T>
160{
161 tb << static_cast<int>(value.size());
162 for (const T &entry: value)
163 {
164 tb << entry;
165 }
166 return tb;
167}
168
169template <class T>
170void serialize(covise::TokenBuffer& tb, const std::set<T>& value)
171{
172 int size = value.size();
173 if (size == 0)
174 {
176 } else
177 {
178 tb << getTokenBufferDataType(*value.begin());
179 }
180 tb << size;
181 for (const T &entry : value)
182 {
183 serialize(tb, entry);
184 }
185}
186
187template <class K, class V>
189{
190 tb << static_cast<int>(value.size());
191 for (const auto &entry: value)
192 {
193 tb << entry.first << entry.second;
194 }
195 return tb;
196}
197
198template <class K, class V>
199void serialize(covise::TokenBuffer& tb, const std::map<K, V>& value)
200{
201 int size = value.size();
202 if (size == 0)
203 {
206 } else
207 {
208 tb << getTokenBufferDataType(value.begin()->first);
209 tb << getTokenBufferDataType(value.begin()->second);
210 }
211 tb << size;
212 auto entry = value.begin();
213 while (entry != value.end())
214 {
215 serialize(tb, entry->first);
216 serialize(tb, entry->second);
217 ++entry;
218 }
219}
220
221template<typename T>
223 tb << static_cast<int>(t);
224 return tb;
225}
226
229template<class T>
231{
232 tb >> value;
233}
234
235template <class K, class V>
237{
238 tb >> value.first >> value.second;
239 return tb;
240}
241
242template <class K, class V>
243void deserialize(covise::TokenBuffer& tb, std::pair<K, V>& value)
244{
245 int type;
246 tb >> type;
247 tb >> type;
248 deserialize(tb, value.first);
249 deserialize(tb, value.second);
250}
251
252template <class T>
254{
255 int size;
256 tb >> size;
257 value.resize(size);
258 for (int i = 0; i < size; i++)
259 {
260 tb >> value[i];
261 }
262 return tb;
263}
264
265template <class T>
266void deserialize(covise::TokenBuffer& tb, std::vector<T>& value)
267{
268 int size, typeID;
269 tb >> typeID;
270 tb >> size;
271 value.clear();
272 value.resize(size);
273 for (int i = 0; i < size; i++)
274 {
275 deserialize(tb, value[i]);
276 }
277}
278
279template <class T>
281{
282 int size;
283 tb >> size;
284 value.clear();
285 for (int i = 0; i < size; i++)
286 {
287 auto it = value.insert(T{});
288 tb >> *it.first;
289 }
290 return tb;
291}
292
293template <class T>
294void deserialize(covise::TokenBuffer& tb, std::set<T>& value)
295{
296 int size, typeID;
297 tb >> typeID;
298 tb >> size;
299 value.clear();
300 for (int i = 0; i < size; i++)
301 {
302 auto it = value.insert(T{});
303 tb >> *it.first;
304 }
305}
306
307
308template <class K, class V>
310{
311 int size;
312 tb >> size;
313 value.clear();
314 for (int i = 0; i < size; i++)
315 {
316 auto it = value.emplace(std::pair<K, V>{K{}, V{}});
317 tb >> it.first->first >> it.first->second;
318 }
319 return tb;
320}
321
322template <class K, class V>
323void deserialize(covise::TokenBuffer& tb, std::map<K, V>& value)
324{
325 int size, typeID;
326 tb >> typeID;
327 tb >> typeID;
328 tb >> size;
329 value.clear();
330 for (int i = 0; i < size; i++)
331 {
332 K key;
333 V val;
334 deserialize(tb, key);
335 deserialize(tb, val);
336 value[key] = val;
337 }
338}
339
340template<typename T>
342 int i;
343 tb >> i;
344 t = static_cast<T>(i);
345 return tb;
346}
347
349template<class T>
351{
352 auto typeID = getTokenBufferDataType(value);
353 tb << typeID;
354 serialize(tb, value);
355}
356template<class T>
358{
359 TokenBufferDataType typeID;
360 tb >> typeID;
361 deserialize(tb, value);
362}
363
364}//covise
365#endif
#define NETEXPORT
Definition: coExport.h:373
GLsizei const GLchar *const * string
Definition: khronos-glext.h:6750
GLsizeiptr size
Definition: khronos-glext.h:6610
GLsizei const GLfloat * value
Definition: khronos-glext.h:6760
GLdouble GLdouble t
Definition: khronos-glext.h:6449
GLuint GLfloat * val
Definition: khronos-glext.h:7898
GLenum type
Definition: khronos-glext.h:6279
list of all chemical elements
Definition: coConfig.h:27
MapChangeType
Definition: tokenbuffer_serializer.h:49
@ WHOLE
Definition: tokenbuffer_serializer.h:50
@ ENTRY_CHANGE
Definition: tokenbuffer_serializer.h:51
void serializeWithType(covise::TokenBuffer &tb, const T &value)
Definition: tokenbuffer_serializer.h:350
TokenBufferDataType getTokenBufferDataType< float >(const float &type)
Definition: tokenbuffer_serializer.cpp:35
TokenBufferDataType getTokenBufferDataType< bool >(const bool &type)
Definition: tokenbuffer_serializer.cpp:27
void deserialize(covise::TokenBuffer &tb, T &value)
Definition: tokenbuffer_serializer.h:230
TokenBufferDataType getTokenBufferDataType< char >(const char &type)
Definition: tokenbuffer_serializer.cpp:43
TokenBufferDataType getTokenBufferDataType< int >(const int &type)
Definition: tokenbuffer_serializer.cpp:31
NETEXPORT covise::TokenBuffer & operator>>(covise::TokenBuffer &tb, covise::Program &userType)
Definition: program_type.cpp:34
TokenBufferDataType getTokenBufferDataType< double >(const double &type)
Definition: tokenbuffer_serializer.cpp:47
std::enable_if<!std::is_enum< T >::value, TokenBufferDataType >::type getTokenBufferDataType(const T &type)
Definition: tokenbuffer_serializer.h:55
TokenBufferDataType
Definition: tokenbuffer_serializer.h:27
void deserializeWithType(covise::TokenBuffer &tb, T &value)
Definition: tokenbuffer_serializer.h:357
void serialize(covise::TokenBuffer &tb, const T &value)
convert the value to a TokenBuffer
Definition: tokenbuffer_serializer.h:106
QTextStream & operator<<(QTextStream &out, const coConfigEntryStringList list)
Definition: coConfigEntryString.cpp:159
std::string tokenBufferToString(covise::TokenBuffer &&tb, TokenBufferDataType typeID)
Definition: tokenbuffer_serializer.cpp:52
@ UNDEFINED
Definition: message_types.h:370
const int STRING
Definition: covise_shm.h:137
Definition: tokenbuffer.h:79