isotree 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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_