catboost 1.25.1 → 1.27.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 (290) hide show
  1. package/DEPLOYMENT.md +22 -15
  2. package/README.md +43 -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/common.js +1 -1
  10. package/build_scripts/out/config.js +32 -18
  11. package/build_scripts/out/install.js +5 -3
  12. package/build_scripts/out/package_prepublish.js +1 -1
  13. package/build_scripts/out/packaging.js +1 -19
  14. package/build_scripts/out/run_tests.js +1 -1
  15. package/build_scripts/out/test.js +8 -3
  16. package/config.json +18 -11
  17. package/inc/catboost/libs/model_interface/c_api.h +367 -5
  18. package/lib/catboost.d.ts +65 -21
  19. package/package.json +4 -4
  20. package/src/api_helpers.cpp +100 -24
  21. package/src/api_helpers.h +8 -7
  22. package/src/api_module.cpp +1 -2
  23. package/src/model.cpp +483 -83
  24. package/src/model.h +24 -9
  25. package/inc/contrib/libs/cxxsupp/system_stl/include/stlfwd +0 -14
  26. package/inc/util/charset/recode_result.h +0 -9
  27. package/inc/util/charset/unicode_table.h +0 -123
  28. package/inc/util/charset/unidata.h +0 -421
  29. package/inc/util/charset/utf8.h +0 -384
  30. package/inc/util/charset/wide.h +0 -843
  31. package/inc/util/charset/wide_specific.h +0 -22
  32. package/inc/util/datetime/base.h +0 -669
  33. package/inc/util/datetime/constants.h +0 -7
  34. package/inc/util/datetime/cputimer.h +0 -124
  35. package/inc/util/datetime/parser.h +0 -292
  36. package/inc/util/datetime/systime.h +0 -47
  37. package/inc/util/datetime/uptime.h +0 -8
  38. package/inc/util/digest/city.h +0 -88
  39. package/inc/util/digest/fnv.h +0 -73
  40. package/inc/util/digest/multi.h +0 -14
  41. package/inc/util/digest/murmur.h +0 -57
  42. package/inc/util/digest/numeric.h +0 -86
  43. package/inc/util/digest/sequence.h +0 -48
  44. package/inc/util/draft/date.h +0 -129
  45. package/inc/util/draft/datetime.h +0 -184
  46. package/inc/util/draft/enum.h +0 -136
  47. package/inc/util/draft/holder_vector.h +0 -102
  48. package/inc/util/draft/ip.h +0 -131
  49. package/inc/util/draft/matrix.h +0 -108
  50. package/inc/util/draft/memory.h +0 -40
  51. package/inc/util/folder/dirent_win.h +0 -46
  52. package/inc/util/folder/dirut.h +0 -121
  53. package/inc/util/folder/filelist.h +0 -81
  54. package/inc/util/folder/fts.h +0 -108
  55. package/inc/util/folder/iterator.h +0 -109
  56. package/inc/util/folder/lstat_win.h +0 -20
  57. package/inc/util/folder/path.h +0 -225
  58. package/inc/util/folder/pathsplit.h +0 -113
  59. package/inc/util/folder/tempdir.h +0 -42
  60. package/inc/util/generic/adaptor.h +0 -134
  61. package/inc/util/generic/algorithm.h +0 -765
  62. package/inc/util/generic/array_ref.h +0 -282
  63. package/inc/util/generic/array_size.h +0 -24
  64. package/inc/util/generic/benchmark/vector_count_ctor/f.h +0 -9
  65. package/inc/util/generic/bitmap.h +0 -1115
  66. package/inc/util/generic/bitops.h +0 -459
  67. package/inc/util/generic/bt_exception.h +0 -24
  68. package/inc/util/generic/buffer.h +0 -232
  69. package/inc/util/generic/cast.h +0 -176
  70. package/inc/util/generic/deque.h +0 -24
  71. package/inc/util/generic/explicit_type.h +0 -42
  72. package/inc/util/generic/fastqueue.h +0 -55
  73. package/inc/util/generic/flags.h +0 -244
  74. package/inc/util/generic/function.h +0 -103
  75. package/inc/util/generic/fwd.h +0 -171
  76. package/inc/util/generic/guid.h +0 -61
  77. package/inc/util/generic/hash.h +0 -2032
  78. package/inc/util/generic/hash_primes.h +0 -140
  79. package/inc/util/generic/hash_set.h +0 -490
  80. package/inc/util/generic/hide_ptr.h +0 -3
  81. package/inc/util/generic/intrlist.h +0 -876
  82. package/inc/util/generic/is_in.h +0 -53
  83. package/inc/util/generic/iterator.h +0 -137
  84. package/inc/util/generic/iterator_range.h +0 -105
  85. package/inc/util/generic/lazy_value.h +0 -66
  86. package/inc/util/generic/list.h +0 -22
  87. package/inc/util/generic/map.h +0 -44
  88. package/inc/util/generic/mapfindptr.h +0 -60
  89. package/inc/util/generic/maybe.h +0 -713
  90. package/inc/util/generic/maybe_traits.h +0 -164
  91. package/inc/util/generic/mem_copy.h +0 -55
  92. package/inc/util/generic/noncopyable.h +0 -38
  93. package/inc/util/generic/object_counter.h +0 -53
  94. package/inc/util/generic/ptr.h +0 -1113
  95. package/inc/util/generic/queue.h +0 -57
  96. package/inc/util/generic/refcount.h +0 -162
  97. package/inc/util/generic/reserve.h +0 -11
  98. package/inc/util/generic/scope.h +0 -65
  99. package/inc/util/generic/serialized_enum.h +0 -406
  100. package/inc/util/generic/set.h +0 -42
  101. package/inc/util/generic/singleton.h +0 -136
  102. package/inc/util/generic/size_literals.h +0 -65
  103. package/inc/util/generic/stack.h +0 -18
  104. package/inc/util/generic/store_policy.h +0 -120
  105. package/inc/util/generic/strbase.h +0 -612
  106. package/inc/util/generic/strbuf.h +0 -552
  107. package/inc/util/generic/strfcpy.h +0 -17
  108. package/inc/util/generic/string.h +0 -1572
  109. package/inc/util/generic/string_hash.h +0 -21
  110. package/inc/util/generic/string_ut.h +0 -1175
  111. package/inc/util/generic/type_name.h +0 -34
  112. package/inc/util/generic/typelist.h +0 -114
  113. package/inc/util/generic/typetraits.h +0 -325
  114. package/inc/util/generic/utility.h +0 -132
  115. package/inc/util/generic/va_args.h +0 -400
  116. package/inc/util/generic/variant.h +0 -631
  117. package/inc/util/generic/variant_traits.h +0 -171
  118. package/inc/util/generic/vector.h +0 -119
  119. package/inc/util/generic/xrange.h +0 -258
  120. package/inc/util/generic/yexception.h +0 -212
  121. package/inc/util/generic/yexception_ut.h +0 -14
  122. package/inc/util/generic/ylimits.h +0 -92
  123. package/inc/util/generic/ymath.h +0 -206
  124. package/inc/util/memory/addstorage.h +0 -93
  125. package/inc/util/memory/alloc.h +0 -27
  126. package/inc/util/memory/blob.h +0 -296
  127. package/inc/util/memory/mmapalloc.h +0 -8
  128. package/inc/util/memory/pool.h +0 -432
  129. package/inc/util/memory/segmented_string_pool.h +0 -194
  130. package/inc/util/memory/segpool_alloc.h +0 -118
  131. package/inc/util/memory/smallobj.h +0 -141
  132. package/inc/util/memory/tempbuf.h +0 -111
  133. package/inc/util/network/address.h +0 -136
  134. package/inc/util/network/endpoint.h +0 -61
  135. package/inc/util/network/hostip.h +0 -16
  136. package/inc/util/network/init.h +0 -60
  137. package/inc/util/network/interface.h +0 -17
  138. package/inc/util/network/iovec.h +0 -65
  139. package/inc/util/network/ip.h +0 -116
  140. package/inc/util/network/nonblock.h +0 -8
  141. package/inc/util/network/pair.h +0 -9
  142. package/inc/util/network/poller.h +0 -58
  143. package/inc/util/network/pollerimpl.h +0 -707
  144. package/inc/util/network/sock.h +0 -608
  145. package/inc/util/network/socket.h +0 -421
  146. package/inc/util/random/common_ops.h +0 -130
  147. package/inc/util/random/easy.h +0 -47
  148. package/inc/util/random/entropy.h +0 -21
  149. package/inc/util/random/fast.h +0 -101
  150. package/inc/util/random/init_atfork.h +0 -3
  151. package/inc/util/random/lcg_engine.h +0 -66
  152. package/inc/util/random/mersenne.h +0 -46
  153. package/inc/util/random/mersenne32.h +0 -50
  154. package/inc/util/random/mersenne64.h +0 -50
  155. package/inc/util/random/normal.h +0 -38
  156. package/inc/util/random/random.h +0 -30
  157. package/inc/util/random/shuffle.h +0 -39
  158. package/inc/util/str_stl.h +0 -266
  159. package/inc/util/stream/aligned.h +0 -99
  160. package/inc/util/stream/buffer.h +0 -119
  161. package/inc/util/stream/buffered.h +0 -225
  162. package/inc/util/stream/debug.h +0 -53
  163. package/inc/util/stream/direct_io.h +0 -43
  164. package/inc/util/stream/file.h +0 -108
  165. package/inc/util/stream/format.h +0 -444
  166. package/inc/util/stream/fwd.h +0 -100
  167. package/inc/util/stream/hex.h +0 -8
  168. package/inc/util/stream/holder.h +0 -44
  169. package/inc/util/stream/input.h +0 -273
  170. package/inc/util/stream/labeled.h +0 -19
  171. package/inc/util/stream/length.h +0 -100
  172. package/inc/util/stream/mem.h +0 -255
  173. package/inc/util/stream/multi.h +0 -32
  174. package/inc/util/stream/null.h +0 -61
  175. package/inc/util/stream/output.h +0 -304
  176. package/inc/util/stream/pipe.h +0 -112
  177. package/inc/util/stream/printf.h +0 -25
  178. package/inc/util/stream/str.h +0 -207
  179. package/inc/util/stream/tee.h +0 -28
  180. package/inc/util/stream/tempbuf.h +0 -21
  181. package/inc/util/stream/tokenizer.h +0 -214
  182. package/inc/util/stream/trace.h +0 -60
  183. package/inc/util/stream/walk.h +0 -35
  184. package/inc/util/stream/zerocopy.h +0 -91
  185. package/inc/util/stream/zerocopy_output.h +0 -57
  186. package/inc/util/stream/zlib.h +0 -173
  187. package/inc/util/string/ascii.h +0 -236
  188. package/inc/util/string/builder.h +0 -39
  189. package/inc/util/string/cast.h +0 -347
  190. package/inc/util/string/cstriter.h +0 -14
  191. package/inc/util/string/escape.h +0 -70
  192. package/inc/util/string/hex.h +0 -59
  193. package/inc/util/string/join.h +0 -194
  194. package/inc/util/string/printf.h +0 -13
  195. package/inc/util/string/reverse.h +0 -16
  196. package/inc/util/string/split.h +0 -1080
  197. package/inc/util/string/strip.h +0 -257
  198. package/inc/util/string/strspn.h +0 -65
  199. package/inc/util/string/subst.h +0 -56
  200. package/inc/util/string/type.h +0 -50
  201. package/inc/util/string/util.h +0 -195
  202. package/inc/util/string/vector.h +0 -132
  203. package/inc/util/system/align.h +0 -50
  204. package/inc/util/system/atexit.h +0 -22
  205. package/inc/util/system/atomic.h +0 -51
  206. package/inc/util/system/atomic_gcc.h +0 -90
  207. package/inc/util/system/atomic_ops.h +0 -189
  208. package/inc/util/system/atomic_win.h +0 -114
  209. package/inc/util/system/backtrace.h +0 -39
  210. package/inc/util/system/byteorder.h +0 -186
  211. package/inc/util/system/compat.h +0 -84
  212. package/inc/util/system/compiler.h +0 -620
  213. package/inc/util/system/condvar.h +0 -71
  214. package/inc/util/system/context.h +0 -181
  215. package/inc/util/system/context_aarch64.h +0 -8
  216. package/inc/util/system/context_i686.h +0 -9
  217. package/inc/util/system/context_x86.h +0 -12
  218. package/inc/util/system/context_x86_64.h +0 -7
  219. package/inc/util/system/cpu_id.h +0 -159
  220. package/inc/util/system/daemon.h +0 -28
  221. package/inc/util/system/datetime.h +0 -98
  222. package/inc/util/system/defaults.h +0 -149
  223. package/inc/util/system/demangle.h +0 -5
  224. package/inc/util/system/demangle_impl.h +0 -23
  225. package/inc/util/system/direct_io.h +0 -71
  226. package/inc/util/system/dynlib.h +0 -119
  227. package/inc/util/system/env.h +0 -32
  228. package/inc/util/system/error.h +0 -95
  229. package/inc/util/system/event.h +0 -122
  230. package/inc/util/system/execpath.h +0 -17
  231. package/inc/util/system/fasttime.h +0 -6
  232. package/inc/util/system/fhandle.h +0 -27
  233. package/inc/util/system/file.h +0 -210
  234. package/inc/util/system/file_lock.h +0 -34
  235. package/inc/util/system/filemap.h +0 -383
  236. package/inc/util/system/flock.h +0 -35
  237. package/inc/util/system/fs.h +0 -156
  238. package/inc/util/system/fs_win.h +0 -29
  239. package/inc/util/system/fstat.h +0 -46
  240. package/inc/util/system/getpid.h +0 -12
  241. package/inc/util/system/guard.h +0 -179
  242. package/inc/util/system/hi_lo.h +0 -139
  243. package/inc/util/system/hostname.h +0 -10
  244. package/inc/util/system/hp_timer.h +0 -36
  245. package/inc/util/system/info.h +0 -12
  246. package/inc/util/system/interrupt_signals.h +0 -22
  247. package/inc/util/system/madvise.h +0 -30
  248. package/inc/util/system/maxlen.h +0 -32
  249. package/inc/util/system/mem_info.h +0 -18
  250. package/inc/util/system/mincore.h +0 -38
  251. package/inc/util/system/mktemp.h +0 -11
  252. package/inc/util/system/mlock.h +0 -43
  253. package/inc/util/system/mutex.h +0 -67
  254. package/inc/util/system/nice.h +0 -3
  255. package/inc/util/system/pipe.h +0 -90
  256. package/inc/util/system/platform.h +0 -246
  257. package/inc/util/system/progname.h +0 -13
  258. package/inc/util/system/protect.h +0 -25
  259. package/inc/util/system/rusage.h +0 -26
  260. package/inc/util/system/rwlock.h +0 -78
  261. package/inc/util/system/sanitizers.h +0 -122
  262. package/inc/util/system/sem.h +0 -41
  263. package/inc/util/system/shellcommand.h +0 -472
  264. package/inc/util/system/shmat.h +0 -32
  265. package/inc/util/system/sigset.h +0 -78
  266. package/inc/util/system/spin_wait.h +0 -10
  267. package/inc/util/system/spinlock.h +0 -121
  268. package/inc/util/system/src_location.h +0 -25
  269. package/inc/util/system/src_root.h +0 -68
  270. package/inc/util/system/sys_alloc.h +0 -43
  271. package/inc/util/system/sysstat.h +0 -52
  272. package/inc/util/system/tempfile.h +0 -34
  273. package/inc/util/system/thread.h +0 -167
  274. package/inc/util/system/tls.h +0 -307
  275. package/inc/util/system/types.h +0 -119
  276. package/inc/util/system/unaligned_mem.h +0 -67
  277. package/inc/util/system/user.h +0 -5
  278. package/inc/util/system/utime.h +0 -6
  279. package/inc/util/system/valgrind.h +0 -48
  280. package/inc/util/system/winint.h +0 -43
  281. package/inc/util/system/yassert.h +0 -121
  282. package/inc/util/system/yield.h +0 -4
  283. package/inc/util/thread/factory.h +0 -65
  284. package/inc/util/thread/fwd.h +0 -30
  285. package/inc/util/thread/lfqueue.h +0 -406
  286. package/inc/util/thread/lfstack.h +0 -188
  287. package/inc/util/thread/pool.h +0 -388
  288. package/inc/util/thread/singleton.h +0 -42
  289. package/inc/util/ysafeptr.h +0 -427
  290. 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