isotree 0.1.4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (118) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/LICENSE.txt +2 -2
  4. data/README.md +22 -1
  5. data/ext/isotree/ext.cpp +26 -0
  6. data/ext/isotree/extconf.rb +3 -3
  7. data/lib/isotree.rb +1 -0
  8. data/lib/isotree/isolation_forest.rb +86 -1
  9. data/lib/isotree/version.rb +1 -1
  10. data/vendor/cereal/LICENSE +24 -0
  11. data/vendor/cereal/README.md +85 -0
  12. data/vendor/cereal/include/cereal/access.hpp +351 -0
  13. data/vendor/cereal/include/cereal/archives/adapters.hpp +163 -0
  14. data/vendor/cereal/include/cereal/archives/binary.hpp +169 -0
  15. data/vendor/cereal/include/cereal/archives/json.hpp +1019 -0
  16. data/vendor/cereal/include/cereal/archives/portable_binary.hpp +334 -0
  17. data/vendor/cereal/include/cereal/archives/xml.hpp +956 -0
  18. data/vendor/cereal/include/cereal/cereal.hpp +1089 -0
  19. data/vendor/cereal/include/cereal/details/helpers.hpp +422 -0
  20. data/vendor/cereal/include/cereal/details/polymorphic_impl.hpp +796 -0
  21. data/vendor/cereal/include/cereal/details/polymorphic_impl_fwd.hpp +65 -0
  22. data/vendor/cereal/include/cereal/details/static_object.hpp +127 -0
  23. data/vendor/cereal/include/cereal/details/traits.hpp +1411 -0
  24. data/vendor/cereal/include/cereal/details/util.hpp +84 -0
  25. data/vendor/cereal/include/cereal/external/base64.hpp +134 -0
  26. data/vendor/cereal/include/cereal/external/rapidjson/allocators.h +284 -0
  27. data/vendor/cereal/include/cereal/external/rapidjson/cursorstreamwrapper.h +78 -0
  28. data/vendor/cereal/include/cereal/external/rapidjson/document.h +2652 -0
  29. data/vendor/cereal/include/cereal/external/rapidjson/encodedstream.h +299 -0
  30. data/vendor/cereal/include/cereal/external/rapidjson/encodings.h +716 -0
  31. data/vendor/cereal/include/cereal/external/rapidjson/error/en.h +74 -0
  32. data/vendor/cereal/include/cereal/external/rapidjson/error/error.h +161 -0
  33. data/vendor/cereal/include/cereal/external/rapidjson/filereadstream.h +99 -0
  34. data/vendor/cereal/include/cereal/external/rapidjson/filewritestream.h +104 -0
  35. data/vendor/cereal/include/cereal/external/rapidjson/fwd.h +151 -0
  36. data/vendor/cereal/include/cereal/external/rapidjson/internal/biginteger.h +290 -0
  37. data/vendor/cereal/include/cereal/external/rapidjson/internal/diyfp.h +271 -0
  38. data/vendor/cereal/include/cereal/external/rapidjson/internal/dtoa.h +245 -0
  39. data/vendor/cereal/include/cereal/external/rapidjson/internal/ieee754.h +78 -0
  40. data/vendor/cereal/include/cereal/external/rapidjson/internal/itoa.h +308 -0
  41. data/vendor/cereal/include/cereal/external/rapidjson/internal/meta.h +186 -0
  42. data/vendor/cereal/include/cereal/external/rapidjson/internal/pow10.h +55 -0
  43. data/vendor/cereal/include/cereal/external/rapidjson/internal/regex.h +740 -0
  44. data/vendor/cereal/include/cereal/external/rapidjson/internal/stack.h +232 -0
  45. data/vendor/cereal/include/cereal/external/rapidjson/internal/strfunc.h +69 -0
  46. data/vendor/cereal/include/cereal/external/rapidjson/internal/strtod.h +290 -0
  47. data/vendor/cereal/include/cereal/external/rapidjson/internal/swap.h +46 -0
  48. data/vendor/cereal/include/cereal/external/rapidjson/istreamwrapper.h +128 -0
  49. data/vendor/cereal/include/cereal/external/rapidjson/memorybuffer.h +70 -0
  50. data/vendor/cereal/include/cereal/external/rapidjson/memorystream.h +71 -0
  51. data/vendor/cereal/include/cereal/external/rapidjson/msinttypes/inttypes.h +316 -0
  52. data/vendor/cereal/include/cereal/external/rapidjson/msinttypes/stdint.h +300 -0
  53. data/vendor/cereal/include/cereal/external/rapidjson/ostreamwrapper.h +81 -0
  54. data/vendor/cereal/include/cereal/external/rapidjson/pointer.h +1414 -0
  55. data/vendor/cereal/include/cereal/external/rapidjson/prettywriter.h +277 -0
  56. data/vendor/cereal/include/cereal/external/rapidjson/rapidjson.h +656 -0
  57. data/vendor/cereal/include/cereal/external/rapidjson/reader.h +2230 -0
  58. data/vendor/cereal/include/cereal/external/rapidjson/schema.h +2497 -0
  59. data/vendor/cereal/include/cereal/external/rapidjson/stream.h +223 -0
  60. data/vendor/cereal/include/cereal/external/rapidjson/stringbuffer.h +121 -0
  61. data/vendor/cereal/include/cereal/external/rapidjson/writer.h +709 -0
  62. data/vendor/cereal/include/cereal/external/rapidxml/license.txt +52 -0
  63. data/vendor/cereal/include/cereal/external/rapidxml/manual.html +406 -0
  64. data/vendor/cereal/include/cereal/external/rapidxml/rapidxml.hpp +2624 -0
  65. data/vendor/cereal/include/cereal/external/rapidxml/rapidxml_iterators.hpp +175 -0
  66. data/vendor/cereal/include/cereal/external/rapidxml/rapidxml_print.hpp +428 -0
  67. data/vendor/cereal/include/cereal/external/rapidxml/rapidxml_utils.hpp +123 -0
  68. data/vendor/cereal/include/cereal/macros.hpp +154 -0
  69. data/vendor/cereal/include/cereal/specialize.hpp +139 -0
  70. data/vendor/cereal/include/cereal/types/array.hpp +79 -0
  71. data/vendor/cereal/include/cereal/types/atomic.hpp +55 -0
  72. data/vendor/cereal/include/cereal/types/base_class.hpp +203 -0
  73. data/vendor/cereal/include/cereal/types/bitset.hpp +176 -0
  74. data/vendor/cereal/include/cereal/types/boost_variant.hpp +164 -0
  75. data/vendor/cereal/include/cereal/types/chrono.hpp +72 -0
  76. data/vendor/cereal/include/cereal/types/common.hpp +129 -0
  77. data/vendor/cereal/include/cereal/types/complex.hpp +56 -0
  78. data/vendor/cereal/include/cereal/types/concepts/pair_associative_container.hpp +73 -0
  79. data/vendor/cereal/include/cereal/types/deque.hpp +62 -0
  80. data/vendor/cereal/include/cereal/types/forward_list.hpp +68 -0
  81. data/vendor/cereal/include/cereal/types/functional.hpp +43 -0
  82. data/vendor/cereal/include/cereal/types/list.hpp +62 -0
  83. data/vendor/cereal/include/cereal/types/map.hpp +36 -0
  84. data/vendor/cereal/include/cereal/types/memory.hpp +425 -0
  85. data/vendor/cereal/include/cereal/types/optional.hpp +66 -0
  86. data/vendor/cereal/include/cereal/types/polymorphic.hpp +483 -0
  87. data/vendor/cereal/include/cereal/types/queue.hpp +132 -0
  88. data/vendor/cereal/include/cereal/types/set.hpp +103 -0
  89. data/vendor/cereal/include/cereal/types/stack.hpp +76 -0
  90. data/vendor/cereal/include/cereal/types/string.hpp +61 -0
  91. data/vendor/cereal/include/cereal/types/tuple.hpp +123 -0
  92. data/vendor/cereal/include/cereal/types/unordered_map.hpp +36 -0
  93. data/vendor/cereal/include/cereal/types/unordered_set.hpp +99 -0
  94. data/vendor/cereal/include/cereal/types/utility.hpp +47 -0
  95. data/vendor/cereal/include/cereal/types/valarray.hpp +89 -0
  96. data/vendor/cereal/include/cereal/types/variant.hpp +109 -0
  97. data/vendor/cereal/include/cereal/types/vector.hpp +112 -0
  98. data/vendor/cereal/include/cereal/version.hpp +52 -0
  99. data/vendor/isotree/LICENSE +1 -1
  100. data/vendor/isotree/README.md +2 -1
  101. data/vendor/isotree/src/RcppExports.cpp +44 -4
  102. data/vendor/isotree/src/Rwrapper.cpp +141 -51
  103. data/vendor/isotree/src/crit.cpp +1 -1
  104. data/vendor/isotree/src/dealloc.cpp +1 -1
  105. data/vendor/isotree/src/dist.cpp +6 -6
  106. data/vendor/isotree/src/extended.cpp +5 -5
  107. data/vendor/isotree/src/fit_model.cpp +30 -19
  108. data/vendor/isotree/src/helpers_iforest.cpp +26 -11
  109. data/vendor/isotree/src/impute.cpp +7 -7
  110. data/vendor/isotree/src/isoforest.cpp +7 -7
  111. data/vendor/isotree/src/isotree.hpp +27 -5
  112. data/vendor/isotree/src/merge_models.cpp +1 -1
  113. data/vendor/isotree/src/mult.cpp +1 -1
  114. data/vendor/isotree/src/predict.cpp +20 -16
  115. data/vendor/isotree/src/serialize.cpp +1 -1
  116. data/vendor/isotree/src/sql.cpp +545 -0
  117. data/vendor/isotree/src/utils.cpp +36 -44
  118. metadata +98 -92
