VTK
vtkVariantBoostSerialization.h
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: Visualization Toolkit
4  Module: vtkVariantBoostSerialization.h
5 
6  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7  All rights reserved.
8  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9 
10  This software is distributed WITHOUT ANY WARRANTY; without even
11  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12  PURPOSE. See the above copyright notice for more information.
13 
14 =========================================================================*/
15 /*
16  * Copyright (C) 2008 The Trustees of Indiana University.
17  * Use, modification and distribution is subject to the Boost Software
18  * License, Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt)
19  */
32 #ifndef vtkVariantBoostSerialization_h
33 #define vtkVariantBoostSerialization_h
34 
35 #include "vtkSetGet.h"
36 #include "vtkType.h"
37 #include "vtkVariant.h"
38 #include "vtkVariantArray.h"
39 
40 // This include fixes header-ordering issues in Boost.Serialization
41 // prior to Boost 1.35.0.
42 #include <boost/archive/binary_oarchive.hpp>
43 
44 #include <boost/serialization/base_object.hpp>
45 #include <boost/serialization/export.hpp>
46 #include <boost/serialization/extended_type_info_no_rtti.hpp>
47 #include <boost/serialization/split_free.hpp>
48 
49 //----------------------------------------------------------------------------
50 // vtkStdString serialization code
51 //----------------------------------------------------------------------------
52 template<typename Archiver>
53 void serialize(Archiver& ar, vtkStdString& str,
54  const unsigned int vtkNotUsed(version))
55 {
56  ar & boost::serialization::base_object<std::string>(str);
57 }
58 
59 //----------------------------------------------------------------------------
60 // vtkUnicodeString serialization code
61 //----------------------------------------------------------------------------
62 
63 template<typename Archiver>
64 void save(Archiver& ar, const vtkUnicodeString& str,
65  const unsigned int vtkNotUsed(version))
66 {
67  std::string utf8(str.utf8_str());
68  ar & utf8;
69 }
70 
71 template<typename Archiver>
72 void load(Archiver& ar, vtkUnicodeString& str,
73  const unsigned int vtkNotUsed(version))
74 {
75  std::string utf8;
76  ar & utf8;
77  str = vtkUnicodeString::from_utf8(utf8);
78 }
79 
80 BOOST_SERIALIZATION_SPLIT_FREE(vtkUnicodeString)
81 
82 
83 //----------------------------------------------------------------------------
84 // vtkVariant serialization code
85 //----------------------------------------------------------------------------
86 
87 template<typename Archiver>
88 void save(Archiver& ar, const vtkVariant& variant,
89  const unsigned int vtkNotUsed(version))
90 {
91  if (!variant.IsValid())
92  {
93  char null = 0;
94  ar & null;
95  return;
96  }
97 
98  // Output the type
99  char Type = variant.GetType();
100  ar & Type;
101 
102  // Output the value
103 #define VTK_VARIANT_SAVE(Value,Type,Function) \
104  case Value: \
105  { \
106  Type value = variant.Function(); \
107  ar & value; \
108  } \
109  return
110 
111  switch (Type)
112  {
115  VTK_VARIANT_SAVE(VTK_FLOAT,float,ToFloat);
116  VTK_VARIANT_SAVE(VTK_DOUBLE,double,ToDouble);
117  VTK_VARIANT_SAVE(VTK_CHAR,char,ToChar);
118  VTK_VARIANT_SAVE(VTK_UNSIGNED_CHAR,unsigned char,ToUnsignedChar);
119  VTK_VARIANT_SAVE(VTK_SHORT,short,ToShort);
120  VTK_VARIANT_SAVE(VTK_UNSIGNED_SHORT,unsigned short,ToUnsignedShort);
121  VTK_VARIANT_SAVE(VTK_INT,int,ToInt);
122  VTK_VARIANT_SAVE(VTK_UNSIGNED_INT,unsigned int,ToUnsignedInt);
123  VTK_VARIANT_SAVE(VTK_LONG,long,ToLong);
124  VTK_VARIANT_SAVE(VTK_UNSIGNED_LONG,unsigned long,ToUnsignedLong);
125  VTK_VARIANT_SAVE(VTK_LONG_LONG,long long,ToLongLong);
126  VTK_VARIANT_SAVE(VTK_UNSIGNED_LONG_LONG,unsigned long long,
127  ToUnsignedLongLong);
128  default:
129  cerr << "cannot serialize variant with type " << variant.GetType()
130  << '\n';
131  }
132 #undef VTK_VARIANT_SAVE
133 }
134 
135 template<typename Archiver>
136 void load(Archiver& ar, vtkVariant& variant,
137  const unsigned int vtkNotUsed(version))
138 {
139  char Type;
140  ar & Type;
141 
142 #define VTK_VARIANT_LOAD(Value,Type) \
143  case Value: \
144  { \
145  Type value; \
146  ar & value; \
147  variant = vtkVariant(value); \
148  } \
149  return
150 
151  switch (Type)
152  {
153  case 0: variant = vtkVariant(); return;
159  VTK_VARIANT_LOAD(VTK_UNSIGNED_CHAR,unsigned char);
161  VTK_VARIANT_LOAD(VTK_UNSIGNED_SHORT,unsigned short);
163  VTK_VARIANT_LOAD(VTK_UNSIGNED_INT,unsigned int);
165  VTK_VARIANT_LOAD(VTK_UNSIGNED_LONG,unsigned long);
166  VTK_VARIANT_LOAD(VTK_LONG_LONG,long long);
167  VTK_VARIANT_LOAD(VTK_UNSIGNED_LONG_LONG,unsigned long long);
168  default:
169  cerr << "cannot deserialize variant with type " << static_cast<unsigned int>(Type) << '\n';
170  variant = vtkVariant();
171  }
172 #undef VTK_VARIANT_LOAD
173 }
174 
175 BOOST_SERIALIZATION_SPLIT_FREE(vtkVariant)
176 
177 //----------------------------------------------------------------------------
178 // vtkVariantArray serialization code
179 //----------------------------------------------------------------------------
180 
181 template<typename Archiver>
182 void save(Archiver& ar, const vtkVariantArray& c_array,
183  const unsigned int vtkNotUsed(version))
184 {
185  vtkVariantArray& array = const_cast<vtkVariantArray&>(c_array);
186 
187  // Array name
189  if(array.GetName()!=NULL) name=array.GetName();
190  ar & name;
191 
192  // Array data
193  vtkIdType n = array.GetNumberOfTuples();
194  ar & n;
195  for (vtkIdType i = 0; i < n; ++i)
196  {
197  ar & array.GetValue(i);
198  }
199 }
200 
201 template<typename Archiver>
202 void load(Archiver& ar, vtkVariantArray& array,
203  const unsigned int vtkNotUsed(version))
204 {
205  // Array name
207  ar & name;
208  array.SetName(name.c_str());
209 
210  if(name.empty())
211  {
212  array.SetName(0);
213  }
214  else
215  {
216  array.SetName(name.c_str());
217  }
218 
219  // Array data
220  vtkIdType n;
221  ar & n;
222  array.SetNumberOfTuples(n);
224  for (vtkIdType i = 0; i < n; ++i)
225  {
226  ar & value;
227  array.SetValue(i, value);
228  }
229 }
230 
231 BOOST_SERIALIZATION_SPLIT_FREE(vtkVariantArray)
232 
233 #endif
234 // VTK-HeaderTest-Exclude: vtkVariantBoostSerialization.h
Wrapper around std::string to keep symbols short.
Definition: vtkStdString.h:46
#define VTK_VARIANT_SAVE(Value, Type, Function)
void load(Archiver &ar, vtkUnicodeString &str, const unsigned int vtkNotUsed(version))
#define VTK_UNSIGNED_INT
Definition: vtkType.h:32
void serialize(Archiver &ar, vtkStdString &str, const unsigned int vtkNotUsed(version))
An array holding vtkVariants.
vtkIdType GetNumberOfTuples()
#define VTK_UNSIGNED_SHORT
Definition: vtkType.h:30
int vtkIdType
Definition: vtkType.h:247
#define VTK_UNICODE_STRING
Definition: vtkType.h:58
#define VTK_VARIANT_LOAD(Value, Type)
#define VTK_LONG_LONG
Definition: vtkType.h:44
A atomic type representing the union of many types.
Definition: vtkVariant.h:78
#define VTK_STRING
Definition: vtkType.h:41
virtual void SetName(const char *)
#define VTK_DOUBLE
Definition: vtkType.h:36
#define VTK_FLOAT
Definition: vtkType.h:35
static vtkUnicodeString from_utf8(const char *)
const char * utf8_str() const
#define VTK_SHORT
Definition: vtkType.h:29
virtual char * GetName()
#define VTK_CHAR
Definition: vtkType.h:26
#define VTK_LONG
Definition: vtkType.h:33
void SetValue(vtkIdType id, vtkVariant value)
void save(Archiver &ar, const vtkUnicodeString &str, const unsigned int vtkNotUsed(version))
#define VTK_UNSIGNED_CHAR
Definition: vtkType.h:28
virtual void SetNumberOfTuples(vtkIdType number)
#define VTK_UNSIGNED_LONG
Definition: vtkType.h:34
vtkVariant & GetValue(vtkIdType id) const
#define VTK_UNSIGNED_LONG_LONG
Definition: vtkType.h:45
#define VTK_INT
Definition: vtkType.h:31
String class that stores Unicode text.