catboost 1.25.1 → 1.26.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 (289) hide show
  1. package/DEPLOYMENT.md +22 -15
  2. package/README.md +37 -27
  3. package/binding.gyp +5 -7
  4. package/build_scripts/bootstrap.js +2 -1
  5. package/build_scripts/out/build.js +46 -68
  6. package/build_scripts/out/build_model.js +1 -1
  7. package/build_scripts/out/{build_ya.js → build_native.js} +1 -1
  8. package/build_scripts/out/ci.js +5 -5
  9. package/build_scripts/out/config.js +32 -18
  10. package/build_scripts/out/install.js +5 -3
  11. package/build_scripts/out/package_prepublish.js +1 -1
  12. package/build_scripts/out/packaging.js +1 -19
  13. package/build_scripts/out/run_tests.js +1 -1
  14. package/build_scripts/out/test.js +8 -3
  15. package/config.json +18 -11
  16. package/inc/catboost/libs/model_interface/c_api.h +349 -3
  17. package/lib/catboost.d.ts +65 -21
  18. package/package.json +4 -4
  19. package/src/api_helpers.cpp +100 -24
  20. package/src/api_helpers.h +8 -7
  21. package/src/api_module.cpp +1 -2
  22. package/src/model.cpp +483 -83
  23. package/src/model.h +24 -9
  24. package/inc/contrib/libs/cxxsupp/system_stl/include/stlfwd +0 -14
  25. package/inc/util/charset/recode_result.h +0 -9
  26. package/inc/util/charset/unicode_table.h +0 -123
  27. package/inc/util/charset/unidata.h +0 -421
  28. package/inc/util/charset/utf8.h +0 -384
  29. package/inc/util/charset/wide.h +0 -843
  30. package/inc/util/charset/wide_specific.h +0 -22
  31. package/inc/util/datetime/base.h +0 -669
  32. package/inc/util/datetime/constants.h +0 -7
  33. package/inc/util/datetime/cputimer.h +0 -124
  34. package/inc/util/datetime/parser.h +0 -292
  35. package/inc/util/datetime/systime.h +0 -47
  36. package/inc/util/datetime/uptime.h +0 -8
  37. package/inc/util/digest/city.h +0 -88
  38. package/inc/util/digest/fnv.h +0 -73
  39. package/inc/util/digest/multi.h +0 -14
  40. package/inc/util/digest/murmur.h +0 -57
  41. package/inc/util/digest/numeric.h +0 -86
  42. package/inc/util/digest/sequence.h +0 -48
  43. package/inc/util/draft/date.h +0 -129
  44. package/inc/util/draft/datetime.h +0 -184
  45. package/inc/util/draft/enum.h +0 -136
  46. package/inc/util/draft/holder_vector.h +0 -102
  47. package/inc/util/draft/ip.h +0 -131
  48. package/inc/util/draft/matrix.h +0 -108
  49. package/inc/util/draft/memory.h +0 -40
  50. package/inc/util/folder/dirent_win.h +0 -46
  51. package/inc/util/folder/dirut.h +0 -121
  52. package/inc/util/folder/filelist.h +0 -81
  53. package/inc/util/folder/fts.h +0 -108
  54. package/inc/util/folder/iterator.h +0 -109
  55. package/inc/util/folder/lstat_win.h +0 -20
  56. package/inc/util/folder/path.h +0 -225
  57. package/inc/util/folder/pathsplit.h +0 -113
  58. package/inc/util/folder/tempdir.h +0 -42
  59. package/inc/util/generic/adaptor.h +0 -134
  60. package/inc/util/generic/algorithm.h +0 -765
  61. package/inc/util/generic/array_ref.h +0 -282
  62. package/inc/util/generic/array_size.h +0 -24
  63. package/inc/util/generic/benchmark/vector_count_ctor/f.h +0 -9
  64. package/inc/util/generic/bitmap.h +0 -1115
  65. package/inc/util/generic/bitops.h +0 -459
  66. package/inc/util/generic/bt_exception.h +0 -24
  67. package/inc/util/generic/buffer.h +0 -232
  68. package/inc/util/generic/cast.h +0 -176
  69. package/inc/util/generic/deque.h +0 -24
  70. package/inc/util/generic/explicit_type.h +0 -42
  71. package/inc/util/generic/fastqueue.h +0 -55
  72. package/inc/util/generic/flags.h +0 -244
  73. package/inc/util/generic/function.h +0 -103
  74. package/inc/util/generic/fwd.h +0 -171
  75. package/inc/util/generic/guid.h +0 -61
  76. package/inc/util/generic/hash.h +0 -2032
  77. package/inc/util/generic/hash_primes.h +0 -140
  78. package/inc/util/generic/hash_set.h +0 -490
  79. package/inc/util/generic/hide_ptr.h +0 -3
  80. package/inc/util/generic/intrlist.h +0 -876
  81. package/inc/util/generic/is_in.h +0 -53
  82. package/inc/util/generic/iterator.h +0 -137
  83. package/inc/util/generic/iterator_range.h +0 -105
  84. package/inc/util/generic/lazy_value.h +0 -66
  85. package/inc/util/generic/list.h +0 -22
  86. package/inc/util/generic/map.h +0 -44
  87. package/inc/util/generic/mapfindptr.h +0 -60
  88. package/inc/util/generic/maybe.h +0 -713
  89. package/inc/util/generic/maybe_traits.h +0 -164
  90. package/inc/util/generic/mem_copy.h +0 -55
  91. package/inc/util/generic/noncopyable.h +0 -38
  92. package/inc/util/generic/object_counter.h +0 -53
  93. package/inc/util/generic/ptr.h +0 -1113
  94. package/inc/util/generic/queue.h +0 -57
  95. package/inc/util/generic/refcount.h +0 -162
  96. package/inc/util/generic/reserve.h +0 -11
  97. package/inc/util/generic/scope.h +0 -65
  98. package/inc/util/generic/serialized_enum.h +0 -406
  99. package/inc/util/generic/set.h +0 -42
  100. package/inc/util/generic/singleton.h +0 -136
  101. package/inc/util/generic/size_literals.h +0 -65
  102. package/inc/util/generic/stack.h +0 -18
  103. package/inc/util/generic/store_policy.h +0 -120
  104. package/inc/util/generic/strbase.h +0 -612
  105. package/inc/util/generic/strbuf.h +0 -552
  106. package/inc/util/generic/strfcpy.h +0 -17
  107. package/inc/util/generic/string.h +0 -1572
  108. package/inc/util/generic/string_hash.h +0 -21
  109. package/inc/util/generic/string_ut.h +0 -1175
  110. package/inc/util/generic/type_name.h +0 -34
  111. package/inc/util/generic/typelist.h +0 -114
  112. package/inc/util/generic/typetraits.h +0 -325
  113. package/inc/util/generic/utility.h +0 -132
  114. package/inc/util/generic/va_args.h +0 -400
  115. package/inc/util/generic/variant.h +0 -631
  116. package/inc/util/generic/variant_traits.h +0 -171
  117. package/inc/util/generic/vector.h +0 -119
  118. package/inc/util/generic/xrange.h +0 -258
  119. package/inc/util/generic/yexception.h +0 -212
  120. package/inc/util/generic/yexception_ut.h +0 -14
  121. package/inc/util/generic/ylimits.h +0 -92
  122. package/inc/util/generic/ymath.h +0 -206
  123. package/inc/util/memory/addstorage.h +0 -93
  124. package/inc/util/memory/alloc.h +0 -27
  125. package/inc/util/memory/blob.h +0 -296
  126. package/inc/util/memory/mmapalloc.h +0 -8
  127. package/inc/util/memory/pool.h +0 -432
  128. package/inc/util/memory/segmented_string_pool.h +0 -194
  129. package/inc/util/memory/segpool_alloc.h +0 -118
  130. package/inc/util/memory/smallobj.h +0 -141
  131. package/inc/util/memory/tempbuf.h +0 -111
  132. package/inc/util/network/address.h +0 -136
  133. package/inc/util/network/endpoint.h +0 -61
  134. package/inc/util/network/hostip.h +0 -16
  135. package/inc/util/network/init.h +0 -60
  136. package/inc/util/network/interface.h +0 -17
  137. package/inc/util/network/iovec.h +0 -65
  138. package/inc/util/network/ip.h +0 -116
  139. package/inc/util/network/nonblock.h +0 -8
  140. package/inc/util/network/pair.h +0 -9
  141. package/inc/util/network/poller.h +0 -58
  142. package/inc/util/network/pollerimpl.h +0 -707
  143. package/inc/util/network/sock.h +0 -608
  144. package/inc/util/network/socket.h +0 -421
  145. package/inc/util/random/common_ops.h +0 -130
  146. package/inc/util/random/easy.h +0 -47
  147. package/inc/util/random/entropy.h +0 -21
  148. package/inc/util/random/fast.h +0 -101
  149. package/inc/util/random/init_atfork.h +0 -3
  150. package/inc/util/random/lcg_engine.h +0 -66
  151. package/inc/util/random/mersenne.h +0 -46
  152. package/inc/util/random/mersenne32.h +0 -50
  153. package/inc/util/random/mersenne64.h +0 -50
  154. package/inc/util/random/normal.h +0 -38
  155. package/inc/util/random/random.h +0 -30
  156. package/inc/util/random/shuffle.h +0 -39
  157. package/inc/util/str_stl.h +0 -266
  158. package/inc/util/stream/aligned.h +0 -99
  159. package/inc/util/stream/buffer.h +0 -119
  160. package/inc/util/stream/buffered.h +0 -225
  161. package/inc/util/stream/debug.h +0 -53
  162. package/inc/util/stream/direct_io.h +0 -43
  163. package/inc/util/stream/file.h +0 -108
  164. package/inc/util/stream/format.h +0 -444
  165. package/inc/util/stream/fwd.h +0 -100
  166. package/inc/util/stream/hex.h +0 -8
  167. package/inc/util/stream/holder.h +0 -44
  168. package/inc/util/stream/input.h +0 -273
  169. package/inc/util/stream/labeled.h +0 -19
  170. package/inc/util/stream/length.h +0 -100
  171. package/inc/util/stream/mem.h +0 -255
  172. package/inc/util/stream/multi.h +0 -32
  173. package/inc/util/stream/null.h +0 -61
  174. package/inc/util/stream/output.h +0 -304
  175. package/inc/util/stream/pipe.h +0 -112
  176. package/inc/util/stream/printf.h +0 -25
  177. package/inc/util/stream/str.h +0 -207
  178. package/inc/util/stream/tee.h +0 -28
  179. package/inc/util/stream/tempbuf.h +0 -21
  180. package/inc/util/stream/tokenizer.h +0 -214
  181. package/inc/util/stream/trace.h +0 -60
  182. package/inc/util/stream/walk.h +0 -35
  183. package/inc/util/stream/zerocopy.h +0 -91
  184. package/inc/util/stream/zerocopy_output.h +0 -57
  185. package/inc/util/stream/zlib.h +0 -173
  186. package/inc/util/string/ascii.h +0 -236
  187. package/inc/util/string/builder.h +0 -39
  188. package/inc/util/string/cast.h +0 -347
  189. package/inc/util/string/cstriter.h +0 -14
  190. package/inc/util/string/escape.h +0 -70
  191. package/inc/util/string/hex.h +0 -59
  192. package/inc/util/string/join.h +0 -194
  193. package/inc/util/string/printf.h +0 -13
  194. package/inc/util/string/reverse.h +0 -16
  195. package/inc/util/string/split.h +0 -1080
  196. package/inc/util/string/strip.h +0 -257
  197. package/inc/util/string/strspn.h +0 -65
  198. package/inc/util/string/subst.h +0 -56
  199. package/inc/util/string/type.h +0 -50
  200. package/inc/util/string/util.h +0 -195
  201. package/inc/util/string/vector.h +0 -132
  202. package/inc/util/system/align.h +0 -50
  203. package/inc/util/system/atexit.h +0 -22
  204. package/inc/util/system/atomic.h +0 -51
  205. package/inc/util/system/atomic_gcc.h +0 -90
  206. package/inc/util/system/atomic_ops.h +0 -189
  207. package/inc/util/system/atomic_win.h +0 -114
  208. package/inc/util/system/backtrace.h +0 -39
  209. package/inc/util/system/byteorder.h +0 -186
  210. package/inc/util/system/compat.h +0 -84
  211. package/inc/util/system/compiler.h +0 -620
  212. package/inc/util/system/condvar.h +0 -71
  213. package/inc/util/system/context.h +0 -181
  214. package/inc/util/system/context_aarch64.h +0 -8
  215. package/inc/util/system/context_i686.h +0 -9
  216. package/inc/util/system/context_x86.h +0 -12
  217. package/inc/util/system/context_x86_64.h +0 -7
  218. package/inc/util/system/cpu_id.h +0 -159
  219. package/inc/util/system/daemon.h +0 -28
  220. package/inc/util/system/datetime.h +0 -98
  221. package/inc/util/system/defaults.h +0 -149
  222. package/inc/util/system/demangle.h +0 -5
  223. package/inc/util/system/demangle_impl.h +0 -23
  224. package/inc/util/system/direct_io.h +0 -71
  225. package/inc/util/system/dynlib.h +0 -119
  226. package/inc/util/system/env.h +0 -32
  227. package/inc/util/system/error.h +0 -95
  228. package/inc/util/system/event.h +0 -122
  229. package/inc/util/system/execpath.h +0 -17
  230. package/inc/util/system/fasttime.h +0 -6
  231. package/inc/util/system/fhandle.h +0 -27
  232. package/inc/util/system/file.h +0 -210
  233. package/inc/util/system/file_lock.h +0 -34
  234. package/inc/util/system/filemap.h +0 -383
  235. package/inc/util/system/flock.h +0 -35
  236. package/inc/util/system/fs.h +0 -156
  237. package/inc/util/system/fs_win.h +0 -29
  238. package/inc/util/system/fstat.h +0 -46
  239. package/inc/util/system/getpid.h +0 -12
  240. package/inc/util/system/guard.h +0 -179
  241. package/inc/util/system/hi_lo.h +0 -139
  242. package/inc/util/system/hostname.h +0 -10
  243. package/inc/util/system/hp_timer.h +0 -36
  244. package/inc/util/system/info.h +0 -12
  245. package/inc/util/system/interrupt_signals.h +0 -22
  246. package/inc/util/system/madvise.h +0 -30
  247. package/inc/util/system/maxlen.h +0 -32
  248. package/inc/util/system/mem_info.h +0 -18
  249. package/inc/util/system/mincore.h +0 -38
  250. package/inc/util/system/mktemp.h +0 -11
  251. package/inc/util/system/mlock.h +0 -43
  252. package/inc/util/system/mutex.h +0 -67
  253. package/inc/util/system/nice.h +0 -3
  254. package/inc/util/system/pipe.h +0 -90
  255. package/inc/util/system/platform.h +0 -246
  256. package/inc/util/system/progname.h +0 -13
  257. package/inc/util/system/protect.h +0 -25
  258. package/inc/util/system/rusage.h +0 -26
  259. package/inc/util/system/rwlock.h +0 -78
  260. package/inc/util/system/sanitizers.h +0 -122
  261. package/inc/util/system/sem.h +0 -41
  262. package/inc/util/system/shellcommand.h +0 -472
  263. package/inc/util/system/shmat.h +0 -32
  264. package/inc/util/system/sigset.h +0 -78
  265. package/inc/util/system/spin_wait.h +0 -10
  266. package/inc/util/system/spinlock.h +0 -121
  267. package/inc/util/system/src_location.h +0 -25
  268. package/inc/util/system/src_root.h +0 -68
  269. package/inc/util/system/sys_alloc.h +0 -43
  270. package/inc/util/system/sysstat.h +0 -52
  271. package/inc/util/system/tempfile.h +0 -34
  272. package/inc/util/system/thread.h +0 -167
  273. package/inc/util/system/tls.h +0 -307
  274. package/inc/util/system/types.h +0 -119
  275. package/inc/util/system/unaligned_mem.h +0 -67
  276. package/inc/util/system/user.h +0 -5
  277. package/inc/util/system/utime.h +0 -6
  278. package/inc/util/system/valgrind.h +0 -48
  279. package/inc/util/system/winint.h +0 -43
  280. package/inc/util/system/yassert.h +0 -121
  281. package/inc/util/system/yield.h +0 -4
  282. package/inc/util/thread/factory.h +0 -65
  283. package/inc/util/thread/fwd.h +0 -30
  284. package/inc/util/thread/lfqueue.h +0 -406
  285. package/inc/util/thread/lfstack.h +0 -188
  286. package/inc/util/thread/pool.h +0 -388
  287. package/inc/util/thread/singleton.h +0 -42
  288. package/inc/util/ysafeptr.h +0 -427
  289. package/inc/util/ysaveload.h +0 -700