@@ -0,0 +1,55 @@
1
+ /*! \file atomic.hpp
2
+ \brief Support for types found in \<atomic\>
3
+ \ingroup STLSupport */
4
+ /*
5
+ Copyright (c) 2014, Randolph Voorhies, Shane Grant
6
+ All rights reserved.
7
+
8
+ Redistribution and use in source and binary forms, with or without
9
+ modification, are permitted provided that the following conditions are met:
10
+ * Redistributions of source code must retain the above copyright
11
+ notice, this list of conditions and the following disclaimer.
12
+ * Redistributions in binary form must reproduce the above copyright
13
+ notice, this list of conditions and the following disclaimer in the
14
+ documentation and/or other materials provided with the distribution.
15
+ * Neither the name of cereal nor the
16
+ names of its contributors may be used to endorse or promote products
17
+ derived from this software without specific prior written permission.
18
+
19
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
+ DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY
23
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
26
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
+ */
30
+ #ifndef CEREAL_TYPES_ATOMIC_HPP_
31
+ #define CEREAL_TYPES_ATOMIC_HPP_
32
+
33
+ #include <cereal/cereal.hpp>
34
+ #include <atomic>
35
+
36
+ namespace cereal
37
+ {
38
+ //! Serializing (save) for std::atomic
39
+ template <class Archive, class T> inline
40
+ void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::atomic<T> const & a )
41
+ {
42
+ ar( CEREAL_NVP_("atomic_data", a.load()) );
43
+ }
44
+
45
+ //! Serializing (load) for std::atomic
46
+ template <class Archive, class T> inline
47
+ void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::atomic<T> & a )
48
+ {
49
+ T tmp;
50
+ ar( CEREAL_NVP_("atomic_data", tmp) );
51
+ a.store( tmp );
52
+ }
53
+ } // namespace cereal
54
+
55
+ #endif // CEREAL_TYPES_ATOMIC_HPP_
@@ -0,0 +1,203 @@
1
+ /*! \file base_class.hpp
2
+ \brief Support for base classes (virtual and non-virtual)
3
+ \ingroup OtherTypes */
4
+ /*
5
+ Copyright (c) 2014, Randolph Voorhies, Shane Grant
6
+ All rights reserved.
7
+
8
+ Redistribution and use in source and binary forms, with or without
9
+ modification, are permitted provided that the following conditions are met:
10
+ * Redistributions of source code must retain the above copyright
11
+ notice, this list of conditions and the following disclaimer.
12
+ * Redistributions in binary form must reproduce the above copyright
13
+ notice, this list of conditions and the following disclaimer in the
14
+ documentation and/or other materials provided with the distribution.
15
+ * Neither the name of cereal nor the
16
+ names of its contributors may be used to endorse or promote products
17
+ derived from this software without specific prior written permission.
18
+
19
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
+ DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY
23
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
26
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
+ */
30
+ #ifndef CEREAL_TYPES_BASE_CLASS_HPP_
31
+ #define CEREAL_TYPES_BASE_CLASS_HPP_
32
+
33
+ #include "cereal/details/traits.hpp"
34
+ #include "cereal/details/polymorphic_impl_fwd.hpp"
35
+
36
+ namespace cereal
37
+ {
38
+ namespace base_class_detail
39
+ {
40
+ //! Used to register polymorphic relations and avoid the need to include
41
+ //! polymorphic.hpp when no polymorphism is used
42
+ /*! @internal */
43
+ template <class Base, class Derived, bool IsPolymorphic = std::is_polymorphic<Base>::value>
44
+ struct RegisterPolymorphicBaseClass
45
+ {
46
+ static void bind()
47
+ { }
48
+ };
49
+
50
+ //! Polymorphic version
51
+ /*! @internal */
52
+ template <class Base, class Derived>
53
+ struct RegisterPolymorphicBaseClass<Base, Derived, true>
54
+ {
55
+ static void bind()
56
+ { detail::RegisterPolymorphicCaster<Base, Derived>::bind(); }
57
+ };
58
+ }
59
+
60
+ //! Casts a derived class to its non-virtual base class in a way that safely supports abstract classes
61
+ /*! This should be used in cases when a derived type needs to serialize its base type. This is better than directly
62
+ using static_cast, as it allows for serialization of pure virtual (abstract) base classes.
63
+
64
+ This also automatically registers polymorphic relation between the base and derived class, assuming they
65
+ are indeed polymorphic. Note this is not the same as polymorphic type registration. For more information
66
+ see the documentation on polymorphism. If using a polymorphic class, be sure to include support for
67
+ polymorphism (cereal/types/polymorphic.hpp).
68
+
69
+ \sa virtual_base_class
70
+
71
+ @code{.cpp}
72
+ struct MyBase
73
+ {
74
+ int x;
75
+
76
+ virtual void foo() = 0;
77
+
78
+ template <class Archive>
79
+ void serialize( Archive & ar )
80
+ {
81
+ ar( x );
82
+ }
83
+ };
84
+
85
+ struct MyDerived : public MyBase //<-- Note non-virtual inheritance
86
+ {
87
+ int y;
88
+
89
+ virtual void foo() {};
90
+
91
+ template <class Archive>
92
+ void serialize( Archive & ar )
93
+ {
94
+ ar( cereal::base_class<MyBase>(this) );
95
+ ar( y );
96
+ }
97
+ };
98
+ @endcode */
99
+ template<class Base>
100
+ struct base_class : private traits::detail::BaseCastBase
101
+ {
102
+ template<class Derived>
103
+ base_class(Derived const * derived) :
104
+ base_ptr(const_cast<Base*>(static_cast<Base const *>(derived)))
105
+ {
106
+ static_assert( std::is_base_of<Base, Derived>::value, "Can only use base_class on a valid base class" );
107
+ base_class_detail::RegisterPolymorphicBaseClass<Base, Derived>::bind();
108
+ }
109
+
110
+ Base * base_ptr;
111
+ };
112
+
113
+ //! Casts a derived class to its virtual base class in a way that allows cereal to track inheritance
114
+ /*! This should be used in cases when a derived type features virtual inheritance from some
115
+ base type. This allows cereal to track the inheritance and to avoid making duplicate copies
116
+ during serialization.
117
+
118
+ It is safe to use virtual_base_class in all circumstances for serializing base classes, even in cases
119
+ where virtual inheritance does not take place, though it may be slightly faster to utilize
120
+ cereal::base_class<> if you do not need to worry about virtual inheritance.
121
+
122
+ This also automatically registers polymorphic relation between the base and derived class, assuming they
123
+ are indeed polymorphic. Note this is not the same as polymorphic type registration. For more information
124
+ see the documentation on polymorphism. If using a polymorphic class, be sure to include support for
125
+ polymorphism (cereal/types/polymorphic.hpp).
126
+
127
+ \sa base_class
128
+
129
+ @code{.cpp}
130
+ struct MyBase
131
+ {
132
+ int x;
133
+
134
+ template <class Archive>
135
+ void serialize( Archive & ar )
136
+ {
137
+ ar( x );
138
+ }
139
+ };
140
+
141
+ struct MyLeft : virtual MyBase //<-- Note the virtual inheritance
142
+ {
143
+ int y;
144
+
145
+ template <class Archive>
146
+ void serialize( Archive & ar )
147
+ {
148
+ ar( cereal::virtual_base_class<MyBase>( this ) );
149
+ ar( y );
150
+ }
151
+ };
152
+
153
+ struct MyRight : virtual MyBase
154
+ {
155
+ int z;
156
+
157
+ template <class Archive>
158
+ void serialize( Archive & ar )
159
+ {
160
+ ar( cereal::virtual_base_clas<MyBase>( this ) );
161
+ ar( z );
162
+ }
163
+ };
164
+
165
+ // diamond virtual inheritance; contains one copy of each base class
166
+ struct MyDerived : virtual MyLeft, virtual MyRight
167
+ {
168
+ int a;
169
+
170
+ template <class Archive>
171
+ void serialize( Archive & ar )
172
+ {
173
+ ar( cereal::virtual_base_class<MyLeft>( this ) ); // safely serialize data members in MyLeft
174
+ ar( cereal::virtual_base_class<MyRight>( this ) ); // safely serialize data members in MyRight
175
+ ar( a );
176
+
177
+ // Because we used virtual_base_class, cereal will ensure that only one instance of MyBase is
178
+ // serialized as we traverse the inheritance heirarchy. This means that there will be one copy
179
+ // each of the variables x, y, z, and a
180
+
181
+ // If we had chosen to use static_cast<> instead, cereal would perform no tracking and
182
+ // assume that every base class should be serialized (in this case leading to a duplicate
183
+ // serialization of MyBase due to diamond inheritance
184
+ };
185
+ }
186
+ @endcode */
187
+ template<class Base>
188
+ struct virtual_base_class : private traits::detail::BaseCastBase
189
+ {
190
+ template<class Derived>
191
+ virtual_base_class(Derived const * derived) :
192
+ base_ptr(const_cast<Base*>(static_cast<Base const *>(derived)))
193
+ {
194
+ static_assert( std::is_base_of<Base, Derived>::value, "Can only use virtual_base_class on a valid base class" );
195
+ base_class_detail::RegisterPolymorphicBaseClass<Base, Derived>::bind();
196
+ }
197
+
198
+ Base * base_ptr;
199
+ };
200
+
201
+ } // namespace cereal
202
+
203
+ #endif // CEREAL_TYPES_BASE_CLASS_HPP_
@@ -0,0 +1,176 @@
1
+ /*! \file bitset.hpp
2
+ \brief Support for types found in \<bitset\>
3
+ \ingroup STLSupport */
4
+ /*
5
+ Copyright (c) 2014, Randolph Voorhies, Shane Grant
6
+ All rights reserved.
7
+
8
+ Redistribution and use in source and binary forms, with or without
9
+ modification, are permitted provided that the following conditions are met:
10
+ * Redistributions of source code must retain the above copyright
11
+ notice, this list of conditions and the following disclaimer.
12
+ * Redistributions in binary form must reproduce the above copyright
13
+ notice, this list of conditions and the following disclaimer in the
14
+ documentation and/or other materials provided with the distribution.
15
+ * Neither the name of cereal nor the
16
+ names of its contributors may be used to endorse or promote products
17
+ derived from this software without specific prior written permission.
18
+
19
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
+ DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY
23
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
26
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
+ */
30
+ #ifndef CEREAL_TYPES_BITSET_HPP_
31
+ #define CEREAL_TYPES_BITSET_HPP_
32
+
33
+ #include "cereal/cereal.hpp"
34
+ #include "cereal/types/string.hpp"
35
+ #include <bitset>
36
+
37
+ namespace cereal
38
+ {
39
+ namespace bitset_detail
40
+ {
41
+ //! The type the bitset is encoded with
42
+ /*! @internal */
43
+ enum class type : uint8_t
44
+ {
45
+ ulong,
46
+ ullong,
47
+ string,
48
+ bits
49
+ };
50
+ }
51
+
52
+ //! Serializing (save) for std::bitset when BinaryData optimization supported
53
+ template <class Archive, size_t N,
54
+ traits::EnableIf<traits::is_output_serializable<BinaryData<std::uint32_t>, Archive>::value>
55
+ = traits::sfinae> inline
56
+ void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::bitset<N> const & bits )
57
+ {
58
+ ar( CEREAL_NVP_("type", bitset_detail::type::bits) );
59
+
60
+ // Serialize 8 bit chunks
61
+ std::uint8_t chunk = 0;
62
+ std::uint8_t mask = 0x80;
63
+
64
+ // Set each chunk using a rotating mask for the current bit
65
+ for( std::size_t i = 0; i < N; ++i )
66
+ {
67
+ if( bits[i] )
68
+ chunk |= mask;
69
+
70
+ mask = static_cast<std::uint8_t>(mask >> 1);
71
+
72
+ // output current chunk when mask is empty (8 bits)
73
+ if( mask == 0 )
74
+ {
75
+ ar( chunk );
76
+ chunk = 0;
77
+ mask = 0x80;
78
+ }
79
+ }
80
+
81
+ // serialize remainder, if it exists
82
+ if( mask != 0x80 )
83
+ ar( chunk );
84
+ }
85
+
86
+ //! Serializing (save) for std::bitset when BinaryData is not supported
87
+ template <class Archive, size_t N,
88
+ traits::DisableIf<traits::is_output_serializable<BinaryData<std::uint32_t>, Archive>::value>
89
+ = traits::sfinae> inline
90
+ void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::bitset<N> const & bits )
91
+ {
92
+ try
93
+ {
94
+ auto const b = bits.to_ulong();
95
+ ar( CEREAL_NVP_("type", bitset_detail::type::ulong) );
96
+ ar( CEREAL_NVP_("data", b) );
97
+ }
98
+ catch( std::overflow_error const & )
99
+ {
100
+ try
101
+ {
102
+ auto const b = bits.to_ullong();
103
+ ar( CEREAL_NVP_("type", bitset_detail::type::ullong) );
104
+ ar( CEREAL_NVP_("data", b) );
105
+ }
106
+ catch( std::overflow_error const & )
107
+ {
108
+ ar( CEREAL_NVP_("type", bitset_detail::type::string) );
109
+ ar( CEREAL_NVP_("data", bits.to_string()) );
110
+ }
111
+ }
112
+ }
113
+
114
+ //! Serializing (load) for std::bitset
115
+ template <class Archive, size_t N> inline
116
+ void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::bitset<N> & bits )
117
+ {
118
+ bitset_detail::type t;
119
+ ar( CEREAL_NVP_("type", t) );
120
+
121
+ switch( t )
122
+ {
123
+ case bitset_detail::type::ulong:
124
+ {
125
+ unsigned long b;
126
+ ar( CEREAL_NVP_("data", b) );
127
+ bits = std::bitset<N>( b );
128
+ break;
129
+ }
130
+ case bitset_detail::type::ullong:
131
+ {
132
+ unsigned long long b;
133
+ ar( CEREAL_NVP_("data", b) );
134
+ bits = std::bitset<N>( b );
135
+ break;
136
+ }
137
+ case bitset_detail::type::string:
138
+ {
139
+ std::string b;
140
+ ar( CEREAL_NVP_("data", b) );
141
+ bits = std::bitset<N>( b );
142
+ break;
143
+ }
144
+ case bitset_detail::type::bits:
145
+ {
146
+ // Normally we would use BinaryData to route this at compile time,
147
+ // but doing this at runtime doesn't break any old serialization
148
+ std::uint8_t chunk = 0;
149
+ std::uint8_t mask = 0;
150
+
151
+ bits.reset();
152
+
153
+ // Load one chunk at a time, rotating through the chunk
154
+ // to set bits in the bitset
155
+ for( std::size_t i = 0; i < N; ++i )
156
+ {
157
+ if( mask == 0 )
158
+ {
159
+ ar( chunk );
160
+ mask = 0x80;
161
+ }
162
+
163
+ if( chunk & mask )
164
+ bits[i] = 1;
165
+
166
+ mask = static_cast<std::uint8_t>(mask >> 1);
167
+ }
168
+ break;
169
+ }
170
+ default:
171
+ throw Exception("Invalid bitset data representation");
172
+ }
173
+ }
174
+ } // namespace cereal
175
+
176
+ #endif // CEREAL_TYPES_BITSET_HPP_
@@ -0,0 +1,164 @@
1
+ /*! \file boost_variant.hpp
2
+ \brief Support for boost::variant
3
+ \ingroup OtherTypes */
4
+ /*
5
+ Copyright (c) 2014, Randolph Voorhies, Shane Grant
6
+ All rights reserved.
7
+
8
+ Redistribution and use in source and binary forms, with or without
9
+ modification, are permitted provided that the following conditions are met:
10
+ * Redistributions of source code must retain the above copyright
11
+ notice, this list of conditions and the following disclaimer.
12
+ * Redistributions in binary form must reproduce the above copyright
13
+ notice, this list of conditions and the following disclaimer in the
14
+ documentation and/or other materials provided with the distribution.
15
+ * Neither the name of cereal nor the
16
+ names of its contributors may be used to endorse or promote products
17
+ derived from this software without specific prior written permission.
18
+
19
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
+ DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY
23
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
26
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
+ */
30
+ #ifndef CEREAL_TYPES_BOOST_VARIANT_HPP_
31
+ #define CEREAL_TYPES_BOOST_VARIANT_HPP_
32
+
33
+ //! @internal
34
+ #if defined(_MSC_VER) && _MSC_VER < 1911
35
+ #define CEREAL_CONSTEXPR_LAMBDA
36
+ #else // MSVC 2017 or newer, all other compilers
37
+ #define CEREAL_CONSTEXPR_LAMBDA constexpr
38
+ #endif
39
+
40
+ #include "cereal/cereal.hpp"
41
+ #include <boost/variant/variant_fwd.hpp>
42
+ #include <boost/variant/static_visitor.hpp>
43
+
44
+ namespace cereal
45
+ {
46
+ namespace boost_variant_detail
47
+ {
48
+ //! @internal
49
+ template <class Archive>
50
+ struct variant_save_visitor : boost::static_visitor<>
51
+ {
52
+ variant_save_visitor(Archive & ar_) : ar(ar_) {}
53
+
54
+ template<class T>
55
+ void operator()(T const & value) const
56
+ {
57
+ ar( CEREAL_NVP_("data", value) );
58
+ }
59
+
60
+ Archive & ar;
61
+ };
62
+
63
+ //! @internal
64
+ template <class Archive, class T>
65
+ struct LoadAndConstructLoadWrapper
66
+ {
67
+ using ST = typename std::aligned_storage<sizeof(T), CEREAL_ALIGNOF(T)>::type;
68
+
69
+ LoadAndConstructLoadWrapper() :
70
+ construct( reinterpret_cast<T *>( &st ) )
71
+ { }
72
+
73
+ ~LoadAndConstructLoadWrapper()
74
+ {
75
+ if (construct.itsValid)
76
+ {
77
+ construct->~T();
78
+ }
79
+ }
80
+
81
+ void CEREAL_SERIALIZE_FUNCTION_NAME( Archive & ar )
82
+ {
83
+ ::cereal::detail::Construct<T, Archive>::load_andor_construct( ar, construct );
84
+ }
85
+
86
+ ST st;
87
+ ::cereal::construct<T> construct;
88
+ };
89
+
90
+ //! @internal
91
+ template <class T> struct load_variant_wrapper;
92
+
93
+ //! Avoid serializing variant void_ type
94
+ /*! @internal */
95
+ template <>
96
+ struct load_variant_wrapper<boost::detail::variant::void_>
97
+ {
98
+ template <class Variant, class Archive>
99
+ static void load_variant( Archive &, Variant & )
100
+ { }
101
+ };
102
+
103
+ //! @internal
104
+ template <class T>
105
+ struct load_variant_wrapper
106
+ {
107
+ // default constructible
108
+ template <class Archive, class Variant>
109
+ static void load_variant_impl( Archive & ar, Variant & variant, std::true_type )
110
+ {
111
+ T value;
112
+ ar( CEREAL_NVP_("data", value) );
113
+ variant = std::move(value);
114
+ }
115
+
116
+ // not default constructible
117
+ template<class Variant, class Archive>
118
+ static void load_variant_impl(Archive & ar, Variant & variant, std::false_type )
119
+ {
120
+ LoadAndConstructLoadWrapper<Archive, T> loadWrapper;
121
+
122
+ ar( CEREAL_NVP_("data", loadWrapper) );
123
+ variant = std::move(*loadWrapper.construct.ptr());
124
+ }
125
+
126
+ //! @internal
127
+ template<class Variant, class Archive>
128
+ static void load_variant(Archive & ar, Variant & variant)
129
+ {
130
+ load_variant_impl( ar, variant, typename std::is_default_constructible<T>::type() );
131
+ }
132
+ };
133
+ } // namespace boost_variant_detail
134
+
135
+ //! Saving for boost::variant
136
+ template <class Archive, typename ... VariantTypes> inline
137
+ void CEREAL_SAVE_FUNCTION_NAME( Archive & ar, boost::variant<VariantTypes...> const & variant )
138
+ {
139
+ int32_t which = variant.which();
140
+ ar( CEREAL_NVP_("which", which) );
141
+ boost_variant_detail::variant_save_visitor<Archive> visitor(ar);
142
+ variant.apply_visitor(visitor);
143
+ }
144
+
145
+ //! Loading for boost::variant
146
+ template <class Archive, typename ... VariantTypes> inline
147
+ void CEREAL_LOAD_FUNCTION_NAME( Archive & ar, boost::variant<VariantTypes...> & variant )
148
+ {
149
+ int32_t which;
150
+ ar( CEREAL_NVP_("which", which) );
151
+
152
+ using LoadFuncType = void(*)(Archive &, boost::variant<VariantTypes...> &);
153
+ CEREAL_CONSTEXPR_LAMBDA LoadFuncType loadFuncArray[] = {&boost_variant_detail::load_variant_wrapper<VariantTypes>::load_variant...};
154
+
155
+ if(which >= int32_t(sizeof(loadFuncArray)/sizeof(loadFuncArray[0])))
156
+ throw Exception("Invalid 'which' selector when deserializing boost::variant");
157
+
158
+ loadFuncArray[which](ar, variant);
159
+ }
160
+ } // namespace cereal
161
+
162
+ #undef CEREAL_CONSTEXPR_LAMBDA
163
+
164
+ #endif // CEREAL_TYPES_BOOST_VARIANT_HPP_