VTK  9.7.1
vtkVariantBoostSerialization.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
2 // SPDX-FileCopyrightText: Copyright (C) 2008 The Trustees of Indiana University.
3 // SPDX-License-Identifier: BSD-3-Clause AND BSL-1.0
17 #ifndef vtkVariantBoostSerialization_h
18 #define vtkVariantBoostSerialization_h
19 
20 #include "vtkSetGet.h"
21 #include "vtkType.h"
22 #include "vtkVariant.h"
23 #include "vtkVariantArray.h"
24 
25 #include <iostream>
26 
27 // This include fixes header-ordering issues in Boost.Serialization
28 // prior to Boost 1.35.0.
29 #include <boost/archive/binary_oarchive.hpp>
30 
31 #include <boost/serialization/base_object.hpp>
32 #include <boost/serialization/export.hpp>
33 #include <boost/serialization/extended_type_info_no_rtti.hpp>
34 #include <boost/serialization/split_free.hpp>
35 
36 VTK_ABI_NAMESPACE_BEGIN
37 
38 //----------------------------------------------------------------------------
39 // vtkStdString serialization code
40 //----------------------------------------------------------------------------
41 template <typename Archiver>
42 void serialize(Archiver& ar, vtkStdString& str, const unsigned int vtkNotUsed(version))
43 {
44  ar& boost::serialization::base_object<std::string>(str);
45 }
46 
47 //----------------------------------------------------------------------------
48 
49 template <typename Archiver>
50 void save(Archiver& ar, const std::string& str, const unsigned int vtkNotUsed(version))
51 {
52  ar & str;
53 }
54 
55 template <typename Archiver>
56 void load(Archiver& ar, std::string& str, const unsigned int vtkNotUsed(version))
57 {
58  std::string utf8;
59  ar & utf8;
60  str = utf8;
61 }
62 
63 //----------------------------------------------------------------------------
64 // vtkVariant serialization code
65 //----------------------------------------------------------------------------
66 
67 template <typename Archiver>
68 void save(Archiver& ar, const vtkVariant& variant, const unsigned int vtkNotUsed(version))
69 {
70  if (!variant.IsValid())
71  {
72  char null = 0;
73  ar & null;
74  return;
75  }
76 
77  // Output the type
78  char Type = variant.GetType();
79  ar & Type;
80 
81  // Output the value
82 #define VTK_VARIANT_SAVE(Value, Type, Function) \
83  case Value: \
84  { \
85  Type value = variant.Function(); \
86  ar & value; \
87  } \
88  return
89 
90  switch (Type)
91  {
93  VTK_VARIANT_SAVE(VTK_FLOAT, float, ToFloat);
94  VTK_VARIANT_SAVE(VTK_DOUBLE, double, ToDouble);
95  VTK_VARIANT_SAVE(VTK_CHAR, char, ToChar);
96  VTK_VARIANT_SAVE(VTK_UNSIGNED_CHAR, unsigned char, ToUnsignedChar);
97  VTK_VARIANT_SAVE(VTK_SHORT, short, ToShort);
98  VTK_VARIANT_SAVE(VTK_UNSIGNED_SHORT, unsigned short, ToUnsignedShort);
99  VTK_VARIANT_SAVE(VTK_INT, int, ToInt);
100  VTK_VARIANT_SAVE(VTK_UNSIGNED_INT, unsigned int, ToUnsignedInt);
101  VTK_VARIANT_SAVE(VTK_LONG, long, ToLong);
102  VTK_VARIANT_SAVE(VTK_UNSIGNED_LONG, unsigned long, ToUnsignedLong);
103  VTK_VARIANT_SAVE(VTK_LONG_LONG, long long, ToLongLong);
104  VTK_VARIANT_SAVE(VTK_UNSIGNED_LONG_LONG, unsigned long long, ToUnsignedLongLong);
105  default:
106  std::cerr << "cannot serialize variant with type " << variant.GetType() << '\n';
107  }
108 #undef VTK_VARIANT_SAVE
109 }
110 
111 template <typename Archiver>
112 void load(Archiver& ar, vtkVariant& variant, const unsigned int vtkNotUsed(version))
113 {
114  char Type;
115  ar & Type;
116 
117 #define VTK_VARIANT_LOAD(Value, Type) \
118  case Value: \
119  { \
120  Type value; \
121  ar & value; \
122  variant = vtkVariant(value); \
123  } \
124  return
125 
126  switch (Type)
127  {
128  case 0:
129  variant = vtkVariant();
130  return;
132  VTK_VARIANT_LOAD(VTK_FLOAT, float);
133  VTK_VARIANT_LOAD(VTK_DOUBLE, double);
134  VTK_VARIANT_LOAD(VTK_CHAR, char);
135  VTK_VARIANT_LOAD(VTK_UNSIGNED_CHAR, unsigned char);
136  VTK_VARIANT_LOAD(VTK_SHORT, short);
137  VTK_VARIANT_LOAD(VTK_UNSIGNED_SHORT, unsigned short);
139  VTK_VARIANT_LOAD(VTK_UNSIGNED_INT, unsigned int);
140  VTK_VARIANT_LOAD(VTK_LONG, long);
141  VTK_VARIANT_LOAD(VTK_UNSIGNED_LONG, unsigned long);
142  VTK_VARIANT_LOAD(VTK_LONG_LONG, long long);
143  VTK_VARIANT_LOAD(VTK_UNSIGNED_LONG_LONG, unsigned long long);
144  default:
145  std::cerr << "cannot deserialize variant with type " << static_cast<unsigned int>(Type)
146  << '\n';
147  variant = vtkVariant();
148  }
149 #undef VTK_VARIANT_LOAD
150 }
151 
152 VTK_ABI_NAMESPACE_END
153 
154 BOOST_SERIALIZATION_SPLIT_FREE(vtkVariant)
155 
156 VTK_ABI_NAMESPACE_BEGIN
157 
158 //----------------------------------------------------------------------------
159 // vtkVariantArray serialization code
160 //----------------------------------------------------------------------------
161 
162 template <typename Archiver>
163 void save(Archiver& ar, const vtkVariantArray& c_array, const unsigned int vtkNotUsed(version))
164 {
165  vtkVariantArray& array = const_cast<vtkVariantArray&>(c_array);
166 
167  // Array name
169  if (array.GetName() != nullptr)
170  name = array.GetName();
171  ar & name;
172 
173  // Array data
174  vtkIdType n = array.GetNumberOfTuples();
175  ar & n;
176  for (vtkIdType i = 0; i < n; ++i)
177  {
178  ar & array.GetValue(i);
179  }
180 }
181 
182 template <typename Archiver>
183 void load(Archiver& ar, vtkVariantArray& array, const unsigned int vtkNotUsed(version))
184 {
185  // Array name
187  ar & name;
188  array.SetName(name.c_str());
189 
190  if (name.empty())
191  {
192  array.SetName(nullptr);
193  }
194  else
195  {
196  array.SetName(name.c_str());
197  }
198 
199  // Array data
200  vtkIdType n;
201  ar & n;
202  array.SetNumberOfTuples(n);
204  for (vtkIdType i = 0; i < n; ++i)
205  {
206  ar & value;
207  array.SetValue(i, value);
208  }
209 }
210 
211 VTK_ABI_NAMESPACE_END
212 
213 BOOST_SERIALIZATION_SPLIT_FREE(vtkVariantArray)
214 
215 #endif
216 // VTK-HeaderTest-Exclude: vtkVariantBoostSerialization.h
Wrapper around std::string to keep symbols short.
Definition: vtkStdString.h:27
virtual void SetNumberOfTuples(vtkIdType numTuples)
Set the number of tuples (a component group) in the array.
#define VTK_UNSIGNED_INT
Definition: vtkType.h:40
An array holding vtkVariants.
#define VTK_UNSIGNED_SHORT
Definition: vtkType.h:38
int vtkIdType
Definition: vtkType.h:363
#define VTK_LONG_LONG
Definition: vtkType.h:52
A type representing the union of many types.
Definition: vtkVariant.h:52
#define VTK_STRING
Definition: vtkType.h:49
virtual void SetName(const char *)
Set/get array's name.
#define VTK_DOUBLE
Definition: vtkType.h:44
#define VTK_FLOAT
Definition: vtkType.h:43
void SetValue(vtkIdType id, ValueType value)
Set the data at a particular index.
void save(Archiver &ar, const std::string &str, const unsigned int version)
#define VTK_SHORT
Definition: vtkType.h:37
virtual char * GetName()
Set/get array's name.
#define VTK_CHAR
Definition: vtkType.h:34
#define VTK_LONG
Definition: vtkType.h:41
vtkIdType GetNumberOfTuples() const
Get the number of complete tuples (a component group) in the array.
void serialize(Archiver &ar, vtkStdString &str, const unsigned int version)
#define VTK_UNSIGNED_CHAR
Definition: vtkType.h:36
ValueType & GetValue(vtkIdType id) const
Get the data at a particular index.
#define VTK_VARIANT_LOAD(Value, Type)
#define VTK_UNSIGNED_LONG
Definition: vtkType.h:42
unsigned int GetType() const
Get the type of the variant.
#define VTK_UNSIGNED_LONG_LONG
Definition: vtkType.h:53
void load(Archiver &ar, std::string &str, const unsigned int version)
#define VTK_INT
Definition: vtkType.h:39
#define VTK_VARIANT_SAVE(Value, Type, Function)
bool IsValid() const
Get whether the variant value is valid.