package/src/model.h CHANGED
@@ -3,9 +3,8 @@
3
3
  // N-API (node-addon-api)
4
4
  #include <napi.h>
5
5
  // Catboost C API
6
- #include <c_api.h>
6
+ #include <catboost/libs/model_interface/c_api.h>
7
7
 
8
- #include <util/generic/vector.h>
9
8
 
10
9
  namespace NNodeCatBoost {
11
10
 
@@ -19,7 +18,10 @@ public:
19
18
 
20
19
  void LoadFullFromFile(const Napi::CallbackInfo& info);
21
20
 
22
- // Calculate prediction for matrices of numeric and categorial features.
21
+ // Set model predictions postprocessing type.
22
+ void SetPredictionType(const Napi::CallbackInfo& info);
23
+
24
+ // Calculate prediction for matrices of features.
23
25
  Napi::Value CalcPrediction(const Napi::CallbackInfo& info);
24
26
 
25
27
  // Enable GPU evaluation on the specified deivce.
@@ -28,19 +30,32 @@ public:
28
30
  // Model parameter getters.
29
31
  Napi::Value GetModelFloatFeaturesCount(const Napi::CallbackInfo& info);
30
32
  Napi::Value GetModelCatFeaturesCount(const Napi::CallbackInfo& info);
33
+ Napi::Value GetModelTextFeaturesCount(const Napi::CallbackInfo& info);
34
+ Napi::Value GetModelEmbeddingFeaturesCount(const Napi::CallbackInfo& info);
31
35
  Napi::Value GetModelTreeCount(const Napi::CallbackInfo& info);
32
36
  Napi::Value GetModelDimensionsCount(const Napi::CallbackInfo& info);
37
+ Napi::Value GetPredictionDimensionsCount(const Napi::CallbackInfo& info);
33
38
 
34
39
  private:
35
40
  ModelCalcerHandle* Handle = nullptr;
36
41
  bool ModelLoaded = false;
37
42
 
38
- Napi::Array CalcPredictionHash(Napi::Env env,
39
- const TVector<float>& floatFeatures,
40
- const Napi::Array& catFeatures);
41
- Napi::Array CalcPredictionString(Napi::Env env,
42
- const TVector<float>& floatFeatures,
43
- const Napi::Array& catFeatures);
43
+ Napi::Array CalcPredictionWithCatFeaturesAsHashes(
44
+ Napi::Env env,
45
+ const uint32_t sampleCount,
46
+ const Napi::Array& floatFeatures,
47
+ const Napi::Value& catFeatures, // array or undefined
48
+ const Napi::Value& textFeatures, // array or undefined
49
+ const Napi::Value& embeddingFeatures // array or undefined
50
+ );
51
+ Napi::Array CalcPredictionWithCatFeaturesAsStrings(
52
+ Napi::Env env,
53
+ const uint32_t sampleCount,
54
+ const Napi::Array& floatFeatures,
55
+ const Napi::Value& catFeatures, // array or undefined
56
+ const Napi::Value& textFeatures, // array or undefined
57
+ const Napi::Value& embeddingFeatures // array or undefined
58
+ );
44
59
 
45
60
  TModel(const TModel&) = delete;
46
61
  TModel(TModel&&) = delete;
@@ -1,14 +0,0 @@
1
- #pragma once
2
-
3
- // STL "forwarding" for the poor
4
-
5
- #include <cstddef>
6
- #include <string>
7
- #include <string_view>
8
- #include <utility>
9
- #include <vector>
10
- #include <list>
11
- #include <deque>
12
- #include <map>
13
- #include <set>
14
- #include <functional>
@@ -1,9 +0,0 @@
1
- #pragma once
2
-
3
- enum RECODE_RESULT {
4
- RECODE_OK,
5
- RECODE_EOINPUT,
6
- RECODE_EOOUTPUT,
7
- RECODE_BROKENSYMBOL,
8
- RECODE_ERROR,
9
- };
@@ -1,123 +0,0 @@
1
- #pragma once
2
-
3
- #include <util/system/yassert.h>
4
- #include <util/system/defaults.h>
5
- #include <util/generic/typetraits.h>
6
-
7
- namespace NUnicodeTable {
8
- template <class Value>
9
- struct TValueSelector;
10
-
11
- template <class Value>
12
- struct TValueSelector {
13
- using TStored = const Value;
14
- using TValueRef = const Value&;
15
- using TValuePtr = const Value*;
16
-
17
- static inline TValueRef Get(TValuePtr val) {
18
- return *val;
19
- }
20
- };
21
-
22
- template <class Value>
23
- struct TValueSelector<const Value*> {
24
- using TStored = const Value[];
25
- using TValueRef = const Value*;
26
- using TValuePtr = const Value*;
27
-
28
- static inline TValueRef Get(TValuePtr val) {
29
- return val;
30
- }
31
- };
32
-
33
- template <class Value>
34
- struct TValues {
35
- using TSelector = TValueSelector<Value>;
36
-
37
- using TStored = typename TSelector::TStored;
38
- using TValueRef = typename TSelector::TValueRef;
39
- using TValuePtr = typename TSelector::TValuePtr;
40
-
41
- using TData = const TValuePtr*;
42
-
43
- static inline TValuePtr Get(TData table, size_t index) {
44
- static_assert(std::is_pointer<TData>::value, "expect std::is_pointer<TData>::value");
45
- return table[index];
46
- }
47
-
48
- static inline TValueRef Get(TValuePtr val) {
49
- return TSelector::Get(val);
50
- }
51
- };
52
-
53
- template <int Shift, class TChild>
54
- struct TSubtable {
55
- using TStored = typename TChild::TStored;
56
- using TValueRef = typename TChild::TValueRef;
57
- using TValuePtr = typename TChild::TValuePtr;
58
- using TData = const typename TChild::TData*;
59
-
60
- static inline TValuePtr Get(TData table, size_t key) {
61
- static_assert(std::is_pointer<TData>::value, "expect std::is_pointer<TData>::value");
62
- return TChild::Get(table[key >> Shift], key & ((1 << Shift) - 1));
63
- }
64
-
65
- static inline TValueRef Get(TValuePtr val) {
66
- return TChild::Get(val);
67
- }
68
- };
69
-
70
- template <class T>
71
- class TTable {
72
- private:
73
- using TImpl = T;
74
- using TData = typename TImpl::TData;
75
-
76
- const TData Data;
77
- const size_t MSize;
78
-
79
- public:
80
- using TStored = typename TImpl::TStored;
81
- using TValueRef = typename TImpl::TValueRef;
82
- using TValuePtr = typename TImpl::TValuePtr;
83
-
84
- private:
85
- inline TValueRef GetImpl(size_t key) const {
86
- TValuePtr val = TImpl::Get(Data, key);
87
-
88
- return TImpl::Get(val);
89
- }
90
-
91
- inline TValueRef Get(size_t key) const {
92
- return GetImpl(key);
93
- }
94
-
95
- public:
96
- TTable(TData data, size_t size)
97
- : Data(data)
98
- , MSize(size)
99
- {
100
- static_assert(std::is_pointer<TData>::value, "expect std::is_pointer<TData>::value");
101
- }
102
-
103
- inline TValueRef Get(size_t key, TValueRef value) const {
104
- if (key >= Size())
105
- return value;
106
-
107
- return GetImpl(key);
108
- }
109
-
110
- inline TValueRef Get(size_t key, size_t defaultKey) const {
111
- if (key >= Size())
112
- return Get(defaultKey);
113
-
114
- return GetImpl(key);
115
- }
116
-
117
- inline size_t Size() const {
118
- return MSize;
119
- }
120
- };
121
-
122
- const size_t UNICODE_TABLE_SHIFT = 5;
123
- }
@@ -1,421 +0,0 @@
1
- #pragma once
2
-
3
- #include "unicode_table.h"
4
-
5
- #include <util/system/defaults.h> // wchar32, ui64, ULL()
6
-
7
- enum WC_TYPE { // TODO move no NUnicode
8
- Lu_UPPER = 1, // 'Ъ'
9
- Ll_LOWER = 2, // 'ъ'
10
- Lt_TITLE = 3, // 'Ъ'
11
- Lm_EXTENDER = 4, // '-'
12
- Lm_LETTER = 5, // 'ъ'
13
- Lo_OTHER = 6, // '?'
14
- Lo_IDEOGRAPH = 7, // '?'
15
- Lo_KATAKANA = 8, // '?'
16
- Lo_HIRAGANA = 9, // '?'
17
- Lo_LEADING = 10, // '?'
18
- Lo_VOWEL = 11, // '?'
19
- Lo_TRAILING = 12, // '?'
20
-
21
- Mn_NONSPACING = 13, // '`'
22
- Me_ENCLOSING = 14, // '`'
23
- Mc_SPACING = 15, // '`'
24
-
25
- Nd_DIGIT = 16, // '9' // convert to digit
26
- Nl_LETTER = 17, // 'X' // X,V,C,L,I ...
27
- Nl_IDEOGRAPH = 18, // '?'
28
- No_OTHER = 19, // '9'
29
-
30
- Zs_SPACE = 20, // ' ' [\40\240] SPACE ... NO-BREAK SPACE (00A0)
31
- Zs_ZWSPACE = 21, // ' ' // nothing ?
32
- Zl_LINE = 22, // '\n'
33
- Zp_PARAGRAPH = 23, // '\n'
34
-
35
- Cc_ASCII = 24, // '\x1A' // can not happen
36
- Cc_SPACE = 25, // '\x1A' // can not happen
37
- Cc_SEPARATOR = 26, // '\x1A' // can not happen
38
-
39
- Cf_FORMAT = 27, // '\x1A' // nothing ?
40
- Cf_JOIN = 28, // '\x1A' // nothing ?
41
- Cf_BIDI = 29, // '\x1A' // nothing ?
42
- Cf_ZWNBSP = 30, // '\x1A' // nothing ?
43
-
44
- Cn_UNASSIGNED = 0, // '?'
45
- Co_PRIVATE = 0, // '?'
46
- Cs_LOW = 31, // '?'
47
- Cs_HIGH = 32, // '?'
48
-
49
- Pd_DASH = 33, // '-'
50
- Pd_HYPHEN = 34, // '-' [-] HYPHEN-MINUS
51
- Ps_START = 35, // '(' [([{] LEFT PARENTHESIS ... LEFT CURLY BRACKET
52
- Ps_QUOTE = 36, // '"'
53
- Pe_END = 37, // ')' [)]}] RIGHT PARENTHESIS ... RIGHT CURLY BRACKET
54
- Pe_QUOTE = 38, // '"'
55
- Pi_QUOTE = 39, // '"'
56
- Pf_QUOTE = 40, // '"'
57
- Pc_CONNECTOR = 41, // '_' [_] LOW LINE
58
- Po_OTHER = 42, // '*' [#%&*/@\] NUMBER SIGN ... REVERSE SOLIDUS
59
- Po_QUOTE = 43, // '"' ["] QUOTATION MARK
60
- Po_TERMINAL = 44, // '.' [!,.:;?] EXCLAMATION MARK ... QUESTION MARK
61
- Po_EXTENDER = 45, // '-' [№] MIDDLE DOT (00B7)
62
- Po_HYPHEN = 46, // '-'
63
-
64
- Sm_MATH = 47, // '=' [+<=>|~] PLUS SIGN ... TILDE
65
- Sm_MINUS = 48, // '-'
66
- Sc_CURRENCY = 49, // '$' [$] DOLLAR SIGN
67
- Sk_MODIFIER = 50, // '`' [^`] CIRCUMFLEX ACCENT ... GRAVE ACCENT
68
- So_OTHER = 51, // '°' [°] DEGREE SIGN (00B0)
69
-
70
- Ps_SINGLE_QUOTE = 52, // '\'' ['] OPENING SINGLE QUOTE
71
- Pe_SINGLE_QUOTE = 53, // '\'' ['] CLOSING SINGLE QUOTE
72
- Pi_SINGLE_QUOTE = 54, // '\'' ['] INITIAL SINGLE QUOTE
73
- Pf_SINGLE_QUOTE = 55, // '\'' ['] FINAL SINGLE QUOTE
74
- Po_SINGLE_QUOTE = 56, // '\'' ['] APOSTROPHE and PRIME
75
-
76
- CCL_NUM = 57,
77
- CCL_MASK = 0x3F,
78
-
79
- IS_ASCII_XDIGIT = 1 << 6,
80
- IS_DIGIT = 1 << 7,
81
- IS_NONBREAK = 1 << 8,
82
-
83
- IS_PRIVATE = 1 << 9,
84
-
85
- IS_COMPAT = 1 << 10,
86
- IS_CANON = 1 << 11,
87
-
88
- NFD_QC = 1 << 12,
89
- NFC_QC = 1 << 13,
90
- NFKD_QC = 1 << 14,
91
- NFKC_QC = 1 << 15,
92
-
93
- BIDI_OFFSET = 16,
94
- SVAL_OFFSET = 22,
95
- };
96
-
97
- const size_t DEFCHAR_BUF = 58; // CCL_NUM + 1
98
-
99
- #define SHIFT(i) (ULL(1) << (i))
100
-
101
- namespace NUnicode {
102
- using TCombining = ui8;
103
-
104
- namespace NPrivate {
105
- struct TProperty {
106
- ui32 Info;
107
- i32 Lower;
108
- i32 Upper;
109
- i32 Title;
110
- TCombining Combining;
111
- };
112
-
113
- extern const size_t DEFAULT_KEY;
114
-
115
- using TUnidataTable = NUnicodeTable::TTable<NUnicodeTable::TSubtable<NUnicodeTable::UNICODE_TABLE_SHIFT, NUnicodeTable::TValues<TProperty>>>;
116
- const TUnidataTable& UnidataTable();
117
-
118
- inline const TProperty& CharProperty(wchar32 ch) {
119
- return UnidataTable().Get(ch, DEFAULT_KEY);
120
- }
121
-
122
- inline ui32 CharInfo(wchar32 ch) {
123
- return CharProperty(ch).Info;
124
- }
125
-
126
- inline bool IsBidi(wchar32 ch, ui32 type) {
127
- return ((NUnicode::NPrivate::CharInfo(ch) >> BIDI_OFFSET) & 15) == type;
128
- }
129
- }
130
-
131
- inline size_t UnicodeInstancesLimit() {
132
- return NPrivate::UnidataTable().Size();
133
- }
134
-
135
- inline TCombining DecompositionCombining(wchar32 ch) {
136
- return NPrivate::CharProperty(ch).Combining;
137
- }
138
-
139
- inline WC_TYPE CharType(wchar32 ch) {
140
- return (WC_TYPE)(NUnicode::NPrivate::CharInfo(ch) & CCL_MASK);
141
- }
142
- inline bool CharHasType(wchar32 ch, ui64 type_bits) {
143
- return (SHIFT(NUnicode::CharType(ch)) & type_bits) != 0;
144
- }
145
- }
146
-
147
- // all usefull properties
148
-
149
- inline bool IsComposed(wchar32 ch) {
150
- return NUnicode::NPrivate::CharInfo(ch) & (IS_COMPAT | IS_CANON);
151
- }
152
- inline bool IsCanonComposed(wchar32 ch) {
153
- return NUnicode::NPrivate::CharInfo(ch) & IS_CANON;
154
- }
155
- inline bool IsCompatComposed(wchar32 ch) {
156
- return NUnicode::NPrivate::CharInfo(ch) & IS_COMPAT;
157
- }
158
-
159
- inline bool IsWhitespace(wchar32 ch) {
160
- return NUnicode::CharHasType(ch, SHIFT(Cc_SPACE) | SHIFT(Zs_SPACE) | SHIFT(Zs_ZWSPACE) | SHIFT(Zl_LINE) | SHIFT(Zp_PARAGRAPH));
161
- }
162
- inline bool IsAsciiCntrl(wchar32 ch) {
163
- return NUnicode::CharHasType(ch, SHIFT(Cc_ASCII) | SHIFT(Cc_SPACE) | SHIFT(Cc_SEPARATOR));
164
- }
165
- inline bool IsBidiCntrl(wchar32 ch) {
166
- return NUnicode::CharHasType(ch, SHIFT(Cf_BIDI));
167
- }
168
- inline bool IsJoinCntrl(wchar32 ch) {
169
- return NUnicode::CharHasType(ch, SHIFT(Cf_JOIN));
170
- }
171
- inline bool IsFormatCntrl(wchar32 ch) {
172
- return NUnicode::CharHasType(ch, SHIFT(Cf_FORMAT));
173
- }
174
- inline bool IsIgnorableCntrl(wchar32 ch) {
175
- return NUnicode::CharHasType(ch, SHIFT(Cf_FORMAT) | SHIFT(Cf_JOIN) | SHIFT(Cf_BIDI) | SHIFT(Cf_ZWNBSP));
176
- }
177
- inline bool IsCntrl(wchar32 ch) {
178
- return NUnicode::CharHasType(ch,
179
- SHIFT(Cf_FORMAT) | SHIFT(Cf_JOIN) | SHIFT(Cf_BIDI) | SHIFT(Cf_ZWNBSP) |
180
- SHIFT(Cc_ASCII) | SHIFT(Cc_SPACE) | SHIFT(Cc_SEPARATOR));
181
- }
182
- inline bool IsZerowidth(wchar32 ch) {
183
- return NUnicode::CharHasType(ch, SHIFT(Cf_FORMAT) | SHIFT(Cf_JOIN) | SHIFT(Cf_BIDI) | SHIFT(Cf_ZWNBSP) | SHIFT(Zs_ZWSPACE));
184
- }
185
- inline bool IsLineSep(wchar32 ch) {
186
- return NUnicode::CharHasType(ch, SHIFT(Zl_LINE));
187
- }
188
- inline bool IsParaSep(wchar32 ch) {
189
- return NUnicode::CharHasType(ch, SHIFT(Zp_PARAGRAPH));
190
- }
191
- inline bool IsDash(wchar32 ch) {
192
- return NUnicode::CharHasType(ch, SHIFT(Pd_DASH) | SHIFT(Pd_HYPHEN) | SHIFT(Sm_MINUS));
193
- }
194
- inline bool IsHyphen(wchar32 ch) {
195
- return NUnicode::CharHasType(ch, SHIFT(Pd_HYPHEN) | SHIFT(Po_HYPHEN));
196
- }
197
- inline bool IsQuotation(wchar32 ch) {
198
- return NUnicode::CharHasType(ch,
199
- SHIFT(Po_QUOTE) | SHIFT(Ps_QUOTE) | SHIFT(Pe_QUOTE) | SHIFT(Pi_QUOTE) |
200
- SHIFT(Pf_QUOTE) | SHIFT(Po_SINGLE_QUOTE) | SHIFT(Ps_SINGLE_QUOTE) |
201
- SHIFT(Pe_SINGLE_QUOTE) | SHIFT(Pi_SINGLE_QUOTE) | SHIFT(Pf_SINGLE_QUOTE));
202
- }
203
-
204
- inline bool IsSingleQuotation(wchar32 ch) {
205
- return NUnicode::CharHasType(ch,
206
- SHIFT(Po_SINGLE_QUOTE) | SHIFT(Ps_SINGLE_QUOTE) | SHIFT(Pe_SINGLE_QUOTE) |
207
- SHIFT(Pi_SINGLE_QUOTE) | SHIFT(Pf_SINGLE_QUOTE));
208
- }
209
-
210
- inline bool IsTerminal(wchar32 ch) {
211
- return NUnicode::CharHasType(ch, SHIFT(Po_TERMINAL));
212
- }
213
- inline bool IsPairedPunct(wchar32 ch) {
214
- return NUnicode::CharHasType(ch,
215
- SHIFT(Ps_START) | SHIFT(Pe_END) | SHIFT(Ps_QUOTE) | SHIFT(Pe_QUOTE) |
216
- SHIFT(Pi_QUOTE) | SHIFT(Pf_QUOTE) | SHIFT(Ps_SINGLE_QUOTE) |
217
- SHIFT(Pe_SINGLE_QUOTE) | SHIFT(Pi_SINGLE_QUOTE) | SHIFT(Pf_SINGLE_QUOTE));
218
- }
219
- inline bool IsLeftPunct(wchar32 ch) {
220
- return NUnicode::CharHasType(ch, SHIFT(Ps_START) | SHIFT(Ps_QUOTE) | SHIFT(Ps_SINGLE_QUOTE));
221
- }
222
- inline bool IsRightPunct(wchar32 ch) {
223
- return NUnicode::CharHasType(ch, SHIFT(Pe_END) | SHIFT(Pe_QUOTE) | SHIFT(Pe_SINGLE_QUOTE));
224
- }
225
- inline bool IsCombining(wchar32 ch) {
226
- return NUnicode::CharHasType(ch, SHIFT(Mc_SPACING) | SHIFT(Mn_NONSPACING) | SHIFT(Me_ENCLOSING));
227
- }
228
- inline bool IsNonspacing(wchar32 ch) {
229
- return NUnicode::CharHasType(ch, SHIFT(Mn_NONSPACING) | SHIFT(Me_ENCLOSING));
230
- }
231
- inline bool IsAlphabetic(wchar32 ch) {
232
- return NUnicode::CharHasType(ch,
233
- SHIFT(Lu_UPPER) | SHIFT(Ll_LOWER) | SHIFT(Lt_TITLE) | SHIFT(Lm_EXTENDER) | SHIFT(Lm_LETTER) | SHIFT(Lo_OTHER) | SHIFT(Nl_LETTER));
234
- }
235
- inline bool IsIdeographic(wchar32 ch) {
236
- return NUnicode::CharHasType(ch, SHIFT(Lo_IDEOGRAPH) | SHIFT(Nl_IDEOGRAPH));
237
- }
238
- inline bool IsKatakana(wchar32 ch) {
239
- return NUnicode::CharHasType(ch, SHIFT(Lo_KATAKANA));
240
- }
241
- inline bool IsHiragana(wchar32 ch) {
242
- return NUnicode::CharHasType(ch, SHIFT(Lo_HIRAGANA));
243
- }
244
- inline bool IsHangulLeading(wchar32 ch) {
245
- return NUnicode::CharHasType(ch, SHIFT(Lo_LEADING));
246
- }
247
- inline bool IsHangulVowel(wchar32 ch) {
248
- return NUnicode::CharHasType(ch, SHIFT(Lo_VOWEL));
249
- }
250
- inline bool IsHangulTrailing(wchar32 ch) {
251
- return NUnicode::CharHasType(ch, SHIFT(Lo_TRAILING));
252
- }
253
- inline bool IsHexdigit(wchar32 ch) {
254
- return NUnicode::NPrivate::CharInfo(ch) & IS_ASCII_XDIGIT;
255
- }
256
- inline bool IsDecdigit(wchar32 ch) {
257
- return NUnicode::CharHasType(ch, SHIFT(Nd_DIGIT));
258
- }
259
- inline bool IsNumeric(wchar32 ch) {
260
- return NUnicode::CharHasType(ch, SHIFT(Nd_DIGIT) | SHIFT(Nl_LETTER) | SHIFT(Nl_IDEOGRAPH) | SHIFT(No_OTHER));
261
- }
262
- inline bool IsCurrency(wchar32 ch) {
263
- return NUnicode::CharHasType(ch, SHIFT(Sc_CURRENCY));
264
- }
265
- inline bool IsMath(wchar32 ch) {
266
- return NUnicode::CharHasType(ch, SHIFT(Sm_MATH));
267
- }
268
- inline bool IsSymbol(wchar32 ch) {
269
- return NUnicode::CharHasType(ch, SHIFT(Sm_MATH) | SHIFT(Sm_MINUS) | SHIFT(Sc_CURRENCY) | SHIFT(Sk_MODIFIER) | SHIFT(So_OTHER));
270
- }
271
- inline bool IsLowSurrogate(wchar32 ch) {
272
- return NUnicode::CharHasType(ch, SHIFT(Cs_LOW));
273
- }
274
- inline bool IsHighSurrogate(wchar32 ch) {
275
- return NUnicode::CharHasType(ch, SHIFT(Cs_HIGH));
276
- }
277
- inline bool IsNonbreak(wchar32 ch) {
278
- return NUnicode::NPrivate::CharInfo(ch) & IS_NONBREAK;
279
- }
280
- inline bool IsPrivate(wchar32 ch) {
281
- return (NUnicode::NPrivate::CharInfo(ch) & IS_PRIVATE) && !NUnicode::CharHasType(ch, SHIFT(Cs_HIGH));
282
- }
283
- inline bool IsUnassigned(wchar32 ch) {
284
- return (NUnicode::CharType(ch) == 0) && !(NUnicode::NPrivate::CharInfo(ch) & IS_PRIVATE);
285
- }
286
- inline bool IsPrivateHighSurrogate(wchar32 ch) {
287
- return NUnicode::CharHasType(ch, SHIFT(Cs_HIGH)) && (NUnicode::NPrivate::CharInfo(ch) & IS_PRIVATE);
288
- }
289
-
290
- // transformations
291
-
292
- inline wchar32 ToLower(wchar32 ch) {
293
- return static_cast<wchar32>(ch + NUnicode::NPrivate::CharProperty(ch).Lower);
294
- }
295
- inline wchar32 ToUpper(wchar32 ch) {
296
- return static_cast<wchar32>(ch + NUnicode::NPrivate::CharProperty(ch).Upper);
297
- }
298
- inline wchar32 ToTitle(wchar32 ch) {
299
- return static_cast<wchar32>(ch + NUnicode::NPrivate::CharProperty(ch).Title);
300
- }
301
-
302
- inline int ToDigit(wchar32 ch) {
303
- ui32 i = NUnicode::NPrivate::CharInfo(ch);
304
- return (i & IS_DIGIT) ? static_cast<int>(i >> SVAL_OFFSET) : -1;
305
- }
306
-
307
- // BIDI properties
308
-
309
- inline bool IsBidiLeft(wchar32 ch) {
310
- return NUnicode::NPrivate::IsBidi(ch, 1);
311
- }
312
- inline bool IsBidiRight(wchar32 ch) {
313
- return NUnicode::NPrivate::IsBidi(ch, 2);
314
- }
315
- inline bool IsBidiEuronum(wchar32 ch) {
316
- return NUnicode::NPrivate::IsBidi(ch, 3);
317
- }
318
- inline bool IsBidiEurosep(wchar32 ch) {
319
- return NUnicode::NPrivate::IsBidi(ch, 4);
320
- }
321
- inline bool IsBidiEuroterm(wchar32 ch) {
322
- return NUnicode::NPrivate::IsBidi(ch, 5);
323
- }
324
- inline bool IsBidiArabnum(wchar32 ch) {
325
- return NUnicode::NPrivate::IsBidi(ch, 6);
326
- }
327
- inline bool IsBidiCommsep(wchar32 ch) {
328
- return NUnicode::NPrivate::IsBidi(ch, 7);
329
- }
330
- inline bool IsBidiBlocksep(wchar32 ch) {
331
- return NUnicode::NPrivate::IsBidi(ch, 8);
332
- }
333
- inline bool IsBidiSegmsep(wchar32 ch) {
334
- return NUnicode::NPrivate::IsBidi(ch, 9);
335
- }
336
- inline bool IsBidiSpace(wchar32 ch) {
337
- return NUnicode::NPrivate::IsBidi(ch, 10);
338
- }
339
- inline bool IsBidiNeutral(wchar32 ch) {
340
- return NUnicode::NPrivate::IsBidi(ch, 11);
341
- }
342
- inline bool IsBidiNotappl(wchar32 ch) {
343
- return NUnicode::NPrivate::IsBidi(ch, 0);
344
- }
345
-
346
- inline bool IsSpace(wchar32 ch) {
347
- return IsWhitespace(ch);
348
- }
349
- inline bool IsLower(wchar32 ch) {
350
- return NUnicode::CharHasType(ch, SHIFT(Ll_LOWER));
351
- }
352
- inline bool IsUpper(wchar32 ch) {
353
- return NUnicode::CharHasType(ch, SHIFT(Lu_UPPER));
354
- }
355
- inline bool IsTitle(wchar32 ch) {
356
- return NUnicode::CharHasType(ch, SHIFT(Lt_TITLE));
357
- }
358
- inline bool IsAlpha(wchar32 ch) {
359
- return NUnicode::CharHasType(ch,
360
- SHIFT(Lu_UPPER) | SHIFT(Ll_LOWER) | SHIFT(Lt_TITLE) | SHIFT(Lm_LETTER) | SHIFT(Lm_EXTENDER) |
361
- SHIFT(Lo_OTHER) | SHIFT(Lo_IDEOGRAPH) | SHIFT(Lo_KATAKANA) | SHIFT(Lo_HIRAGANA) |
362
- SHIFT(Lo_LEADING) | SHIFT(Lo_VOWEL) | SHIFT(Lo_TRAILING));
363
- }
364
- inline bool IsAlnum(wchar32 ch) {
365
- return NUnicode::CharHasType(ch,
366
- SHIFT(Lu_UPPER) | SHIFT(Ll_LOWER) | SHIFT(Lt_TITLE) | SHIFT(Lm_LETTER) | SHIFT(Lm_EXTENDER) |
367
- SHIFT(Lo_OTHER) | SHIFT(Lo_IDEOGRAPH) | SHIFT(Lo_KATAKANA) | SHIFT(Lo_HIRAGANA) |
368
- SHIFT(Lo_LEADING) | SHIFT(Lo_VOWEL) | SHIFT(Lo_TRAILING) |
369
- SHIFT(Nd_DIGIT) | SHIFT(Nl_LETTER) | SHIFT(Nl_IDEOGRAPH) | SHIFT(No_OTHER));
370
- }
371
- inline bool IsPunct(wchar32 ch) {
372
- return NUnicode::CharHasType(ch,
373
- SHIFT(Pd_DASH) |
374
- SHIFT(Pd_HYPHEN) | SHIFT(Ps_START) | SHIFT(Ps_QUOTE) | SHIFT(Pe_END) | SHIFT(Pe_QUOTE) | SHIFT(Pc_CONNECTOR) |
375
- SHIFT(Po_OTHER) | SHIFT(Po_QUOTE) | SHIFT(Po_TERMINAL) | SHIFT(Po_EXTENDER) | SHIFT(Po_HYPHEN) |
376
- SHIFT(Pi_QUOTE) | SHIFT(Pf_QUOTE));
377
- }
378
- inline bool IsXdigit(wchar32 ch) {
379
- return IsHexdigit(ch);
380
- }
381
- inline bool IsDigit(wchar32 ch) {
382
- return IsDecdigit(ch);
383
- }
384
-
385
- inline bool IsCommonDigit(wchar32 ch) {
386
- // IsDigit returns true for some exotic symbols like "VAI DIGIT TWO" (U+A622)
387
- // and cannot be used safely with FromString() convertors
388
- const wchar32 ZERO = '0';
389
- const wchar32 NINE = '9';
390
- return ch >= ZERO && ch <= NINE;
391
- }
392
-
393
- inline bool IsGraph(wchar32 ch) {
394
- return IsAlnum(ch) || IsPunct(ch) || IsSymbol(ch);
395
- }
396
- inline bool IsBlank(wchar32 ch) {
397
- return NUnicode::CharHasType(ch, SHIFT(Zs_SPACE) | SHIFT(Zs_ZWSPACE)) || ch == '\t';
398
- }
399
- inline bool IsPrint(wchar32 ch) {
400
- return IsAlnum(ch) || IsPunct(ch) || IsSymbol(ch) || IsBlank(ch);
401
- }
402
-
403
- inline bool IsRomanDigit(wchar32 ch) {
404
- if (NUnicode::CharHasType(ch, SHIFT(Nl_LETTER)) && 0x2160 <= ch && ch <= 0x2188)
405
- return true;
406
- if (ch < 127) {
407
- switch (static_cast<char>(::ToLower(ch))) {
408
- case 'i':
409
- case 'v':
410
- case 'x':
411
- case 'l':
412
- case 'c':
413
- case 'd':
414
- case 'm':
415
- return true;
416
- }
417
- }
418
- return false;
419
- }
420
-
421
- #undef SHIFT