VTK  9.5.20251215
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
16
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
36VTK_ABI_NAMESPACE_BEGIN
37
38//----------------------------------------------------------------------------
39// vtkStdString serialization code
40//----------------------------------------------------------------------------
41template <typename Archiver>
42void serialize(Archiver& ar, vtkStdString& str, const unsigned int vtkNotUsed(version))
43{
44 ar& boost::serialization::base_object<std::string>(str);
45}
46
47//----------------------------------------------------------------------------
48
49template <typename Archiver>
50void save(Archiver& ar, const std::string& str, const unsigned int vtkNotUsed(version))
51{
52 ar& str;
53}
54
55template <typename Archiver>
56void 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
67template <typename Archiver>
68void 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
111template <typename Archiver>
112void 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;
135 VTK_VARIANT_LOAD(VTK_UNSIGNED_CHAR, unsigned char);
137 VTK_VARIANT_LOAD(VTK_UNSIGNED_SHORT, unsigned short);
139 VTK_VARIANT_LOAD(VTK_UNSIGNED_INT, unsigned int);
141 VTK_VARIANT_LOAD(VTK_UNSIGNED_LONG, unsigned 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
152VTK_ABI_NAMESPACE_END
153
154BOOST_SERIALIZATION_SPLIT_FREE(vtkVariant)
155
156VTK_ABI_NAMESPACE_BEGIN
157
158//----------------------------------------------------------------------------
159// vtkVariantArray serialization code
160//----------------------------------------------------------------------------
161
162template <typename Archiver>
163void 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
168 vtkStdString 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
182template <typename Archiver>
183void load(Archiver& ar, vtkVariantArray& array, const unsigned int vtkNotUsed(version))
184{
185 // Array name
186 vtkStdString 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);
203 vtkVariant value;
204 for (vtkIdType i = 0; i < n; ++i)
205 {
206 ar& value;
207 array.SetValue(i, value);
208 }
209}
210
211VTK_ABI_NAMESPACE_END
212
213BOOST_SERIALIZATION_SPLIT_FREE(vtkVariantArray)
214
215#endif
216// VTK-HeaderTest-Exclude: vtkVariantBoostSerialization.h
virtual char * GetName()
Set/get array's name.
vtkIdType GetNumberOfTuples() const
Get the number of complete tuples (a component group) in the array.
virtual void SetName(const char *)
Set/get array's name.
Wrapper around std::string to keep symbols short.
An array holding vtkVariants.
void SetValue(vtkIdType id, ValueType value)
Set the data at a particular index.
void SetNumberOfTuples(vtkIdType number) override
Set the number of tuples (a component group) in the array.
ValueType & GetValue(vtkIdType id) const
Get the data at a particular index.
A type representing the union of many types.
Definition vtkVariant.h:162
unsigned int GetType() const
Get the type of the variant.
bool IsValid() const
Get whether the variant value is valid.
#define VTK_SHORT
Definition vtkType.h:37
int vtkIdType
Definition vtkType.h:368
#define VTK_UNSIGNED_INT
Definition vtkType.h:40
#define VTK_LONG_LONG
Definition vtkType.h:52
#define VTK_DOUBLE
Definition vtkType.h:44
#define VTK_UNSIGNED_CHAR
Definition vtkType.h:36
#define VTK_UNSIGNED_SHORT
Definition vtkType.h:38
#define VTK_INT
Definition vtkType.h:39
#define VTK_STRING
Definition vtkType.h:49
#define VTK_FLOAT
Definition vtkType.h:43
#define VTK_CHAR
Definition vtkType.h:34
#define VTK_UNSIGNED_LONG
Definition vtkType.h:42
#define VTK_UNSIGNED_LONG_LONG
Definition vtkType.h:53
#define VTK_LONG
Definition vtkType.h:41
void load(Archiver &ar, std::string &str, const unsigned int version)
#define VTK_VARIANT_SAVE(Value, Type, Function)
#define VTK_VARIANT_LOAD(Value, Type)
void serialize(Archiver &ar, vtkStdString &str, const unsigned int version)
void save(Archiver &ar, const std::string &str, const unsigned int version)