isotree 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +8 -1
  3. data/LICENSE.txt +2 -2
  4. data/README.md +32 -14
  5. data/ext/isotree/ext.cpp +144 -31
  6. data/ext/isotree/extconf.rb +7 -7
  7. data/lib/isotree/isolation_forest.rb +110 -30
  8. data/lib/isotree/version.rb +1 -1
  9. data/vendor/isotree/LICENSE +1 -1
  10. data/vendor/isotree/README.md +165 -27
  11. data/vendor/isotree/include/isotree.hpp +2111 -0
  12. data/vendor/isotree/include/isotree_oop.hpp +394 -0
  13. data/vendor/isotree/inst/COPYRIGHTS +62 -0
  14. data/vendor/isotree/src/RcppExports.cpp +525 -52
  15. data/vendor/isotree/src/Rwrapper.cpp +1931 -268
  16. data/vendor/isotree/src/c_interface.cpp +953 -0
  17. data/vendor/isotree/src/crit.hpp +4232 -0
  18. data/vendor/isotree/src/dist.hpp +1886 -0
  19. data/vendor/isotree/src/exp_depth_table.hpp +134 -0
  20. data/vendor/isotree/src/extended.hpp +1444 -0
  21. data/vendor/isotree/src/external_facing_generic.hpp +399 -0
  22. data/vendor/isotree/src/fit_model.hpp +2401 -0
  23. data/vendor/isotree/src/{dealloc.cpp → headers_joined.hpp} +38 -22
  24. data/vendor/isotree/src/helpers_iforest.hpp +813 -0
  25. data/vendor/isotree/src/{impute.cpp → impute.hpp} +353 -122
  26. data/vendor/isotree/src/indexer.cpp +515 -0
  27. data/vendor/isotree/src/instantiate_template_headers.cpp +118 -0
  28. data/vendor/isotree/src/instantiate_template_headers.hpp +240 -0
  29. data/vendor/isotree/src/isoforest.hpp +1659 -0
  30. data/vendor/isotree/src/isotree.hpp +1804 -392
  31. data/vendor/isotree/src/isotree_exportable.hpp +99 -0
  32. data/vendor/isotree/src/merge_models.cpp +159 -16
  33. data/vendor/isotree/src/mult.hpp +1321 -0
  34. data/vendor/isotree/src/oop_interface.cpp +842 -0
  35. data/vendor/isotree/src/oop_interface.hpp +278 -0
  36. data/vendor/isotree/src/other_helpers.hpp +219 -0
  37. data/vendor/isotree/src/predict.hpp +1932 -0
  38. data/vendor/isotree/src/python_helpers.hpp +134 -0
  39. data/vendor/isotree/src/ref_indexer.hpp +154 -0
  40. data/vendor/isotree/src/robinmap/LICENSE +21 -0
  41. data/vendor/isotree/src/robinmap/README.md +483 -0
  42. data/vendor/isotree/src/robinmap/include/tsl/robin_growth_policy.h +406 -0
  43. data/vendor/isotree/src/robinmap/include/tsl/robin_hash.h +1620 -0
  44. data/vendor/isotree/src/robinmap/include/tsl/robin_map.h +807 -0
  45. data/vendor/isotree/src/robinmap/include/tsl/robin_set.h +660 -0
  46. data/vendor/isotree/src/serialize.cpp +4300 -139
  47. data/vendor/isotree/src/sql.cpp +141 -59
  48. data/vendor/isotree/src/subset_models.cpp +174 -0
  49. data/vendor/isotree/src/utils.hpp +3808 -0
  50. data/vendor/isotree/src/xoshiro.hpp +467 -0
  51. data/vendor/isotree/src/ziggurat.hpp +405 -0
  52. metadata +38 -104
  53. data/vendor/cereal/LICENSE +0 -24
  54. data/vendor/cereal/README.md +0 -85
  55. data/vendor/cereal/include/cereal/access.hpp +0 -351
  56. data/vendor/cereal/include/cereal/archives/adapters.hpp +0 -163
  57. data/vendor/cereal/include/cereal/archives/binary.hpp +0 -169
  58. data/vendor/cereal/include/cereal/archives/json.hpp +0 -1019
  59. data/vendor/cereal/include/cereal/archives/portable_binary.hpp +0 -334
  60. data/vendor/cereal/include/cereal/archives/xml.hpp +0 -956
  61. data/vendor/cereal/include/cereal/cereal.hpp +0 -1089
  62. data/vendor/cereal/include/cereal/details/helpers.hpp +0 -422
  63. data/vendor/cereal/include/cereal/details/polymorphic_impl.hpp +0 -796
  64. data/vendor/cereal/include/cereal/details/polymorphic_impl_fwd.hpp +0 -65
  65. data/vendor/cereal/include/cereal/details/static_object.hpp +0 -127
  66. data/vendor/cereal/include/cereal/details/traits.hpp +0 -1411
  67. data/vendor/cereal/include/cereal/details/util.hpp +0 -84
  68. data/vendor/cereal/include/cereal/external/base64.hpp +0 -134
  69. data/vendor/cereal/include/cereal/external/rapidjson/allocators.h +0 -284
  70. data/vendor/cereal/include/cereal/external/rapidjson/cursorstreamwrapper.h +0 -78
  71. data/vendor/cereal/include/cereal/external/rapidjson/document.h +0 -2652
  72. data/vendor/cereal/include/cereal/external/rapidjson/encodedstream.h +0 -299
  73. data/vendor/cereal/include/cereal/external/rapidjson/encodings.h +0 -716
  74. data/vendor/cereal/include/cereal/external/rapidjson/error/en.h +0 -74
  75. data/vendor/cereal/include/cereal/external/rapidjson/error/error.h +0 -161
  76. data/vendor/cereal/include/cereal/external/rapidjson/filereadstream.h +0 -99
  77. data/vendor/cereal/include/cereal/external/rapidjson/filewritestream.h +0 -104
  78. data/vendor/cereal/include/cereal/external/rapidjson/fwd.h +0 -151
  79. data/vendor/cereal/include/cereal/external/rapidjson/internal/biginteger.h +0 -290
  80. data/vendor/cereal/include/cereal/external/rapidjson/internal/diyfp.h +0 -271
  81. data/vendor/cereal/include/cereal/external/rapidjson/internal/dtoa.h +0 -245
  82. data/vendor/cereal/include/cereal/external/rapidjson/internal/ieee754.h +0 -78
  83. data/vendor/cereal/include/cereal/external/rapidjson/internal/itoa.h +0 -308
  84. data/vendor/cereal/include/cereal/external/rapidjson/internal/meta.h +0 -186
  85. data/vendor/cereal/include/cereal/external/rapidjson/internal/pow10.h +0 -55
  86. data/vendor/cereal/include/cereal/external/rapidjson/internal/regex.h +0 -740
  87. data/vendor/cereal/include/cereal/external/rapidjson/internal/stack.h +0 -232
  88. data/vendor/cereal/include/cereal/external/rapidjson/internal/strfunc.h +0 -69
  89. data/vendor/cereal/include/cereal/external/rapidjson/internal/strtod.h +0 -290
  90. data/vendor/cereal/include/cereal/external/rapidjson/internal/swap.h +0 -46
  91. data/vendor/cereal/include/cereal/external/rapidjson/istreamwrapper.h +0 -128
  92. data/vendor/cereal/include/cereal/external/rapidjson/memorybuffer.h +0 -70
  93. data/vendor/cereal/include/cereal/external/rapidjson/memorystream.h +0 -71
  94. data/vendor/cereal/include/cereal/external/rapidjson/msinttypes/inttypes.h +0 -316
  95. data/vendor/cereal/include/cereal/external/rapidjson/msinttypes/stdint.h +0 -300
  96. data/vendor/cereal/include/cereal/external/rapidjson/ostreamwrapper.h +0 -81
  97. data/vendor/cereal/include/cereal/external/rapidjson/pointer.h +0 -1414
  98. data/vendor/cereal/include/cereal/external/rapidjson/prettywriter.h +0 -277
  99. data/vendor/cereal/include/cereal/external/rapidjson/rapidjson.h +0 -656
  100. data/vendor/cereal/include/cereal/external/rapidjson/reader.h +0 -2230
  101. data/vendor/cereal/include/cereal/external/rapidjson/schema.h +0 -2497
  102. data/vendor/cereal/include/cereal/external/rapidjson/stream.h +0 -223
  103. data/vendor/cereal/include/cereal/external/rapidjson/stringbuffer.h +0 -121
  104. data/vendor/cereal/include/cereal/external/rapidjson/writer.h +0 -709
  105. data/vendor/cereal/include/cereal/external/rapidxml/license.txt +0 -52
  106. data/vendor/cereal/include/cereal/external/rapidxml/manual.html +0 -406
  107. data/vendor/cereal/include/cereal/external/rapidxml/rapidxml.hpp +0 -2624
  108. data/vendor/cereal/include/cereal/external/rapidxml/rapidxml_iterators.hpp +0 -175
  109. data/vendor/cereal/include/cereal/external/rapidxml/rapidxml_print.hpp +0 -428
  110. data/vendor/cereal/include/cereal/external/rapidxml/rapidxml_utils.hpp +0 -123
  111. data/vendor/cereal/include/cereal/macros.hpp +0 -154
  112. data/vendor/cereal/include/cereal/specialize.hpp +0 -139
  113. data/vendor/cereal/include/cereal/types/array.hpp +0 -79
  114. data/vendor/cereal/include/cereal/types/atomic.hpp +0 -55
  115. data/vendor/cereal/include/cereal/types/base_class.hpp +0 -203
  116. data/vendor/cereal/include/cereal/types/bitset.hpp +0 -176
  117. data/vendor/cereal/include/cereal/types/boost_variant.hpp +0 -164
  118. data/vendor/cereal/include/cereal/types/chrono.hpp +0 -72
  119. data/vendor/cereal/include/cereal/types/common.hpp +0 -129
  120. data/vendor/cereal/include/cereal/types/complex.hpp +0 -56
  121. data/vendor/cereal/include/cereal/types/concepts/pair_associative_container.hpp +0 -73
  122. data/vendor/cereal/include/cereal/types/deque.hpp +0 -62
  123. data/vendor/cereal/include/cereal/types/forward_list.hpp +0 -68
  124. data/vendor/cereal/include/cereal/types/functional.hpp +0 -43
  125. data/vendor/cereal/include/cereal/types/list.hpp +0 -62
  126. data/vendor/cereal/include/cereal/types/map.hpp +0 -36
  127. data/vendor/cereal/include/cereal/types/memory.hpp +0 -425
  128. data/vendor/cereal/include/cereal/types/optional.hpp +0 -66
  129. data/vendor/cereal/include/cereal/types/polymorphic.hpp +0 -483
  130. data/vendor/cereal/include/cereal/types/queue.hpp +0 -132
  131. data/vendor/cereal/include/cereal/types/set.hpp +0 -103
  132. data/vendor/cereal/include/cereal/types/stack.hpp +0 -76
  133. data/vendor/cereal/include/cereal/types/string.hpp +0 -61
  134. data/vendor/cereal/include/cereal/types/tuple.hpp +0 -123
  135. data/vendor/cereal/include/cereal/types/unordered_map.hpp +0 -36
  136. data/vendor/cereal/include/cereal/types/unordered_set.hpp +0 -99
  137. data/vendor/cereal/include/cereal/types/utility.hpp +0 -47
  138. data/vendor/cereal/include/cereal/types/valarray.hpp +0 -89
  139. data/vendor/cereal/include/cereal/types/variant.hpp +0 -109
  140. data/vendor/cereal/include/cereal/types/vector.hpp +0 -112
  141. data/vendor/cereal/include/cereal/version.hpp +0 -52
  142. data/vendor/isotree/src/Makevars +0 -4
  143. data/vendor/isotree/src/crit.cpp +0 -912
  144. data/vendor/isotree/src/dist.cpp +0 -749
  145. data/vendor/isotree/src/extended.cpp +0 -790
  146. data/vendor/isotree/src/fit_model.cpp +0 -1090
  147. data/vendor/isotree/src/helpers_iforest.cpp +0 -324
  148. data/vendor/isotree/src/isoforest.cpp +0 -771
  149. data/vendor/isotree/src/mult.cpp +0 -607
  150. data/vendor/isotree/src/predict.cpp +0 -853
  151. data/vendor/isotree/src/utils.cpp +0 -1566
