21 #ifndef SERIALIZABLETYPE_H
22 #define SERIALIZABLETYPE_H
32 #include <tulip/TypeInterface.h>
34 #define FORWARD_TOSTRING(T) \
35 static std::string toString(const T::RealType &v) { \
36 std::ostringstream oss; \
40 #define FORWARD_FROMSTRING(T) \
41 static bool fromString(T::RealType &v, const std::string &s) { \
42 std::istringstream iss(s); \
43 return read(iss, v); \
45 #define FORWARD_STRING_METHODS(T) FORWARD_FROMSTRING(T) FORWARD_TOSTRING(T)
49 class TLP_SCOPE SerializableType :
public TypeInterface<T> {
51 static void write(std::ostream &oss,
const typename TypeInterface<T>::RealType &v) {
54 static bool read(std::istream &iss,
typename TypeInterface<T>::RealType &v) {
55 return bool(iss >> v);
57 FORWARD_STRING_METHODS(
typename TypeInterface<T>)
60 template <
typename ELT_TYPE,
typename ELT_READER,
int openParen>
61 class TLP_SCOPE SerializableVectorType :
public TypeInterface<std::vector<ELT_TYPE>> {
62 static bool readVector(std::istream &is, std::vector<ELT_TYPE> &v,
char openChar,
char sepChar,
69 bool sepFound =
false;
72 while ((is >> c) && isspace(c)) {
83 return (!sepFound && !closeChar);
89 if (!openChar || sepFound)
96 if (firstVal || sepFound)
101 if (firstVal || sepFound) {
102 if (openParen && c !=
'(')
107 if (!ELT_READER::read(is, val))
118 static void writeVector(std::ostream &os,
const std::vector<ELT_TYPE> &v) {
121 for (
unsigned int i = 0; i < v.size(); i++) {
132 static void write(std::ostream &oss,
133 const typename TypeInterface<std::vector<ELT_TYPE>>::RealType &v) {
136 static void writeb(std::ostream &oss,
137 const typename TypeInterface<std::vector<ELT_TYPE>>::RealType &v) {
138 unsigned int vSize = v.size();
139 oss.write(
reinterpret_cast<const char *
>(&vSize),
sizeof(vSize));
140 oss.write(
reinterpret_cast<const char *
>(v.data()), vSize *
sizeof(ELT_TYPE));
142 static bool read(std::istream &iss,
typename TypeInterface<std::vector<ELT_TYPE>>::RealType &v,
143 char openChar =
'(',
char sepChar =
',',
char closeChar =
')') {
144 return readVector(iss, v, openChar, sepChar, closeChar);
146 static bool readb(std::istream &iss,
typename TypeInterface<std::vector<ELT_TYPE>>::RealType &v) {
149 if (
bool(iss.read(
reinterpret_cast<char *
>(&vSize),
sizeof(vSize)))) {
151 return bool(iss.read(
reinterpret_cast<char *
>(v.data()), vSize *
sizeof(ELT_TYPE)));
155 static bool read(
const std::vector<std::string> &vs,
156 typename TypeInterface<std::vector<ELT_TYPE>>::RealType &v) {
158 v.reserve(vs.size());
160 for (
const std::string &s : vs) {
162 std::istringstream is(s);
163 if (!ELT_READER::read(is, val))
170 static bool tokenize(
const std::string &s, std::vector<std::string> &v,
char openChar,
171 char sepChar,
char closeChar) {
174 std::istringstream is(s);
177 bool firstVal =
true;
178 bool sepFound =
false;
181 while ((is >> c) && isspace(c)) {
192 return (!sepFound && !closeChar);
197 if (c == closeChar) {
198 if (!openChar || sepFound)
205 if (firstVal || sepFound)
210 if (firstVal || sepFound) {
211 if (openParen && c !=
'(')
216 auto pos = is.tellg();
217 if (!ELT_READER::read(is, val))
220 v.push_back(s.substr(pos, is.tellg() - pos)),
229 static unsigned int valueSize() {
232 FORWARD_STRING_METHODS(
typename TypeInterface<std::vector<ELT_TYPE>>)