@@ -1,245 +0,0 @@
1
- // Tencent is pleased to support the open source community by making RapidJSON available.
2
- //
3
- // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
4
- //
5
- // Licensed under the MIT License (the "License"); you may not use this file except
6
- // in compliance with the License. You may obtain a copy of the License at
7
- //
8
- // http://opensource.org/licenses/MIT
9
- //
10
- // Unless required by applicable law or agreed to in writing, software distributed
11
- // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
12
- // CONDITIONS OF ANY KIND, either express or implied. See the License for the
13
- // specific language governing permissions and limitations under the License.
14
-
15
- // This is a C++ header-only implementation of Grisu2 algorithm from the publication:
16
- // Loitsch, Florian. "Printing floating-point numbers quickly and accurately with
17
- // integers." ACM Sigplan Notices 45.6 (2010): 233-243.
18
-
19
- #ifndef CEREAL_RAPIDJSON_DTOA_
20
- #define CEREAL_RAPIDJSON_DTOA_
21
-
22
- #include "itoa.h" // GetDigitsLut()
23
- #include "diyfp.h"
24
- #include "ieee754.h"
25
-
26
- CEREAL_RAPIDJSON_NAMESPACE_BEGIN
27
- namespace internal {
28
-
29
- #ifdef __GNUC__
30
- CEREAL_RAPIDJSON_DIAG_PUSH
31
- CEREAL_RAPIDJSON_DIAG_OFF(effc++)
32
- CEREAL_RAPIDJSON_DIAG_OFF(array-bounds) // some gcc versions generate wrong warnings https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59124
33
- #endif
34
-
35
- inline void GrisuRound(char* buffer, int len, uint64_t delta, uint64_t rest, uint64_t ten_kappa, uint64_t wp_w) {
36
- while (rest < wp_w && delta - rest >= ten_kappa &&
37
- (rest + ten_kappa < wp_w || /// closer
38
- wp_w - rest > rest + ten_kappa - wp_w)) {
39
- buffer[len - 1]--;
40
- rest += ten_kappa;
41
- }
42
- }
43
-
44
- inline int CountDecimalDigit32(uint32_t n) {
45
- // Simple pure C++ implementation was faster than __builtin_clz version in this situation.
46
- if (n < 10) return 1;
47
- if (n < 100) return 2;
48
- if (n < 1000) return 3;
49
- if (n < 10000) return 4;
50
- if (n < 100000) return 5;
51
- if (n < 1000000) return 6;
52
- if (n < 10000000) return 7;
53
- if (n < 100000000) return 8;
54
- // Will not reach 10 digits in DigitGen()
55
- //if (n < 1000000000) return 9;
56
- //return 10;
57
- return 9;
58
- }
59
-
60
- inline void DigitGen(const DiyFp& W, const DiyFp& Mp, uint64_t delta, char* buffer, int* len, int* K) {
61
- static const uint32_t kPow10[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 };
62
- const DiyFp one(uint64_t(1) << -Mp.e, Mp.e);
63
- const DiyFp wp_w = Mp - W;
64
- uint32_t p1 = static_cast<uint32_t>(Mp.f >> -one.e);
65
- uint64_t p2 = Mp.f & (one.f - 1);
66
- int kappa = CountDecimalDigit32(p1); // kappa in [0, 9]
67
- *len = 0;
68
-
69
- while (kappa > 0) {
70
- uint32_t d = 0;
71
- switch (kappa) {
72
- case 9: d = p1 / 100000000; p1 %= 100000000; break;
73
- case 8: d = p1 / 10000000; p1 %= 10000000; break;
74
- case 7: d = p1 / 1000000; p1 %= 1000000; break;
75
- case 6: d = p1 / 100000; p1 %= 100000; break;
76
- case 5: d = p1 / 10000; p1 %= 10000; break;
77
- case 4: d = p1 / 1000; p1 %= 1000; break;
78
- case 3: d = p1 / 100; p1 %= 100; break;
79
- case 2: d = p1 / 10; p1 %= 10; break;
80
- case 1: d = p1; p1 = 0; break;
81
- default:;
82
- }
83
- if (d || *len)
84
- buffer[(*len)++] = static_cast<char>('0' + static_cast<char>(d));
85
- kappa--;
86
- uint64_t tmp = (static_cast<uint64_t>(p1) << -one.e) + p2;
87
- if (tmp <= delta) {
88
- *K += kappa;
89
- GrisuRound(buffer, *len, delta, tmp, static_cast<uint64_t>(kPow10[kappa]) << -one.e, wp_w.f);
90
- return;
91
- }
92
- }
93
-
94
- // kappa = 0
95
- for (;;) {
96
- p2 *= 10;
97
- delta *= 10;
98
- char d = static_cast<char>(p2 >> -one.e);
99
- if (d || *len)
100
- buffer[(*len)++] = static_cast<char>('0' + d);
101
- p2 &= one.f - 1;
102
- kappa--;
103
- if (p2 < delta) {
104
- *K += kappa;
105
- int index = -kappa;
106
- GrisuRound(buffer, *len, delta, p2, one.f, wp_w.f * (index < 9 ? kPow10[index] : 0));
107
- return;
108
- }
109
- }
110
- }
111
-
112
- inline void Grisu2(double value, char* buffer, int* length, int* K) {
113
- const DiyFp v(value);
114
- DiyFp w_m, w_p;
115
- v.NormalizedBoundaries(&w_m, &w_p);
116
-
117
- const DiyFp c_mk = GetCachedPower(w_p.e, K);
118
- const DiyFp W = v.Normalize() * c_mk;
119
- DiyFp Wp = w_p * c_mk;
120
- DiyFp Wm = w_m * c_mk;
121
- Wm.f++;
122
- Wp.f--;
123
- DigitGen(W, Wp, Wp.f - Wm.f, buffer, length, K);
124
- }
125
-
126
- inline char* WriteExponent(int K, char* buffer) {
127
- if (K < 0) {
128
- *buffer++ = '-';
129
- K = -K;
130
- }
131
-
132
- if (K >= 100) {
133
- *buffer++ = static_cast<char>('0' + static_cast<char>(K / 100));
134
- K %= 100;
135
- const char* d = GetDigitsLut() + K * 2;
136
- *buffer++ = d[0];
137
- *buffer++ = d[1];
138
- }
139
- else if (K >= 10) {
140
- const char* d = GetDigitsLut() + K * 2;
141
- *buffer++ = d[0];
142
- *buffer++ = d[1];
143
- }
144
- else
145
- *buffer++ = static_cast<char>('0' + static_cast<char>(K));
146
-
147
- return buffer;
148
- }
149
-
150
- inline char* Prettify(char* buffer, int length, int k, int maxDecimalPlaces) {
151
- const int kk = length + k; // 10^(kk-1) <= v < 10^kk
152
-
153
- if (0 <= k && kk <= 21) {
154
- // 1234e7 -> 12340000000
155
- for (int i = length; i < kk; i++)
156
- buffer[i] = '0';
157
- buffer[kk] = '.';
158
- buffer[kk + 1] = '0';
159
- return &buffer[kk + 2];
160
- }
161
- else if (0 < kk && kk <= 21) {
162
- // 1234e-2 -> 12.34
163
- std::memmove(&buffer[kk + 1], &buffer[kk], static_cast<size_t>(length - kk));
164
- buffer[kk] = '.';
165
- if (0 > k + maxDecimalPlaces) {
166
- // When maxDecimalPlaces = 2, 1.2345 -> 1.23, 1.102 -> 1.1
167
- // Remove extra trailing zeros (at least one) after truncation.
168
- for (int i = kk + maxDecimalPlaces; i > kk + 1; i--)
169
- if (buffer[i] != '0')
170
- return &buffer[i + 1];
171
- return &buffer[kk + 2]; // Reserve one zero
172
- }
173
- else
174
- return &buffer[length + 1];
175
- }
176
- else if (-6 < kk && kk <= 0) {
177
- // 1234e-6 -> 0.001234
178
- const int offset = 2 - kk;
179
- std::memmove(&buffer[offset], &buffer[0], static_cast<size_t>(length));
180
- buffer[0] = '0';
181
- buffer[1] = '.';
182
- for (int i = 2; i < offset; i++)
183
- buffer[i] = '0';
184
- if (length - kk > maxDecimalPlaces) {
185
- // When maxDecimalPlaces = 2, 0.123 -> 0.12, 0.102 -> 0.1
186
- // Remove extra trailing zeros (at least one) after truncation.
187
- for (int i = maxDecimalPlaces + 1; i > 2; i--)
188
- if (buffer[i] != '0')
189
- return &buffer[i + 1];
190
- return &buffer[3]; // Reserve one zero
191
- }
192
- else
193
- return &buffer[length + offset];
194
- }
195
- else if (kk < -maxDecimalPlaces) {
196
- // Truncate to zero
197
- buffer[0] = '0';
198
- buffer[1] = '.';
199
- buffer[2] = '0';
200
- return &buffer[3];
201
- }
202
- else if (length == 1) {
203
- // 1e30
204
- buffer[1] = 'e';
205
- return WriteExponent(kk - 1, &buffer[2]);
206
- }
207
- else {
208
- // 1234e30 -> 1.234e33
209
- std::memmove(&buffer[2], &buffer[1], static_cast<size_t>(length - 1));
210
- buffer[1] = '.';
211
- buffer[length + 1] = 'e';
212
- return WriteExponent(kk - 1, &buffer[0 + length + 2]);
213
- }
214
- }
215
-
216
- inline char* dtoa(double value, char* buffer, int maxDecimalPlaces = 324) {
217
- CEREAL_RAPIDJSON_ASSERT(maxDecimalPlaces >= 1);
218
- Double d(value);
219
- if (d.IsZero()) {
220
- if (d.Sign())
221
- *buffer++ = '-'; // -0.0, Issue #289
222
- buffer[0] = '0';
223
- buffer[1] = '.';
224
- buffer[2] = '0';
225
- return &buffer[3];
226
- }
227
- else {
228
- if (value < 0) {
229
- *buffer++ = '-';
230
- value = -value;
231
- }
232
- int length, K;
233
- Grisu2(value, buffer, &length, &K);
234
- return Prettify(buffer, length, K, maxDecimalPlaces);
235
- }
236
- }
237
-
238
- #ifdef __GNUC__
239
- CEREAL_RAPIDJSON_DIAG_POP
240
- #endif
241
-
242
- } // namespace internal
243
- CEREAL_RAPIDJSON_NAMESPACE_END
244
-
245
- #endif // CEREAL_RAPIDJSON_DTOA_
@@ -1,78 +0,0 @@
1
- // Tencent is pleased to support the open source community by making RapidJSON available.
2
- //
3
- // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
4
- //
5
- // Licensed under the MIT License (the "License"); you may not use this file except
6
- // in compliance with the License. You may obtain a copy of the License at
7
- //
8
- // http://opensource.org/licenses/MIT
9
- //
10
- // Unless required by applicable law or agreed to in writing, software distributed
11
- // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
12
- // CONDITIONS OF ANY KIND, either express or implied. See the License for the
13
- // specific language governing permissions and limitations under the License.
14
-
15
- #ifndef CEREAL_RAPIDJSON_IEEE754_
16
- #define CEREAL_RAPIDJSON_IEEE754_
17
-
18
- #include "../rapidjson.h"
19
-
20
- CEREAL_RAPIDJSON_NAMESPACE_BEGIN
21
- namespace internal {
22
-
23
- class Double {
24
- public:
25
- Double() {}
26
- Double(double d) : d_(d) {}
27
- Double(uint64_t u) : u_(u) {}
28
-
29
- double Value() const { return d_; }
30
- uint64_t Uint64Value() const { return u_; }
31
-
32
- double NextPositiveDouble() const {
33
- CEREAL_RAPIDJSON_ASSERT(!Sign());
34
- return Double(u_ + 1).Value();
35
- }
36
-
37
- bool Sign() const { return (u_ & kSignMask) != 0; }
38
- uint64_t Significand() const { return u_ & kSignificandMask; }
39
- int Exponent() const { return static_cast<int>(((u_ & kExponentMask) >> kSignificandSize) - kExponentBias); }
40
-
41
- bool IsNan() const { return (u_ & kExponentMask) == kExponentMask && Significand() != 0; }
42
- bool IsInf() const { return (u_ & kExponentMask) == kExponentMask && Significand() == 0; }
43
- bool IsNanOrInf() const { return (u_ & kExponentMask) == kExponentMask; }
44
- bool IsNormal() const { return (u_ & kExponentMask) != 0 || Significand() == 0; }
45
- bool IsZero() const { return (u_ & (kExponentMask | kSignificandMask)) == 0; }
46
-
47
- uint64_t IntegerSignificand() const { return IsNormal() ? Significand() | kHiddenBit : Significand(); }
48
- int IntegerExponent() const { return (IsNormal() ? Exponent() : kDenormalExponent) - kSignificandSize; }
49
- uint64_t ToBias() const { return (u_ & kSignMask) ? ~u_ + 1 : u_ | kSignMask; }
50
-
51
- static int EffectiveSignificandSize(int order) {
52
- if (order >= -1021)
53
- return 53;
54
- else if (order <= -1074)
55
- return 0;
56
- else
57
- return order + 1074;
58
- }
59
-
60
- private:
61
- static const int kSignificandSize = 52;
62
- static const int kExponentBias = 0x3FF;
63
- static const int kDenormalExponent = 1 - kExponentBias;
64
- static const uint64_t kSignMask = CEREAL_RAPIDJSON_UINT64_C2(0x80000000, 0x00000000);
65
- static const uint64_t kExponentMask = CEREAL_RAPIDJSON_UINT64_C2(0x7FF00000, 0x00000000);
66
- static const uint64_t kSignificandMask = CEREAL_RAPIDJSON_UINT64_C2(0x000FFFFF, 0xFFFFFFFF);
67
- static const uint64_t kHiddenBit = CEREAL_RAPIDJSON_UINT64_C2(0x00100000, 0x00000000);
68
-
69
- union {
70
- double d_;
71
- uint64_t u_;
72
- };
73
- };
74
-
75
- } // namespace internal
76
- CEREAL_RAPIDJSON_NAMESPACE_END
77
-
78
- #endif // CEREAL_RAPIDJSON_IEEE754_
@@ -1,308 +0,0 @@
1
- // Tencent is pleased to support the open source community by making RapidJSON available.
2
- //
3
- // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
4
- //
5
- // Licensed under the MIT License (the "License"); you may not use this file except
6
- // in compliance with the License. You may obtain a copy of the License at
7
- //
8
- // http://opensource.org/licenses/MIT
9
- //
10
- // Unless required by applicable law or agreed to in writing, software distributed
11
- // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
12
- // CONDITIONS OF ANY KIND, either express or implied. See the License for the
13
- // specific language governing permissions and limitations under the License.
14
-
15
- #ifndef CEREAL_RAPIDJSON_ITOA_
16
- #define CEREAL_RAPIDJSON_ITOA_
17
-
18
- #include "../rapidjson.h"
19
-
20
- CEREAL_RAPIDJSON_NAMESPACE_BEGIN
21
- namespace internal {
22
-
23
- inline const char* GetDigitsLut() {
24
- static const char cDigitsLut[200] = {
25
- '0','0','0','1','0','2','0','3','0','4','0','5','0','6','0','7','0','8','0','9',
26
- '1','0','1','1','1','2','1','3','1','4','1','5','1','6','1','7','1','8','1','9',
27
- '2','0','2','1','2','2','2','3','2','4','2','5','2','6','2','7','2','8','2','9',
28
- '3','0','3','1','3','2','3','3','3','4','3','5','3','6','3','7','3','8','3','9',
29
- '4','0','4','1','4','2','4','3','4','4','4','5','4','6','4','7','4','8','4','9',
30
- '5','0','5','1','5','2','5','3','5','4','5','5','5','6','5','7','5','8','5','9',
31
- '6','0','6','1','6','2','6','3','6','4','6','5','6','6','6','7','6','8','6','9',
32
- '7','0','7','1','7','2','7','3','7','4','7','5','7','6','7','7','7','8','7','9',
33
- '8','0','8','1','8','2','8','3','8','4','8','5','8','6','8','7','8','8','8','9',
34
- '9','0','9','1','9','2','9','3','9','4','9','5','9','6','9','7','9','8','9','9'
35
- };
36
- return cDigitsLut;
37
- }
38
-
39
- inline char* u32toa(uint32_t value, char* buffer) {
40
- CEREAL_RAPIDJSON_ASSERT(buffer != 0);
41
-
42
- const char* cDigitsLut = GetDigitsLut();
43
-
44
- if (value < 10000) {
45
- const uint32_t d1 = (value / 100) << 1;
46
- const uint32_t d2 = (value % 100) << 1;
47
-
48
- if (value >= 1000)
49
- *buffer++ = cDigitsLut[d1];
50
- if (value >= 100)
51
- *buffer++ = cDigitsLut[d1 + 1];
52
- if (value >= 10)
53
- *buffer++ = cDigitsLut[d2];
54
- *buffer++ = cDigitsLut[d2 + 1];
55
- }
56
- else if (value < 100000000) {
57
- // value = bbbbcccc
58
- const uint32_t b = value / 10000;
59
- const uint32_t c = value % 10000;
60
-
61
- const uint32_t d1 = (b / 100) << 1;
62
- const uint32_t d2 = (b % 100) << 1;
63
-
64
- const uint32_t d3 = (c / 100) << 1;
65
- const uint32_t d4 = (c % 100) << 1;
66
-
67
- if (value >= 10000000)
68
- *buffer++ = cDigitsLut[d1];
69
- if (value >= 1000000)
70
- *buffer++ = cDigitsLut[d1 + 1];
71
- if (value >= 100000)
72
- *buffer++ = cDigitsLut[d2];
73
- *buffer++ = cDigitsLut[d2 + 1];
74
-
75
- *buffer++ = cDigitsLut[d3];
76
- *buffer++ = cDigitsLut[d3 + 1];
77
- *buffer++ = cDigitsLut[d4];
78
- *buffer++ = cDigitsLut[d4 + 1];
79
- }
80
- else {
81
- // value = aabbbbcccc in decimal
82
-
83
- const uint32_t a = value / 100000000; // 1 to 42
84
- value %= 100000000;
85
-
86
- if (a >= 10) {
87
- const unsigned i = a << 1;
88
- *buffer++ = cDigitsLut[i];
89
- *buffer++ = cDigitsLut[i + 1];
90
- }
91
- else
92
- *buffer++ = static_cast<char>('0' + static_cast<char>(a));
93
-
94
- const uint32_t b = value / 10000; // 0 to 9999
95
- const uint32_t c = value % 10000; // 0 to 9999
96
-
97
- const uint32_t d1 = (b / 100) << 1;
98
- const uint32_t d2 = (b % 100) << 1;
99
-
100
- const uint32_t d3 = (c / 100) << 1;
101
- const uint32_t d4 = (c % 100) << 1;
102
-
103
- *buffer++ = cDigitsLut[d1];
104
- *buffer++ = cDigitsLut[d1 + 1];
105
- *buffer++ = cDigitsLut[d2];
106
- *buffer++ = cDigitsLut[d2 + 1];
107
- *buffer++ = cDigitsLut[d3];
108
- *buffer++ = cDigitsLut[d3 + 1];
109
- *buffer++ = cDigitsLut[d4];
110
- *buffer++ = cDigitsLut[d4 + 1];
111
- }
112
- return buffer;
113
- }
114
-
115
- inline char* i32toa(int32_t value, char* buffer) {
116
- CEREAL_RAPIDJSON_ASSERT(buffer != 0);
117
- uint32_t u = static_cast<uint32_t>(value);
118
- if (value < 0) {
119
- *buffer++ = '-';
120
- u = ~u + 1;
121
- }
122
-
123
- return u32toa(u, buffer);
124
- }
125
-
126
- inline char* u64toa(uint64_t value, char* buffer) {
127
- CEREAL_RAPIDJSON_ASSERT(buffer != 0);
128
- const char* cDigitsLut = GetDigitsLut();
129
- const uint64_t kTen8 = 100000000;
130
- const uint64_t kTen9 = kTen8 * 10;
131
- const uint64_t kTen10 = kTen8 * 100;
132
- const uint64_t kTen11 = kTen8 * 1000;
133
- const uint64_t kTen12 = kTen8 * 10000;
134
- const uint64_t kTen13 = kTen8 * 100000;
135
- const uint64_t kTen14 = kTen8 * 1000000;
136
- const uint64_t kTen15 = kTen8 * 10000000;
137
- const uint64_t kTen16 = kTen8 * kTen8;
138
-
139
- if (value < kTen8) {
140
- uint32_t v = static_cast<uint32_t>(value);
141
- if (v < 10000) {
142
- const uint32_t d1 = (v / 100) << 1;
143
- const uint32_t d2 = (v % 100) << 1;
144
-
145
- if (v >= 1000)
146
- *buffer++ = cDigitsLut[d1];
147
- if (v >= 100)
148
- *buffer++ = cDigitsLut[d1 + 1];
149
- if (v >= 10)
150
- *buffer++ = cDigitsLut[d2];
151
- *buffer++ = cDigitsLut[d2 + 1];
152
- }
153
- else {
154
- // value = bbbbcccc
155
- const uint32_t b = v / 10000;
156
- const uint32_t c = v % 10000;
157
-
158
- const uint32_t d1 = (b / 100) << 1;
159
- const uint32_t d2 = (b % 100) << 1;
160
-
161
- const uint32_t d3 = (c / 100) << 1;
162
- const uint32_t d4 = (c % 100) << 1;
163
-
164
- if (value >= 10000000)
165
- *buffer++ = cDigitsLut[d1];
166
- if (value >= 1000000)
167
- *buffer++ = cDigitsLut[d1 + 1];
168
- if (value >= 100000)
169
- *buffer++ = cDigitsLut[d2];
170
- *buffer++ = cDigitsLut[d2 + 1];
171
-
172
- *buffer++ = cDigitsLut[d3];
173
- *buffer++ = cDigitsLut[d3 + 1];
174
- *buffer++ = cDigitsLut[d4];
175
- *buffer++ = cDigitsLut[d4 + 1];
176
- }
177
- }
178
- else if (value < kTen16) {
179
- const uint32_t v0 = static_cast<uint32_t>(value / kTen8);
180
- const uint32_t v1 = static_cast<uint32_t>(value % kTen8);
181
-
182
- const uint32_t b0 = v0 / 10000;
183
- const uint32_t c0 = v0 % 10000;
184
-
185
- const uint32_t d1 = (b0 / 100) << 1;
186
- const uint32_t d2 = (b0 % 100) << 1;
187
-
188
- const uint32_t d3 = (c0 / 100) << 1;
189
- const uint32_t d4 = (c0 % 100) << 1;
190
-
191
- const uint32_t b1 = v1 / 10000;
192
- const uint32_t c1 = v1 % 10000;
193
-
194
- const uint32_t d5 = (b1 / 100) << 1;
195
- const uint32_t d6 = (b1 % 100) << 1;
196
-
197
- const uint32_t d7 = (c1 / 100) << 1;
198
- const uint32_t d8 = (c1 % 100) << 1;
199
-
200
- if (value >= kTen15)
201
- *buffer++ = cDigitsLut[d1];
202
- if (value >= kTen14)
203
- *buffer++ = cDigitsLut[d1 + 1];
204
- if (value >= kTen13)
205
- *buffer++ = cDigitsLut[d2];
206
- if (value >= kTen12)
207
- *buffer++ = cDigitsLut[d2 + 1];
208
- if (value >= kTen11)
209
- *buffer++ = cDigitsLut[d3];
210
- if (value >= kTen10)
211
- *buffer++ = cDigitsLut[d3 + 1];
212
- if (value >= kTen9)
213
- *buffer++ = cDigitsLut[d4];
214
-
215
- *buffer++ = cDigitsLut[d4 + 1];
216
- *buffer++ = cDigitsLut[d5];
217
- *buffer++ = cDigitsLut[d5 + 1];
218
- *buffer++ = cDigitsLut[d6];
219
- *buffer++ = cDigitsLut[d6 + 1];
220
- *buffer++ = cDigitsLut[d7];
221
- *buffer++ = cDigitsLut[d7 + 1];
222
- *buffer++ = cDigitsLut[d8];
223
- *buffer++ = cDigitsLut[d8 + 1];
224
- }
225
- else {
226
- const uint32_t a = static_cast<uint32_t>(value / kTen16); // 1 to 1844
227
- value %= kTen16;
228
-
229
- if (a < 10)
230
- *buffer++ = static_cast<char>('0' + static_cast<char>(a));
231
- else if (a < 100) {
232
- const uint32_t i = a << 1;
233
- *buffer++ = cDigitsLut[i];
234
- *buffer++ = cDigitsLut[i + 1];
235
- }
236
- else if (a < 1000) {
237
- *buffer++ = static_cast<char>('0' + static_cast<char>(a / 100));
238
-
239
- const uint32_t i = (a % 100) << 1;
240
- *buffer++ = cDigitsLut[i];
241
- *buffer++ = cDigitsLut[i + 1];
242
- }
243
- else {
244
- const uint32_t i = (a / 100) << 1;
245
- const uint32_t j = (a % 100) << 1;
246
- *buffer++ = cDigitsLut[i];
247
- *buffer++ = cDigitsLut[i + 1];
248
- *buffer++ = cDigitsLut[j];
249
- *buffer++ = cDigitsLut[j + 1];
250
- }
251
-
252
- const uint32_t v0 = static_cast<uint32_t>(value / kTen8);
253
- const uint32_t v1 = static_cast<uint32_t>(value % kTen8);
254
-
255
- const uint32_t b0 = v0 / 10000;
256
- const uint32_t c0 = v0 % 10000;
257
-
258
- const uint32_t d1 = (b0 / 100) << 1;
259
- const uint32_t d2 = (b0 % 100) << 1;
260
-
261
- const uint32_t d3 = (c0 / 100) << 1;
262
- const uint32_t d4 = (c0 % 100) << 1;
263
-
264
- const uint32_t b1 = v1 / 10000;
265
- const uint32_t c1 = v1 % 10000;
266
-
267
- const uint32_t d5 = (b1 / 100) << 1;
268
- const uint32_t d6 = (b1 % 100) << 1;
269
-
270
- const uint32_t d7 = (c1 / 100) << 1;
271
- const uint32_t d8 = (c1 % 100) << 1;
272
-
273
- *buffer++ = cDigitsLut[d1];
274
- *buffer++ = cDigitsLut[d1 + 1];
275
- *buffer++ = cDigitsLut[d2];
276
- *buffer++ = cDigitsLut[d2 + 1];
277
- *buffer++ = cDigitsLut[d3];
278
- *buffer++ = cDigitsLut[d3 + 1];
279
- *buffer++ = cDigitsLut[d4];
280
- *buffer++ = cDigitsLut[d4 + 1];
281
- *buffer++ = cDigitsLut[d5];
282
- *buffer++ = cDigitsLut[d5 + 1];
283
- *buffer++ = cDigitsLut[d6];
284
- *buffer++ = cDigitsLut[d6 + 1];
285
- *buffer++ = cDigitsLut[d7];
286
- *buffer++ = cDigitsLut[d7 + 1];
287
- *buffer++ = cDigitsLut[d8];
288
- *buffer++ = cDigitsLut[d8 + 1];
289
- }
290
-
291
- return buffer;
292
- }
293
-
294
- inline char* i64toa(int64_t value, char* buffer) {
295
- CEREAL_RAPIDJSON_ASSERT(buffer != 0);
296
- uint64_t u = static_cast<uint64_t>(value);
297
- if (value < 0) {
298
- *buffer++ = '-';
299
- u = ~u + 1;
300
- }
301
-
302
- return u64toa(u, buffer);
303
- }
304
-
305
- } // namespace internal
306
- CEREAL_RAPIDJSON_NAMESPACE_END
307
-
308
- #endif // CEREAL_RAPIDJSON_ITOA_