fixed UB in internal unicode machinery (closes #144)

also:
- updated conformance tests
- added ubsan options to meson.build
This commit is contained in:
Mark Gillard 2022-02-26 14:42:09 +02:00
parent 36030cace8
commit 1c26ce1dcf
18 changed files with 1153 additions and 985 deletions

1
.gitmodules vendored
View File

@ -10,6 +10,7 @@
[submodule "external/Catch2"]
path = external/Catch2
url = https://github.com/catchorg/Catch2.git
branch = v2.x
[submodule "external/tloptional"]
path = external/tloptional
url = https://github.com/TartanLlama/optional.git

View File

@ -18,14 +18,21 @@ template:
#### Fixes:
- Fixed potential segfault when calling `at_path()` with an empty string
- Fixed UB in internal unicode machinery (#144) (@kchalmer)
#### Additions:
- Added config options `TOML_EXPORTED_CLASS`, `TOML_EXPORTED_MEMBER_FUNCTION`, `TOML_EXPORTED_STATIC_FUNCTION` & `TOML_EXPORTED_FREE_FUNCTION`
#### Removals/Deprecations:
- Deprecated old `TOML_API` option in favour new `TOML_EXPORTED_X` options
(it will continue to work as it did before if none of the new function export options are defined)
#### Build system:
- Meson: Added `compile_library` option (@Tachi107)
- Meson: Added `ubsan_tests` and `ubsan_examples` options
- Meson: Use system dependencies where available when building tests (@Tachi107)
## [v3.0.1](https://github.com/marzer/tomlplusplus/releases/tag/v3.0.1) - 2022-01-13

View File

@ -6,9 +6,15 @@ example_overrides += overrides
if is_gcc or is_clang
example_args += [ '-Wno-switch', '-Wno-switch-default', '-Wno-switch-enum' ]
endif
if is_clang and get_option('asan_examples')
if is_clang and (get_option('asan_examples') or get_option('ubsan_examples'))
example_args += [ '-g3' ]
example_overrides += 'b_sanitize=address'
if get_option('asan_examples') and get_option('ubsan_examples')
example_overrides += 'b_sanitize=address,undefined'
elif get_option('asan_examples')
example_overrides += 'b_sanitize=address'
else
example_overrides += 'b_sanitize=undefined'
endif
endif
examples = [

2
external/Catch2 vendored

@ -1 +1 @@
Subproject commit 7727c15290ce2d289c1809d0eab3cceb88384ad6
Subproject commit 958944d27a2d2fb82aa008377bf4f8752f6b848e

2
external/json vendored

@ -1 +1 @@
Subproject commit cc59ab122f75448c17ac623d10306cbe19cde970
Subproject commit e4643d1f1b03fc7a1d7b65f17e012ca93680cad8

2
external/toml-test vendored

@ -1 +1 @@
Subproject commit 442dea55c5173bc89c2afa1b023ecbf0e042ceac
Subproject commit 983c1a54c5faad31b5d217b1e47c0e074dea7840

View File

@ -3364,7 +3364,7 @@ TOML_IMPL_NAMESPACE_START
{
set_error_at(key_buffer.starts[i],
"cannot redefine existing "sv,
to_sv(p->type()),
to_sv(pit->second.type()),
" as dotted key-value pair"sv);
return_after_error({});
}

View File

@ -75,6 +75,7 @@
#if TOML_CLANG >= 10
#define TOML_DISABLE_SPAM_WARNINGS_CLANG_10 \
_Pragma("clang diagnostic ignored \"-Wzero-as-null-pointer-constant\"") \
_Pragma("clang diagnostic ignored \"-Wsuggest-destructor-override\"") \
static_assert(true)
#else
#define TOML_DISABLE_SPAM_WARNINGS_CLANG_10 static_assert(true)
@ -88,7 +89,6 @@
_Pragma("clang diagnostic ignored \"-Wchar-subscripts\"") \
_Pragma("clang diagnostic ignored \"-Wmissing-field-initializers\"") \
_Pragma("clang diagnostic ignored \"-Wpadded\"") \
_Pragma("clang diagnostic ignored \"-Wsuggest-destructor-override\"") \
static_assert(true)
#define TOML_POP_WARNINGS \

View File

@ -4,20 +4,12 @@
// SPDX-License-Identifier: MIT
#pragma once
#include "preprocessor.h"
#include "unicode_autogenerated.h"
#include "header_start.h"
/// \cond
#if TOML_GCC && TOML_GCC < 9
#pragma GCC push_options
#pragma GCC optimize("O1") // codegen bugs
#endif
TOML_IMPL_NAMESPACE_START
{
// note: a number of these functions were machine-generated. you'll know them when you see them.
// they are tested separately in another project, I promise!
TOML_CONST_GETTER
constexpr bool is_string_delimiter(char32_t c) noexcept
{
@ -67,807 +59,6 @@ TOML_IMPL_NAMESPACE_START
return hex_to_dec(static_cast<uint_least32_t>(c));
}
TOML_CONST_GETTER
constexpr bool is_ascii_horizontal_whitespace(char32_t c) noexcept
{
return c == U'\t' || c == U' ';
}
TOML_CONST_GETTER
constexpr bool is_non_ascii_horizontal_whitespace(char32_t c) noexcept
{
if (c < U'\xA0' || c > U'\uFEFF')
return false;
const auto child_index_0 = (static_cast<uint_least64_t>(c) - 0xA0ull) / 0x3FAull;
if ((1ull << child_index_0) & 0x7FFFFFFFFFFFF75Eull)
return false;
if (c == U'\xA0' || c == U'\u3000' || c == U'\uFEFF')
return true;
switch (child_index_0)
{
case 0x05: return c == U'\u1680' || c == U'\u180E';
case 0x07:
return (U'\u2000' <= c && c <= U'\u200B') || (U'\u205F' <= c && c <= U'\u2060') || c == U'\u202F';
default: TOML_UNREACHABLE;
}
// 20 code units from 8 ranges (spanning a search area of 65120)
TOML_UNREACHABLE;
}
TOML_CONST_GETTER
constexpr bool is_horizontal_whitespace(char32_t c) noexcept
{
return is_ascii_horizontal_whitespace(c) || is_non_ascii_horizontal_whitespace(c);
}
TOML_CONST_GETTER
constexpr bool is_ascii_vertical_whitespace(char32_t c) noexcept
{
return U'\n' <= c && c <= U'\r';
}
TOML_CONST_GETTER
constexpr bool is_non_ascii_vertical_whitespace(char32_t c) noexcept
{
return (U'\u2028' <= c && c <= U'\u2029') || c == U'\x85';
}
TOML_CONST_GETTER
constexpr bool is_vertical_whitespace(char32_t c) noexcept
{
return is_ascii_vertical_whitespace(c) || is_non_ascii_vertical_whitespace(c);
}
TOML_CONST_GETTER
constexpr bool is_whitespace(char32_t c) noexcept
{
return is_horizontal_whitespace(c) || is_vertical_whitespace(c);
}
TOML_CONST_GETTER
constexpr bool is_ascii_bare_key_character(char32_t c) noexcept
{
#if TOML_LANG_UNRELEASED // toml/issues/644 ('+' in bare keys)
if (c == U'+')
return true;
#endif
if (c < U'-' || c > U'z')
return false;
if ((1ull << (static_cast<uint_least64_t>(c) - 0x2Du)) & 0xFFF43FFFFFF01FF9ull)
return true;
return (((static_cast<uint_least64_t>(c) - 0x2Dull) / 0x40ull) != 0)
|| ((1ull << (static_cast<uint_least64_t>(c) - 0x2Du)) & 0xFFF43FFFFFF01FF9ull);
}
#if TOML_LANG_UNRELEASED // toml/issues/687 (unicode bare keys)
//# Returns true if a codepoint belongs to any of these categories:
//# Ll, Lm, Lo, Lt, Lu
TOML_CONST_GETTER
constexpr bool is_non_ascii_letter(char32_t c) noexcept
{
if (U'\xAA' > c || c > U'\U0003134A')
return false;
const auto child_index_0 = (static_cast<uint_least64_t>(c) - 0xAAull) / 0xC4Bull;
if ((1ull << child_index_0) & 0x26180C0000ull)
return false;
if ((1ull << child_index_0) & 0x8A7FFC004001DFA0ull)
return true;
switch (child_index_0)
{
case 0x00: // [0] 00AA - 0CF4
{
if (c > U'\u0CF2')
return false;
TOML_ASSUME(U'\xAA' <= c);
constexpr uint_least64_t bitmask_table_1[] = {
0xFFFFDFFFFFC10801u, 0xFFFFFFFFFFFFDFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0x07C000FFF0FFFFFFu, 0x0000000000000014u, 0x0000000000000000u, 0xFEFFFFF5D02F37C0u,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFEFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFF00FFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFC09FFFFFFFFFBFu, 0x000000007FFFFFFFu,
0xFFFFFFC000000000u, 0xFFC00000000001E1u, 0x00000001FFFFFFFFu, 0xFFFFFFFFFFFFFFB0u,
0x18000BFFFFFFFFFFu, 0xFFFFFF4000270030u, 0xFFFFFFF80000003Fu, 0x0FFFFFFFFFFFFFFFu,
0xFFFFFFFF00000080u, 0x44010FFFFFC10C01u, 0xFFC07FFFFFC00000u, 0xFFC0001FBFFFFFC1u,
0x00000000FFFFFFFFu, 0xFFFFFFFFFC000000u, 0x00FFC0400008FFFFu, 0x7FFFFE67F87FFF80u,
0x00EC00100008F17Fu, 0x7FFFFE61F80400C0u, 0x001780000000DB7Fu, 0x7FFFFEEFF8000700u,
0x00C000400008FB7Fu, 0x7FFFFE67F8008000u, 0x00EC00000008FB7Fu, 0xC6358F71FA000080u,
0x000000400000FFF1u, 0x7FFFFF77F8000000u, 0x00C9C0000008FFFFu, 0x7FFFFF77F8400000u,
0x00D800000008FBFFu, 0x0000000000000180u,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0xAAull) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0xAAull) % 0x40ull));
// 1957 code units from 126 ranges (spanning a search area of 3145)
}
case 0x01: // [1] 0CF5 - 193F
{
if (U'\u0D04' > c || c > U'\u191E')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
0x027FFFFFFFFFDDFFu, 0x0FC0000038070400u, 0xF2FFBFFFFFC7FFFEu, 0xE000000000000007u,
0xF000DFFFFFFFFFFFu, 0x6000000000000007u, 0xF200DFFAFFFFFF7Du, 0x100000000F000005u,
0xF000000000000000u, 0x000001FFFFFFFFEFu, 0x00000000000001F0u, 0xF000000000000000u,
0x0800007FFFFFFFFFu, 0x3FFE1C0623C3F000u, 0xFFFFFFFFF0000400u, 0xFF7FFFFFFFFFF20Bu,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFF3D7F3DFu, 0xD7F3DFFFFFFFF3DFu, 0xFFFFFFFFFFF7FFF3u,
0xFFFFFFFFFFF3DFFFu, 0xF0000000007FFFFFu, 0xFFFFFFFFF0000FFFu, 0xE3F3FFFFFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0xEFFFF9FFFFFFFFFFu, 0xFFFFFFFFF07FFFFFu, 0xF01FE07FFFFFFFFFu,
0xF0003FFFF8003FFFu, 0xF0001DFFF0003FFFu, 0x0000FFFFFFFFFFFFu, 0x0000000001080000u,
0xFFFFFFFFF0000000u, 0xF01FFFFFFFFFFFFFu, 0xFFFFF05FFFFFFFF9u, 0xF003FFFFFFFFFFFFu,
0x0000000007FFFFFFu,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0xD04ull) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0xD04ull) % 0x40ull));
// 2241 code units from 82 ranges (spanning a search area of 3099)
}
case 0x02: // [2] 1940 - 258A
{
if (U'\u1950' > c || c > U'\u2184')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
0xFFFF001F3FFFFFFFu, 0x03FFFFFF0FFFFFFFu, 0xFFFF000000000000u, 0xFFFFFFFFFFFF007Fu,
0x000000000000001Fu, 0x0000000000800000u, 0xFFE0000000000000u, 0x1FE0000FFFFFFFFFu,
0xFFF8000000000000u, 0xFFFFFC00C001FFFFu, 0xFFFF0000003FFFFFu, 0xE0000000000FFFFFu,
0x01FF3FFFFFFFFC00u, 0x0000E7FFFFFFFFFFu, 0xFFFF046FDE000000u, 0xFFFFFFFFFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0x0000FFFFFFFFFFFFu, 0xFFFF000000000000u, 0xFFFFFFFFFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0x3F3FFFFFFFFF3F3Fu,
0xFFFF3FFFFFFFAAFFu, 0x1FDC5FDFFFFFFFFFu, 0x00001FDC1FFF0FCFu, 0x0000000000000000u,
0x0000800200000000u, 0x0000000000001FFFu, 0xFC84000000000000u, 0x43E0F3FFBD503E2Fu,
0x0018000000000000u,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x1950ull) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0x1950ull) % 0x40ull));
// 1185 code units from 59 ranges (spanning a search area of 2101)
}
case 0x03: // [3] 258B - 31D5
{
if (U'\u2C00' > c || c > U'\u31BF')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0x000C781FFFFFFFFFu,
0xFFFF20BFFFFFFFFFu, 0x000080FFFFFFFFFFu, 0x7F7F7F7F007FFFFFu, 0x000000007F7F7F7Fu,
0x0000800000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x183E000000000060u, 0xFFFFFFFFFFFFFFFEu, 0xFFFFFFFEE07FFFFFu, 0xF7FFFFFFFFFFFFFFu,
0xFFFEFFFFFFFFFFE0u, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFF00007FFFu,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x2C00ull) / 0x40ull]
& (0x1ull << (static_cast<uint_least64_t>(c) % 0x40ull));
// 773 code units from 28 ranges (spanning a search area of 1472)
}
case 0x04: return (U'\u31F0' <= c && c <= U'\u31FF') || U'\u3400' <= c;
case 0x06: return c <= U'\u4DBF' || U'\u4E00' <= c;
case 0x0D: // [13] A079 - ACC3
{
TOML_ASSUME(U'\uA079' <= c && c <= U'\uACC3');
constexpr uint_least64_t bitmask_table_1[] = {
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0x00000000000FFFFFu, 0xFFFFFFFFFF800000u, 0xFFFFFFFFFFFFFF9Fu, 0xFFFFFFFFFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0x0006007FFF8FFFFFu, 0x003FFFFFFFFFFF80u,
0xFFFFFF9FFFFFFFC0u, 0x00001FFFFFFFFFFFu, 0xFFFFFE7FC0000000u, 0xFFFFFFFFFFFFFFFFu,
0xFFFFFFFFFFFCFFFFu, 0xFE000001F583FFFFu, 0x000003FFFFFBDDFFu, 0x07FFFFFFFFFFFF80u,
0x07FFFFFFFFFFFE00u, 0x7E00000000000000u, 0xFF801FFFFFFE0034u, 0xFFFFFF8000003FFFu,
0x03FFFFFFFFFFF80Fu, 0x007FEF8000400000u, 0x0000FFFFFFFFFFBEu, 0x3FFFFF800007FB80u,
0x317FFFFFFFFFFFE2u, 0x0E03FF9C0000029Fu, 0xFFBFBF803F3F3F00u, 0xFF81FFFBFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0x000003FFFFFFFFFFu, 0xFFFFFFFFFFFFFF80u, 0xFFFFFFFFFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0x00000000000007FFu,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0xA079ull) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0xA079ull) % 0x40ull));
// 2567 code units from 54 ranges (spanning a search area of 3147)
}
case 0x11:
return c <= U'\uD7A3' || (U'\uD7B0' <= c && c <= U'\uD7C6') || (U'\uD7CB' <= c && c <= U'\uD7FB');
case 0x14: // [20] F686 - 102D0
{
if (U'\uF900' > c)
return false;
TOML_ASSUME(c <= U'\U000102D0');
constexpr uint_least64_t bitmask_table_1[] = {
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0xFFFF3FFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0x0000000003FFFFFFu,
0x5F7FFDFFA0F8007Fu, 0xFFFFFFFFFFFFFFDBu, 0x0003FFFFFFFFFFFFu, 0xFFFFFFFFFFF80000u,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0x3FFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFF0000u, 0xFFFFFFFFFFFCFFFFu, 0x0FFF0000000000FFu,
0x0000000000000000u, 0xFFDF000000000000u, 0xFFFFFFFFFFFFFFFFu, 0x1FFFFFFFFFFFFFFFu,
0x07FFFFFE00000000u, 0xFFFFFFC007FFFFFEu, 0x7FFFFFFFFFFFFFFFu, 0x000000001CFCFCFCu,
0xB7FFFF7FFFFFEFFFu, 0x000000003FFF3FFFu, 0xFFFFFFFFFFFFFFFFu, 0x07FFFFFFFFFFFFFFu,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0xFFFFFFFF1FFFFFFFu, 0x000000000001FFFFu,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0xF900ull) / 0x40ull]
& (0x1ull << (static_cast<uint_least64_t>(c) % 0x40ull));
// 1710 code units from 34 ranges (spanning a search area of 2513)
}
case 0x15: // [21] 102D1 - 10F1B
{
if (U'\U00010300' > c)
return false;
TOML_ASSUME(c <= U'\U00010F1B');
constexpr uint_least64_t bitmask_table_1[] = {
0xFFFFE000FFFFFFFFu, 0x003FFFFFFFFF03FDu, 0xFFFFFFFF3FFFFFFFu, 0x000000000000FF0Fu,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFF00003FFFFFFFu, 0x0FFFFFFFFF0FFFFFu,
0xFFFF00FFFFFFFFFFu, 0xF7FF000FFFFFFFFFu, 0x1BFBFFFBFFB7F7FFu, 0x0000000000000000u,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0x007FFFFFFFFFFFFFu, 0x000000FF003FFFFFu, 0x07FDFFFFFFFFFFBFu, 0x0000000000000000u,
0x91BFFFFFFFFFFD3Fu, 0x007FFFFF003FFFFFu, 0x000000007FFFFFFFu, 0x0037FFFF00000000u,
0x03FFFFFF003FFFFFu, 0x0000000000000000u, 0xC0FFFFFFFFFFFFFFu, 0x0000000000000000u,
0x003FFFFFFEEF0001u, 0x1FFFFFFF00000000u, 0x000000001FFFFFFFu, 0x0000001FFFFFFEFFu,
0x003FFFFFFFFFFFFFu, 0x0007FFFF003FFFFFu, 0x000000000003FFFFu, 0x0000000000000000u,
0xFFFFFFFFFFFFFFFFu, 0x00000000000001FFu, 0x0007FFFFFFFFFFFFu, 0x0007FFFFFFFFFFFFu,
0x0000000FFFFFFFFFu, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x000303FFFFFFFFFFu, 0x0000000000000000u,
0x000000000FFFFFFFu,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x10300ull) / 0x40ull]
& (0x1ull << (static_cast<uint_least64_t>(c) % 0x40ull));
// 1747 code units from 59 ranges (spanning a search area of 3100)
}
case 0x16: // [22] 10F1C - 11B66
{
if (c > U'\U00011AF8')
return false;
TOML_ASSUME(U'\U00010F1C' <= c);
constexpr uint_least64_t bitmask_table_1[] = {
0x000003FFFFF00801u, 0x0000003FFFF00000u, 0x000001FFFFF00000u, 0xFFFFFF8007FFFFF0u,
0x000000000FFFFFFFu, 0xFFFFFF8002600000u, 0xFFF00000000FFFFFu, 0xFFFFFF8000001FFFu,
0xFFF00900000007FFu, 0xFFFFFF80047FFFFFu, 0x400001E0007FFFFFu, 0xFFBFFFF000000001u,
0x000000000000FFFFu, 0xFFFBD7F000000000u, 0xFFFFFFFFFFF01FFBu, 0xFF99FE0000000007u,
0x001000023EDFDFFFu, 0x000000000000003Eu, 0x0000000000000000u, 0xFFFFFFF000000000u,
0x0000780001FFFFFFu, 0xFFFFFFF000000038u, 0x00000B00000FFFFFu, 0x0000000000000000u,
0x0000000000000000u, 0xFFFFFFF000000000u, 0xF00000000007FFFFu, 0xFFFFFFF000000000u,
0x00000100000FFFFFu, 0xFFFFFFF000000000u, 0x0000000010007FFFu, 0x7FFFFFF000000000u,
0x000007F000000000u, 0x0000000000000000u, 0x0000000000000000u, 0xFFFFFFF000000000u,
0x000000000000FFFFu, 0x0000000000000000u, 0xFFFFFFFFFFFFFFF0u, 0xF6FF27F80000000Fu,
0x00000028000FFFFFu, 0x0000000000000000u, 0x001FFFFFFFFFCFF0u, 0xFFFF8010000000A0u,
0x00100000407FFFFFu, 0x00003FFFFFFFFFFFu, 0xFFFFFFFFFFF00002u, 0x000000001FFFFFFFu,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x10F1Cull) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0x10F1Cull) % 0x40ull));
// 1174 code units from 71 ranges (spanning a search area of 3037)
}
case 0x17: // [23] 11B67 - 127B1
{
if (U'\U00011C00' > c || c > U'\U00012543')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
0x00007FFFFFFFFDFFu, 0xFFFC000000000001u, 0x000000000000FFFFu, 0x0000000000000000u,
0x0001FFFFFFFFFB7Fu, 0xFFFFFDBF00000040u, 0x00000000010003FFu, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0007FFFF00000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0001000000000000u, 0x0000000000000000u,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0x0000000003FFFFFFu, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0x000000000000000Fu,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x11C00ull) / 0x40ull]
& (0x1ull << (static_cast<uint_least64_t>(c) % 0x40ull));
// 1304 code units from 16 ranges (spanning a search area of 2372)
}
case 0x18: return (U'\U00012F90' <= c && c <= U'\U00012FF0') || U'\U00013000' <= c;
case 0x19: return c <= U'\U0001342E';
case 0x1A: return U'\U00014400' <= c && c <= U'\U00014646';
case 0x1D: // [29] 16529 - 17173
{
if (U'\U00016800' > c)
return false;
TOML_ASSUME(c <= U'\U00017173');
constexpr uint_least64_t bitmask_table_1[] = {
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0x01FFFFFFFFFFFFFFu, 0xFFFF00007FFFFFFFu, 0x7FFFFFFFFFFFFFFFu, 0x00003FFFFFFF0000u,
0x0000FFFFFFFFFFFFu, 0xE0FFFFF80000000Fu, 0x000000000000FFFFu, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0xFFFFFFFFFFFFFFFFu, 0x0000000000000000u, 0x0000000000000000u,
0xFFFFFFFFFFFFFFFFu, 0x00000000000107FFu, 0x00000000FFF80000u, 0x0000000B00000000u,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0x000FFFFFFFFFFFFFu,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x16800ull) / 0x40ull]
& (0x1ull << (static_cast<uint_least64_t>(c) % 0x40ull));
// 1329 code units from 15 ranges (spanning a search area of 2420)
}
case 0x1F: return c <= U'\U000187F7' || U'\U00018800' <= c;
case 0x20: return c <= U'\U00018CD5' || (U'\U00018D00' <= c && c <= U'\U00018D08');
case 0x23: // [35] 1AEEB - 1BB35
{
if (U'\U0001AFF0' > c || c > U'\U0001B2FB')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
0xFFFFFFFFFFFF6FEFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0x0007FFFFFFFFFFFFu, 0x00F0000700000000u, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0x0000000000000FFFu,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x1AFF0ull) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0x1AFF0ull) % 0x40ull));
// 707 code units from 7 ranges (spanning a search area of 780)
}
case 0x24: // [36] 1BB36 - 1C780
{
if (U'\U0001BC00' > c || c > U'\U0001BC99')
return false;
switch ((static_cast<uint_least64_t>(c) - 0x1BC00ull) / 0x40ull)
{
case 0x01:
return c <= U'\U0001BC7C'
&& (1ull << (static_cast<uint_least64_t>(c) - 0x1BC40u)) & 0x1FFF07FFFFFFFFFFull;
case 0x02: return (1u << (static_cast<uint_least32_t>(c) - 0x1BC80u)) & 0x3FF01FFu;
default: return true;
}
// 139 code units from 4 ranges (spanning a search area of 154)
TOML_UNREACHABLE;
}
case 0x26: // [38] 1D3CC - 1E016
{
if (U'\U0001D400' > c || c > U'\U0001DF1E')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFDFFFFFu, 0xEBFFDE64DFFFFFFFu, 0xFFFFFFFFFFFFFFEFu,
0x7BFFFFFFDFDFE7BFu, 0xFFFFFFFFFFFDFC5Fu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFF3FFFFFFFFFu, 0xF7FFFFFFF7FFFFFDu,
0xFFDFFFFFFFDFFFFFu, 0xFFFF7FFFFFFF7FFFu, 0xFFFFFDFFFFFFFDFFu, 0x0000000000000FF7u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x000000007FFFFFFFu,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x1D400ull) / 0x40ull]
& (0x1ull << (static_cast<uint_least64_t>(c) % 0x40ull));
// 967 code units from 31 ranges (spanning a search area of 2847)
}
case 0x27: // [39] 1E017 - 1EC61
{
if (U'\U0001E100' > c || c > U'\U0001E94B')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
0x3F801FFFFFFFFFFFu, 0x0000000000004000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x00003FFFFFFF0000u, 0x00000FFFFFFFFFFFu,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x7FFF6F7F00000000u,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0x000000000000001Fu,
0xFFFFFFFFFFFFFFFFu, 0x000000000000080Fu,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x1E100ull) / 0x40ull]
& (0x1ull << (static_cast<uint_least64_t>(c) % 0x40ull));
// 421 code units from 12 ranges (spanning a search area of 2124)
}
case 0x28: // [40] 1EC62 - 1F8AC
{
if (U'\U0001EE00' > c || c > U'\U0001EEBB')
return false;
switch ((static_cast<uint_least64_t>(c) - 0x1EE00ull) / 0x40ull)
{
case 0x00:
return c <= U'\U0001EE3B'
&& (1ull << (static_cast<uint_least64_t>(c) - 0x1EE00u)) & 0xAF7FE96FFFFFFEFull;
case 0x01:
return U'\U0001EE42' <= c && c <= U'\U0001EE7E'
&& (1ull << (static_cast<uint_least64_t>(c) - 0x1EE42u)) & 0x17BDFDE5AAA5BAA1ull;
case 0x02: return (1ull << (static_cast<uint_least64_t>(c) - 0x1EE80u)) & 0xFFFFBEE0FFFFBFFull;
default: TOML_UNREACHABLE;
}
// 141 code units from 33 ranges (spanning a search area of 188)
TOML_UNREACHABLE;
}
case 0x29: return U'\U00020000' <= c;
case 0x37: return c <= U'\U0002A6DF' || U'\U0002A700' <= c;
case 0x38: return c <= U'\U0002B738' || (U'\U0002B740' <= c && c <= U'\U0002B81D') || U'\U0002B820' <= c;
case 0x3A: return c <= U'\U0002CEA1' || U'\U0002CEB0' <= c;
case 0x3C: return c <= U'\U0002EBE0';
case 0x3D: return U'\U0002F800' <= c && c <= U'\U0002FA1D';
case 0x3E: return U'\U00030000' <= c;
default: TOML_UNREACHABLE;
}
// 131704 code units from 646 ranges (spanning a search area of 201377)
TOML_UNREACHABLE;
}
//# Returns true if a codepoint belongs to any of these categories:
//# Nd, Nl
TOML_CONST_GETTER
constexpr bool is_non_ascii_number(char32_t c) noexcept
{
if (U'\u0660' > c || c > U'\U0001FBF9')
return false;
const auto child_index_0 = (static_cast<uint_least64_t>(c) - 0x660ull) / 0x7D7ull;
if ((1ull << child_index_0) & 0x47FFDFE07FCFFFD0ull)
return false;
switch (child_index_0)
{
case 0x00: // [0] 0660 - 0E36
{
if (c > U'\u0DEF')
return false;
TOML_ASSUME(U'\u0660' <= c);
constexpr uint_least64_t bitmask_table_1[] = {
0x00000000000003FFu, 0x0000000000000000u, 0x0000000003FF0000u, 0x0000000000000000u,
0x0000000000000000u, 0x000003FF00000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x000000000000FFC0u, 0x0000000000000000u, 0x000000000000FFC0u, 0x0000000000000000u,
0x000000000000FFC0u, 0x0000000000000000u, 0x000000000000FFC0u, 0x0000000000000000u,
0x000000000000FFC0u, 0x0000000000000000u, 0x000000000000FFC0u, 0x0000000000000000u,
0x000000000000FFC0u, 0x0000000000000000u, 0x000000000000FFC0u, 0x0000000000000000u,
0x000000000000FFC0u, 0x0000000000000000u, 0x000000000000FFC0u,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x660ull) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0x660ull) % 0x40ull));
// 130 code units from 13 ranges (spanning a search area of 1936)
}
case 0x01: // [1] 0E37 - 160D
{
if (U'\u0E50' > c || c > U'\u1099')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
0x00000000000003FFu, 0x0000000000000000u, 0x00000000000003FFu, 0x0000000003FF0000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x03FF000000000000u,
0x0000000000000000u, 0x00000000000003FFu,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0xE50ull) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0xE50ull) % 0x40ull));
// 50 code units from 5 ranges (spanning a search area of 586)
}
case 0x02: // [2] 160E - 1DE4
{
if (U'\u16EE' > c || c > U'\u1C59')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
0x0000000000000007u, 0x0000000000000000u, 0x0000000000000000u, 0x0FFC000000000000u,
0x00000FFC00000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x00000003FF000000u, 0x0000000000000000u, 0x00000FFC00000000u,
0x0000000000000000u, 0x0000000000000000u, 0x00000FFC0FFC0000u, 0x0000000000000000u,
0x0000000000000000u, 0x00000FFC00000000u, 0x0000000000000000u, 0x0000000000000FFCu,
0x0000000000000000u, 0x00000FFC0FFC0000u,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x16EEull) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0x16EEull) % 0x40ull));
// 103 code units from 11 ranges (spanning a search area of 1388)
}
case 0x03:
return U'\u2160' <= c && c <= U'\u2188'
&& (1ull << (static_cast<uint_least64_t>(c) - 0x2160u)) & 0x1E7FFFFFFFFull;
case 0x05:
return U'\u3007' <= c && c <= U'\u303A'
&& (1ull << (static_cast<uint_least64_t>(c) - 0x3007u)) & 0xE0007FC000001ull;
case 0x14: // [20] A32C - AB02
{
if (U'\uA620' > c || c > U'\uAA59')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
0x00000000000003FFu, 0x0000000000000000u, 0x0000000000000000u, 0x000000000000FFC0u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x03FF000000000000u, 0x000003FF00000000u,
0x0000000000000000u, 0x0000000000000000u, 0x03FF000000000000u, 0x0000000003FF0000u,
0x03FF000000000000u,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0xA620ull) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0xA620ull) % 0x40ull));
// 70 code units from 7 ranges (spanning a search area of 1082)
}
case 0x15: return U'\uABF0' <= c && c <= U'\uABF9';
case 0x1F: return U'\uFF10' <= c && c <= U'\uFF19';
case 0x20: // [32] 10140 - 10916
{
if (c > U'\U000104A9')
return false;
TOML_ASSUME(U'\U00010140' <= c);
constexpr uint_least64_t bitmask_table_1[] = {
0x001FFFFFFFFFFFFFu, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000402u, 0x0000000000000000u, 0x00000000003E0000u, 0x0000000000000000u,
0x0000000000000000u, 0x000003FF00000000u,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x10140ull) / 0x40ull]
& (0x1ull << (static_cast<uint_least64_t>(c) % 0x40ull));
// 70 code units from 5 ranges (spanning a search area of 874)
}
case 0x21: return (U'\U00010D30' <= c && c <= U'\U00010D39') || (U'\U00011066' <= c && c <= U'\U0001106F');
case 0x22: // [34] 110EE - 118C4
{
if (U'\U000110F0' > c || c > U'\U00011739')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
0x00000000000003FFu, 0x000000000000FFC0u, 0x0000000000000000u, 0x000003FF00000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x00000000000003FFu, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x000003FF00000000u, 0x0000000000000000u, 0x000003FF00000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x000003FF00000000u, 0x0000000000000000u, 0x0000000003FF0000u,
0x0000000000000000u, 0x00000000000003FFu,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x110F0ull) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0x110F0ull) % 0x40ull));
// 90 code units from 9 ranges (spanning a search area of 1610)
}
case 0x23: // [35] 118C5 - 1209B
{
if (U'\U000118E0' > c || c > U'\U00011DA9')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
0x00000000000003FFu, 0x03FF000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x03FF000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x03FF000000000000u, 0x0000000000000000u, 0x00000000000003FFu,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x118E0ull) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0x118E0ull) % 0x40ull));
// 50 code units from 5 ranges (spanning a search area of 1226)
}
case 0x24: return U'\U00012400' <= c && c <= U'\U0001246E';
case 0x2D:
return (U'\U00016A60' <= c && c <= U'\U00016A69') || (U'\U00016AC0' <= c && c <= U'\U00016AC9')
|| (U'\U00016B50' <= c && c <= U'\U00016B59');
case 0x3B: return U'\U0001D7CE' <= c && c <= U'\U0001D7FF';
case 0x3C: return (U'\U0001E140' <= c && c <= U'\U0001E149') || (U'\U0001E2F0' <= c && c <= U'\U0001E2F9');
case 0x3D: return U'\U0001E950' <= c && c <= U'\U0001E959';
case 0x3F: return U'\U0001FBF0' <= c;
default: TOML_UNREACHABLE;
}
// 886 code units from 73 ranges (spanning a search area of 128410)
TOML_UNREACHABLE;
}
//# Returns true if a codepoint belongs to any of these categories:
//# Mn, Mc
TOML_CONST_GETTER
constexpr bool is_combining_mark(char32_t c) noexcept
{
if (U'\u0300' > c || c > U'\U000E01EF')
return false;
const auto child_index_0 = (static_cast<uint_least64_t>(c) - 0x300ull) / 0x37FCull;
if ((1ull << child_index_0) & 0x7FFFFFFFFFFFFE02ull)
return false;
switch (child_index_0)
{
case 0x00: // [0] 0300 - 3AFB
{
if (c > U'\u309A')
return false;
TOML_ASSUME(U'\u0300' <= c);
constexpr uint_least64_t bitmask_table_1[] = {
0xFFFFFFFFFFFFFFFFu, 0x0000FFFFFFFFFFFFu, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x00000000000000F8u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0xBFFFFFFFFFFE0000u, 0x00000000000000B6u,
0x0000000007FF0000u, 0x00010000FFFFF800u, 0x0000000000000000u, 0x00003D9F9FC00000u,
0xFFFF000000020000u, 0x00000000000007FFu, 0x0001FFC000000000u, 0x200FF80000000000u,
0x00003EEFFBC00000u, 0x000000000E000000u, 0x00000000FF000000u, 0xFFFFFFFBFFFFFC00u,
0xDC0000000000000Fu, 0x0000000C00FEFFFFu, 0xD00000000000000Eu, 0x4000000C0080399Fu,
0xD00000000000000Eu, 0x0023000000023987u, 0xD00000000000000Eu, 0xFC00000C00003BBFu,
0xD00000000000000Eu, 0x0000000C00E0399Fu, 0xC000000000000004u, 0x0000000000803DC7u,
0xD00000000000001Fu, 0x0000000C00603DDFu, 0xD00000000000000Eu, 0x0000000C00603DDFu,
0xD80000000000000Fu, 0x0000000C00803DDFu, 0x000000000000000Eu, 0x000C0000FF5F8400u,
0x07F2000000000000u, 0x0000000000007F80u, 0x1FF2000000000000u, 0x0000000000003F00u,
0xC2A0000003000000u, 0xFFFE000000000000u, 0x1FFFFFFFFEFFE0DFu, 0x0000000000000040u,
0x7FFFF80000000000u, 0x001E3F9DC3C00000u, 0x000000003C00BFFCu, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x00000000E0000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x001C0000003C0000u, 0x000C0000000C0000u, 0xFFF0000000000000u, 0x00000000200FFFFFu,
0x000000000000B800u, 0x0000000000000000u, 0x0000020000000060u, 0x0000000000000000u,
0x0FFF0FFF00000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x000000000F800000u, 0x9FFFFFFF7FE00000u, 0xBFFF000000000000u, 0x0000000000007FFFu,
0xFFF000000000001Fu, 0x000FF8000000001Fu, 0x00003FFE00000007u, 0x000FFFC000000000u,
0x00FFFFF000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x039021FFFFF70000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0xFFFFFFFFFFFFFFFFu,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0001FFE21FFF0000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0003800000000000u,
0x0000000000000000u, 0x8000000000000000u, 0x0000000000000000u, 0xFFFFFFFF00000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000FC0000000000u, 0x0000000000000000u, 0x0000000006000000u,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x300ull) / 0x40ull]
& (0x1ull << (static_cast<uint_least64_t>(c) % 0x40ull));
// 1141 code units from 158 ranges (spanning a search area of 11675)
}
case 0x02: // [2] 72F8 - AAF3
{
if (U'\uA66F' > c || c > U'\uAAEF')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
0x0001800000007FE1u, 0x0000000000000000u, 0x0000000000000006u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x21F0000010880000u, 0x0000000000000000u,
0x0000000000060000u, 0xFFFE0000007FFFE0u, 0x7F80000000010007u, 0x0000001FFF000000u,
0x00000000001E0000u, 0x004000000003FFF0u, 0xFC00000000000000u, 0x00000000601000FFu,
0x0000000000007000u, 0xF00000000005833Au, 0x0000000000000001u,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0xA66Full) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0xA66Full) % 0x40ull));
// 137 code units from 28 ranges (spanning a search area of 1153)
}
case 0x03:
return (U'\uAAF5' <= c && c <= U'\uAAF6') || (U'\uABE3' <= c && c <= U'\uABEA')
|| (U'\uABEC' <= c && c <= U'\uABED');
case 0x04: // [4] E2F0 - 11AEB
{
if (U'\uFB1E' > c || c > U'\U00011A99')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
0x0000000000000001u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0003FFFC00000000u,
0x000000000003FFFCu, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000080000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000004u,
0x0000000000000000u, 0x000000001F000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0003C1B800000000u,
0x000000021C000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000180u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x00000000000003C0u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000006000u, 0x0000000000000000u,
0x0007FF0000000000u, 0x000000F000000000u, 0x0000000000000000u, 0x0000001C00000000u,
0x000001FFFC000000u, 0x0000001E00640000u, 0x000000101FFC0000u, 0x0000001C00000000u,
0x00000180007FFE00u, 0x0000001C00200000u, 0x00037807FFE00000u, 0x0000000000000000u,
0x0000000103FFC000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000003C00001FFEu,
0x0200E67F60000000u, 0x00000000007C7F30u, 0x0000000000000000u, 0x0000000000000000u,
0x000001FFFF800000u, 0x0000000000000001u, 0x0000003FFFFC0000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0xC0000007FCFE0000u, 0x0000000000000000u,
0x00000007FFFC0000u, 0x0000000000000000u, 0x0000000003FFE000u, 0x8000000000000000u,
0x0000000000003FFFu, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x000000001FFFC000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x00000035E6FC0000u, 0x0000000000000000u, 0xF3F8000000000000u, 0x00001FF800000047u,
0x3FF80201EFE00000u, 0x0FFFF00000000000u,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0xFB1Eull) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0xFB1Eull) % 0x40ull));
// 410 code units from 67 ranges (spanning a search area of 8060)
}
case 0x05: // [5] 11AEC - 152E7
{
if (U'\U00011C2F' > c || c > U'\U00011EF6')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
0x000000000001FEFFu, 0xFDFFFFF800000000u, 0x00000000000000FFu, 0x0000000000000000u,
0x00000000017F68FCu, 0x000001F6F8000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x00000000000000F0u,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x11C2Full) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0x11C2Full) % 0x40ull));
// 85 code units from 13 ranges (spanning a search area of 712)
}
case 0x06: // [6] 152E8 - 18AE3
{
if (U'\U00016AF0' > c || c > U'\U00016FF1')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
0x000000000000001Fu, 0x000000000000007Fu, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0xFFFFFFFE80000000u, 0x0000000780FFFFFFu, 0x0010000000000000u,
0x0000000000000003u,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x16AF0ull) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0x16AF0ull) % 0x40ull));
// 75 code units from 7 ranges (spanning a search area of 1282)
}
case 0x07: return U'\U0001BC9D' <= c && c <= U'\U0001BC9E';
case 0x08: // [8] 1C2E0 - 1FADB
{
if (U'\U0001CF00' > c || c > U'\U0001E94A')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
0xFFFF3FFFFFFFFFFFu, 0x000000000000007Fu, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0xF807E3E000000000u, 0x00003C0000000FE7u, 0x0000000000000000u,
0x0000000000000000u, 0x000000000000001Cu, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0xF87FFFFFFFFFFFFFu, 0x00201FFFFFFFFFFFu, 0x0000FFFEF8000010u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x000007DBF9FFFF7Fu, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x007F000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000400000000000u, 0x0000F00000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x00000000007F0000u,
0x0000000000000000u, 0x00000000000007F0u,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x1CF00ull) / 0x40ull]
& (0x1ull << (static_cast<uint_least64_t>(c) % 0x40ull));
// 293 code units from 24 ranges (spanning a search area of 6731)
}
case 0x3F: return U'\U000E0100' <= c;
default: TOML_UNREACHABLE;
}
// 2395 code units from 302 ranges (spanning a search area of 917232)
TOML_UNREACHABLE;
}
TOML_CONST_GETTER
constexpr bool is_non_ascii_bare_key_character(char32_t c) noexcept
{
return is_non_ascii_letter(c) || is_non_ascii_number(c) || is_combining_mark(c);
}
#endif // TOML_LANG_UNRELEASED
TOML_CONST_GETTER
constexpr bool is_bare_key_character(char32_t c) noexcept
{

View File

@ -0,0 +1,862 @@
//# This file is a part of toml++ and is subject to the the terms of the MIT license.
//# Copyright (c) Mark Gillard <mark.gillard@outlook.com.au>
//# See https://github.com/marzer/tomlplusplus/blob/master/LICENSE for the full license text.
// SPDX-License-Identifier: MIT
#pragma once
#include "preprocessor.h"
#include "header_start.h"
/// \cond
#if TOML_GCC && TOML_GCC < 9
#pragma GCC push_options
#pragma GCC optimize("O1") // codegen bugs
#endif
// the functions in this namespace block are automatically generated by a tool - they are not meant to be hand-edited
TOML_IMPL_NAMESPACE_START
{
TOML_CONST_GETTER
constexpr bool is_ascii_horizontal_whitespace(char32_t c) noexcept
{
return c == U'\t' || c == U' ';
}
TOML_CONST_GETTER
constexpr bool is_non_ascii_horizontal_whitespace(char32_t c) noexcept
{
// 20 code units from 8 ranges (spanning a search area of 65120)
if (c < U'\xA0' || c > U'\uFEFF')
return false;
const auto child_index_0 = (static_cast<uint_least64_t>(c) - 0xA0ull) / 0x3FAull;
if ((1ull << child_index_0) & 0x7FFFFFFFFFFFF75Eull)
return false;
if (c == U'\xA0' || c == U'\u3000' || c == U'\uFEFF')
return true;
switch (child_index_0)
{
case 0x05: return c == U'\u1680' || c == U'\u180E';
case 0x07:
return (U'\u2000' <= c && c <= U'\u200B') || (U'\u205F' <= c && c <= U'\u2060') || c == U'\u202F';
default: TOML_UNREACHABLE;
}
TOML_UNREACHABLE;
}
TOML_CONST_GETTER
constexpr bool is_horizontal_whitespace(char32_t c) noexcept
{
return is_ascii_horizontal_whitespace(c) || is_non_ascii_horizontal_whitespace(c);
}
TOML_CONST_GETTER
constexpr bool is_ascii_vertical_whitespace(char32_t c) noexcept
{
return c >= U'\n' && c <= U'\r';
}
TOML_CONST_GETTER
constexpr bool is_non_ascii_vertical_whitespace(char32_t c) noexcept
{
return (U'\u2028' <= c && c <= U'\u2029') || c == U'\x85';
}
TOML_CONST_GETTER
constexpr bool is_vertical_whitespace(char32_t c) noexcept
{
return is_ascii_vertical_whitespace(c) || is_non_ascii_vertical_whitespace(c);
}
TOML_CONST_GETTER
constexpr bool is_whitespace(char32_t c) noexcept
{
return is_horizontal_whitespace(c) || is_vertical_whitespace(c);
}
TOML_CONST_GETTER
constexpr bool is_ascii_bare_key_character(char32_t c) noexcept
{
#if TOML_LANG_UNRELEASED // toml/issues/644 ('+' in bare keys)
if (c == U'+')
return true;
#endif
// 64 code units from 5 ranges (spanning a search area of 78)
if (c < U'-' || c > U'z')
return false;
return (((static_cast<uint_least64_t>(c) - 0x2Dull) / 0x40ull) != 0ull)
|| ((1ull << (static_cast<uint_least64_t>(c) - 0x2Dull)) & 0xFFF43FFFFFF01FF9ull);
}
#if TOML_LANG_UNRELEASED // toml/issues/687 (unicode bare keys)
//# Returns true if a codepoint belongs to any of these categories:
//# Ll, Lm, Lo, Lt, Lu
TOML_CONST_GETTER
constexpr bool is_non_ascii_letter(char32_t c) noexcept
{
// 131704 code units from 646 ranges (spanning a search area of 201377)
if (c < U'\xAA' || c > U'\U0003134A')
return false;
const auto child_index_0 = (static_cast<uint_least64_t>(c) - 0xAAull) / 0xC4Bull;
if ((1ull << child_index_0) & 0x26180C0000ull)
return false;
if ((1ull << child_index_0) & 0x8A7FFC004001DFA0ull)
return true;
switch (child_index_0)
{
case 0x00: // [0] 00AA - 0CF4
{
// 1957 code units from 126 ranges (spanning a search area of 3145)
if (c > U'\u0CF2')
return false;
TOML_ASSUME(c >= U'\xAA');
constexpr uint_least64_t bitmask_table_1[] = {
0xFFFFDFFFFFC10801u, 0xFFFFFFFFFFFFDFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0x07C000FFF0FFFFFFu, 0x0000000000000014u, 0x0000000000000000u, 0xFEFFFFF5D02F37C0u,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFEFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFF00FFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFC09FFFFFFFFFBFu, 0x000000007FFFFFFFu,
0xFFFFFFC000000000u, 0xFFC00000000001E1u, 0x00000001FFFFFFFFu, 0xFFFFFFFFFFFFFFB0u,
0x18000BFFFFFFFFFFu, 0xFFFFFF4000270030u, 0xFFFFFFF80000003Fu, 0x0FFFFFFFFFFFFFFFu,
0xFFFFFFFF00000080u, 0x44010FFFFFC10C01u, 0xFFC07FFFFFC00000u, 0xFFC0001FBFFFFFC1u,
0x00000000FFFFFFFFu, 0xFFFFFFFFFC000000u, 0x00FFC0400008FFFFu, 0x7FFFFE67F87FFF80u,
0x00EC00100008F17Fu, 0x7FFFFE61F80400C0u, 0x001780000000DB7Fu, 0x7FFFFEEFF8000700u,
0x00C000400008FB7Fu, 0x7FFFFE67F8008000u, 0x00EC00000008FB7Fu, 0xC6358F71FA000080u,
0x000000400000FFF1u, 0x7FFFFF77F8000000u, 0x00C9C0000008FFFFu, 0x7FFFFF77F8400000u,
0x00D800000008FBFFu, 0x0000000000000180u,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0xAAull) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0xAAull) % 0x40ull));
}
case 0x01: // [1] 0CF5 - 193F
{
// 2241 code units from 82 ranges (spanning a search area of 3099)
if (c < U'\u0D04' || c > U'\u191E')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
0x027FFFFFFFFFDDFFu, 0x0FC0000038070400u, 0xF2FFBFFFFFC7FFFEu, 0xE000000000000007u,
0xF000DFFFFFFFFFFFu, 0x6000000000000007u, 0xF200DFFAFFFFFF7Du, 0x100000000F000005u,
0xF000000000000000u, 0x000001FFFFFFFFEFu, 0x00000000000001F0u, 0xF000000000000000u,
0x0800007FFFFFFFFFu, 0x3FFE1C0623C3F000u, 0xFFFFFFFFF0000400u, 0xFF7FFFFFFFFFF20Bu,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFF3D7F3DFu, 0xD7F3DFFFFFFFF3DFu, 0xFFFFFFFFFFF7FFF3u,
0xFFFFFFFFFFF3DFFFu, 0xF0000000007FFFFFu, 0xFFFFFFFFF0000FFFu, 0xE3F3FFFFFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0xEFFFF9FFFFFFFFFFu, 0xFFFFFFFFF07FFFFFu, 0xF01FE07FFFFFFFFFu,
0xF0003FFFF8003FFFu, 0xF0001DFFF0003FFFu, 0x0000FFFFFFFFFFFFu, 0x0000000001080000u,
0xFFFFFFFFF0000000u, 0xF01FFFFFFFFFFFFFu, 0xFFFFF05FFFFFFFF9u, 0xF003FFFFFFFFFFFFu,
0x0000000007FFFFFFu,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0xD04ull) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0xD04ull) % 0x40ull));
}
case 0x02: // [2] 1940 - 258A
{
// 1185 code units from 59 ranges (spanning a search area of 2101)
if (c < U'\u1950' || c > U'\u2184')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
0xFFFF001F3FFFFFFFu, 0x03FFFFFF0FFFFFFFu, 0xFFFF000000000000u, 0xFFFFFFFFFFFF007Fu,
0x000000000000001Fu, 0x0000000000800000u, 0xFFE0000000000000u, 0x1FE0000FFFFFFFFFu,
0xFFF8000000000000u, 0xFFFFFC00C001FFFFu, 0xFFFF0000003FFFFFu, 0xE0000000000FFFFFu,
0x01FF3FFFFFFFFC00u, 0x0000E7FFFFFFFFFFu, 0xFFFF046FDE000000u, 0xFFFFFFFFFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0x0000FFFFFFFFFFFFu, 0xFFFF000000000000u, 0xFFFFFFFFFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0x3F3FFFFFFFFF3F3Fu,
0xFFFF3FFFFFFFAAFFu, 0x1FDC5FDFFFFFFFFFu, 0x00001FDC1FFF0FCFu, 0x0000000000000000u,
0x0000800200000000u, 0x0000000000001FFFu, 0xFC84000000000000u, 0x43E0F3FFBD503E2Fu,
0x0018000000000000u,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x1950ull) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0x1950ull) % 0x40ull));
}
case 0x03: // [3] 258B - 31D5
{
// 773 code units from 28 ranges (spanning a search area of 1472)
if (c < U'\u2C00' || c > U'\u31BF')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0x000C781FFFFFFFFFu,
0xFFFF20BFFFFFFFFFu, 0x000080FFFFFFFFFFu, 0x7F7F7F7F007FFFFFu, 0x000000007F7F7F7Fu,
0x0000800000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x183E000000000060u, 0xFFFFFFFFFFFFFFFEu, 0xFFFFFFFEE07FFFFFu, 0xF7FFFFFFFFFFFFFFu,
0xFFFEFFFFFFFFFFE0u, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFF00007FFFu,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x2C00ull) / 0x40ull]
& (0x1ull << (static_cast<uint_least64_t>(c) % 0x40ull));
}
case 0x04: return (U'\u31F0' <= c && c <= U'\u31FF') || U'\u3400' <= c;
case 0x06: return c <= U'\u4DBF' || U'\u4E00' <= c;
case 0x0D: // [13] A079 - ACC3
{
// 2567 code units from 54 ranges (spanning a search area of 3147)
TOML_ASSUME(c >= U'\uA079' && c <= U'\uACC3');
constexpr uint_least64_t bitmask_table_1[] = {
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0x00000000000FFFFFu, 0xFFFFFFFFFF800000u, 0xFFFFFFFFFFFFFF9Fu, 0xFFFFFFFFFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0x0006007FFF8FFFFFu, 0x003FFFFFFFFFFF80u,
0xFFFFFF9FFFFFFFC0u, 0x00001FFFFFFFFFFFu, 0xFFFFFE7FC0000000u, 0xFFFFFFFFFFFFFFFFu,
0xFFFFFFFFFFFCFFFFu, 0xFE000001F583FFFFu, 0x000003FFFFFBDDFFu, 0x07FFFFFFFFFFFF80u,
0x07FFFFFFFFFFFE00u, 0x7E00000000000000u, 0xFF801FFFFFFE0034u, 0xFFFFFF8000003FFFu,
0x03FFFFFFFFFFF80Fu, 0x007FEF8000400000u, 0x0000FFFFFFFFFFBEu, 0x3FFFFF800007FB80u,
0x317FFFFFFFFFFFE2u, 0x0E03FF9C0000029Fu, 0xFFBFBF803F3F3F00u, 0xFF81FFFBFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0x000003FFFFFFFFFFu, 0xFFFFFFFFFFFFFF80u, 0xFFFFFFFFFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0x00000000000007FFu,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0xA079ull) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0xA079ull) % 0x40ull));
}
case 0x11:
return c <= U'\uD7A3' || (U'\uD7B0' <= c && c <= U'\uD7C6') || (U'\uD7CB' <= c && c <= U'\uD7FB');
case 0x14: // [20] F686 - 102D0
{
// 1710 code units from 34 ranges (spanning a search area of 2513)
if (c < U'\uF900')
return false;
TOML_ASSUME(c <= U'\U000102D0');
constexpr uint_least64_t bitmask_table_1[] = {
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0xFFFF3FFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0x0000000003FFFFFFu,
0x5F7FFDFFA0F8007Fu, 0xFFFFFFFFFFFFFFDBu, 0x0003FFFFFFFFFFFFu, 0xFFFFFFFFFFF80000u,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0x3FFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFF0000u, 0xFFFFFFFFFFFCFFFFu, 0x0FFF0000000000FFu,
0x0000000000000000u, 0xFFDF000000000000u, 0xFFFFFFFFFFFFFFFFu, 0x1FFFFFFFFFFFFFFFu,
0x07FFFFFE00000000u, 0xFFFFFFC007FFFFFEu, 0x7FFFFFFFFFFFFFFFu, 0x000000001CFCFCFCu,
0xB7FFFF7FFFFFEFFFu, 0x000000003FFF3FFFu, 0xFFFFFFFFFFFFFFFFu, 0x07FFFFFFFFFFFFFFu,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0xFFFFFFFF1FFFFFFFu, 0x000000000001FFFFu,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0xF900ull) / 0x40ull]
& (0x1ull << (static_cast<uint_least64_t>(c) % 0x40ull));
}
case 0x15: // [21] 102D1 - 10F1B
{
// 1747 code units from 59 ranges (spanning a search area of 3100)
if (c < U'\U00010300')
return false;
TOML_ASSUME(c <= U'\U00010F1B');
constexpr uint_least64_t bitmask_table_1[] = {
0xFFFFE000FFFFFFFFu, 0x003FFFFFFFFF03FDu, 0xFFFFFFFF3FFFFFFFu, 0x000000000000FF0Fu,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFF00003FFFFFFFu, 0x0FFFFFFFFF0FFFFFu,
0xFFFF00FFFFFFFFFFu, 0xF7FF000FFFFFFFFFu, 0x1BFBFFFBFFB7F7FFu, 0x0000000000000000u,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0x007FFFFFFFFFFFFFu, 0x000000FF003FFFFFu, 0x07FDFFFFFFFFFFBFu, 0x0000000000000000u,
0x91BFFFFFFFFFFD3Fu, 0x007FFFFF003FFFFFu, 0x000000007FFFFFFFu, 0x0037FFFF00000000u,
0x03FFFFFF003FFFFFu, 0x0000000000000000u, 0xC0FFFFFFFFFFFFFFu, 0x0000000000000000u,
0x003FFFFFFEEF0001u, 0x1FFFFFFF00000000u, 0x000000001FFFFFFFu, 0x0000001FFFFFFEFFu,
0x003FFFFFFFFFFFFFu, 0x0007FFFF003FFFFFu, 0x000000000003FFFFu, 0x0000000000000000u,
0xFFFFFFFFFFFFFFFFu, 0x00000000000001FFu, 0x0007FFFFFFFFFFFFu, 0x0007FFFFFFFFFFFFu,
0x0000000FFFFFFFFFu, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x000303FFFFFFFFFFu, 0x0000000000000000u,
0x000000000FFFFFFFu,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x10300ull) / 0x40ull]
& (0x1ull << (static_cast<uint_least64_t>(c) % 0x40ull));
}
case 0x16: // [22] 10F1C - 11B66
{
// 1174 code units from 71 ranges (spanning a search area of 3037)
if (c > U'\U00011AF8')
return false;
TOML_ASSUME(c >= U'\U00010F1C');
constexpr uint_least64_t bitmask_table_1[] = {
0x000003FFFFF00801u, 0x0000003FFFF00000u, 0x000001FFFFF00000u, 0xFFFFFF8007FFFFF0u,
0x000000000FFFFFFFu, 0xFFFFFF8002600000u, 0xFFF00000000FFFFFu, 0xFFFFFF8000001FFFu,
0xFFF00900000007FFu, 0xFFFFFF80047FFFFFu, 0x400001E0007FFFFFu, 0xFFBFFFF000000001u,
0x000000000000FFFFu, 0xFFFBD7F000000000u, 0xFFFFFFFFFFF01FFBu, 0xFF99FE0000000007u,
0x001000023EDFDFFFu, 0x000000000000003Eu, 0x0000000000000000u, 0xFFFFFFF000000000u,
0x0000780001FFFFFFu, 0xFFFFFFF000000038u, 0x00000B00000FFFFFu, 0x0000000000000000u,
0x0000000000000000u, 0xFFFFFFF000000000u, 0xF00000000007FFFFu, 0xFFFFFFF000000000u,
0x00000100000FFFFFu, 0xFFFFFFF000000000u, 0x0000000010007FFFu, 0x7FFFFFF000000000u,
0x000007F000000000u, 0x0000000000000000u, 0x0000000000000000u, 0xFFFFFFF000000000u,
0x000000000000FFFFu, 0x0000000000000000u, 0xFFFFFFFFFFFFFFF0u, 0xF6FF27F80000000Fu,
0x00000028000FFFFFu, 0x0000000000000000u, 0x001FFFFFFFFFCFF0u, 0xFFFF8010000000A0u,
0x00100000407FFFFFu, 0x00003FFFFFFFFFFFu, 0xFFFFFFFFFFF00002u, 0x000000001FFFFFFFu,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x10F1Cull) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0x10F1Cull) % 0x40ull));
}
case 0x17: // [23] 11B67 - 127B1
{
// 1304 code units from 16 ranges (spanning a search area of 2372)
if (c < U'\U00011C00' || c > U'\U00012543')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
0x00007FFFFFFFFDFFu, 0xFFFC000000000001u, 0x000000000000FFFFu, 0x0000000000000000u,
0x0001FFFFFFFFFB7Fu, 0xFFFFFDBF00000040u, 0x00000000010003FFu, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0007FFFF00000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0001000000000000u, 0x0000000000000000u,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0x0000000003FFFFFFu, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0x000000000000000Fu,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x11C00ull) / 0x40ull]
& (0x1ull << (static_cast<uint_least64_t>(c) % 0x40ull));
}
case 0x18: return (U'\U00012F90' <= c && c <= U'\U00012FF0') || U'\U00013000' <= c;
case 0x19: return c <= U'\U0001342E';
case 0x1A: return c >= U'\U00014400' && c <= U'\U00014646';
case 0x1D: // [29] 16529 - 17173
{
// 1329 code units from 15 ranges (spanning a search area of 2420)
if (c < U'\U00016800')
return false;
TOML_ASSUME(c <= U'\U00017173');
constexpr uint_least64_t bitmask_table_1[] = {
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0x01FFFFFFFFFFFFFFu, 0xFFFF00007FFFFFFFu, 0x7FFFFFFFFFFFFFFFu, 0x00003FFFFFFF0000u,
0x0000FFFFFFFFFFFFu, 0xE0FFFFF80000000Fu, 0x000000000000FFFFu, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0xFFFFFFFFFFFFFFFFu, 0x0000000000000000u, 0x0000000000000000u,
0xFFFFFFFFFFFFFFFFu, 0x00000000000107FFu, 0x00000000FFF80000u, 0x0000000B00000000u,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0x000FFFFFFFFFFFFFu,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x16800ull) / 0x40ull]
& (0x1ull << (static_cast<uint_least64_t>(c) % 0x40ull));
}
case 0x1F: return c <= U'\U000187F7' || U'\U00018800' <= c;
case 0x20: return c <= U'\U00018CD5' || (U'\U00018D00' <= c && c <= U'\U00018D08');
case 0x23: // [35] 1AEEB - 1BB35
{
// 707 code units from 7 ranges (spanning a search area of 780)
if (c < U'\U0001AFF0' || c > U'\U0001B2FB')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
0xFFFFFFFFFFFF6FEFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0x0007FFFFFFFFFFFFu, 0x00F0000700000000u, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0x0000000000000FFFu,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x1AFF0ull) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0x1AFF0ull) % 0x40ull));
}
case 0x24: // [36] 1BB36 - 1C780
{
// 139 code units from 4 ranges (spanning a search area of 154)
if (c < U'\U0001BC00' || c > U'\U0001BC99')
return false;
switch ((static_cast<uint_least64_t>(c) - 0x1BC00ull) / 0x40ull)
{
case 0x01:
return c <= U'\U0001BC7C'
&& (1ull << (static_cast<uint_least64_t>(c) - 0x1BC40ull)) & 0x1FFF07FFFFFFFFFFull;
case 0x02: return (1u << (static_cast<uint_least32_t>(c) - 0x1BC80u)) & 0x3FF01FFu;
default: return true;
}
TOML_UNREACHABLE;
}
case 0x26: // [38] 1D3CC - 1E016
{
// 967 code units from 31 ranges (spanning a search area of 2847)
if (c < U'\U0001D400' || c > U'\U0001DF1E')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFDFFFFFu, 0xEBFFDE64DFFFFFFFu, 0xFFFFFFFFFFFFFFEFu,
0x7BFFFFFFDFDFE7BFu, 0xFFFFFFFFFFFDFC5Fu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFF3FFFFFFFFFu, 0xF7FFFFFFF7FFFFFDu,
0xFFDFFFFFFFDFFFFFu, 0xFFFF7FFFFFFF7FFFu, 0xFFFFFDFFFFFFFDFFu, 0x0000000000000FF7u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x000000007FFFFFFFu,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x1D400ull) / 0x40ull]
& (0x1ull << (static_cast<uint_least64_t>(c) % 0x40ull));
}
case 0x27: // [39] 1E017 - 1EC61
{
// 421 code units from 12 ranges (spanning a search area of 2124)
if (c < U'\U0001E100' || c > U'\U0001E94B')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
0x3F801FFFFFFFFFFFu, 0x0000000000004000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x00003FFFFFFF0000u, 0x00000FFFFFFFFFFFu,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x7FFF6F7F00000000u,
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0x000000000000001Fu,
0xFFFFFFFFFFFFFFFFu, 0x000000000000080Fu,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x1E100ull) / 0x40ull]
& (0x1ull << (static_cast<uint_least64_t>(c) % 0x40ull));
}
case 0x28: // [40] 1EC62 - 1F8AC
{
// 141 code units from 33 ranges (spanning a search area of 188)
if (c < U'\U0001EE00' || c > U'\U0001EEBB')
return false;
switch ((static_cast<uint_least64_t>(c) - 0x1EE00ull) / 0x40ull)
{
case 0x00:
return c <= U'\U0001EE3B'
&& (1ull << (static_cast<uint_least64_t>(c) - 0x1EE00ull)) & 0xAF7FE96FFFFFFEFull;
case 0x01:
return c >= U'\U0001EE42' && c <= U'\U0001EE7E'
&& (1ull << (static_cast<uint_least64_t>(c) - 0x1EE42ull)) & 0x17BDFDE5AAA5BAA1ull;
case 0x02: return (1ull << (static_cast<uint_least64_t>(c) - 0x1EE80ull)) & 0xFFFFBEE0FFFFBFFull;
default: TOML_UNREACHABLE;
}
TOML_UNREACHABLE;
}
case 0x29: return c >= U'\U00020000';
case 0x37: return c <= U'\U0002A6DF' || U'\U0002A700' <= c;
case 0x38: return c <= U'\U0002B738' || (U'\U0002B740' <= c && c <= U'\U0002B81D') || U'\U0002B820' <= c;
case 0x3A: return c <= U'\U0002CEA1' || U'\U0002CEB0' <= c;
case 0x3C: return c <= U'\U0002EBE0';
case 0x3D: return c >= U'\U0002F800' && c <= U'\U0002FA1D';
case 0x3E: return c >= U'\U00030000';
default: TOML_UNREACHABLE;
}
TOML_UNREACHABLE;
}
//# Returns true if a codepoint belongs to any of these categories:
//# Nd, Nl
TOML_CONST_GETTER
constexpr bool is_non_ascii_number(char32_t c) noexcept
{
// 886 code units from 73 ranges (spanning a search area of 128410)
if (c < U'\u0660' || c > U'\U0001FBF9')
return false;
const auto child_index_0 = (static_cast<uint_least64_t>(c) - 0x660ull) / 0x7D7ull;
if ((1ull << child_index_0) & 0x47FFDFE07FCFFFD0ull)
return false;
switch (child_index_0)
{
case 0x00: // [0] 0660 - 0E36
{
// 130 code units from 13 ranges (spanning a search area of 1936)
if (c > U'\u0DEF')
return false;
TOML_ASSUME(c >= U'\u0660');
constexpr uint_least64_t bitmask_table_1[] = {
0x00000000000003FFu, 0x0000000000000000u, 0x0000000003FF0000u, 0x0000000000000000u,
0x0000000000000000u, 0x000003FF00000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x000000000000FFC0u, 0x0000000000000000u, 0x000000000000FFC0u, 0x0000000000000000u,
0x000000000000FFC0u, 0x0000000000000000u, 0x000000000000FFC0u, 0x0000000000000000u,
0x000000000000FFC0u, 0x0000000000000000u, 0x000000000000FFC0u, 0x0000000000000000u,
0x000000000000FFC0u, 0x0000000000000000u, 0x000000000000FFC0u, 0x0000000000000000u,
0x000000000000FFC0u, 0x0000000000000000u, 0x000000000000FFC0u,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x660ull) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0x660ull) % 0x40ull));
}
case 0x01: // [1] 0E37 - 160D
{
// 50 code units from 5 ranges (spanning a search area of 586)
if (c < U'\u0E50' || c > U'\u1099')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
0x00000000000003FFu, 0x0000000000000000u, 0x00000000000003FFu, 0x0000000003FF0000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x03FF000000000000u,
0x0000000000000000u, 0x00000000000003FFu,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0xE50ull) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0xE50ull) % 0x40ull));
}
case 0x02: // [2] 160E - 1DE4
{
// 103 code units from 11 ranges (spanning a search area of 1388)
if (c < U'\u16EE' || c > U'\u1C59')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
0x0000000000000007u, 0x0000000000000000u, 0x0000000000000000u, 0x0FFC000000000000u,
0x00000FFC00000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x00000003FF000000u, 0x0000000000000000u, 0x00000FFC00000000u,
0x0000000000000000u, 0x0000000000000000u, 0x00000FFC0FFC0000u, 0x0000000000000000u,
0x0000000000000000u, 0x00000FFC00000000u, 0x0000000000000000u, 0x0000000000000FFCu,
0x0000000000000000u, 0x00000FFC0FFC0000u,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x16EEull) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0x16EEull) % 0x40ull));
}
case 0x03: return (U'\u2160' <= c && c <= U'\u2182') || (U'\u2185' <= c && c <= U'\u2188');
case 0x05:
return (U'\u3021' <= c && c <= U'\u3029') || (U'\u3038' <= c && c <= U'\u303A') || c == U'\u3007';
case 0x14: // [20] A32C - AB02
{
// 70 code units from 7 ranges (spanning a search area of 1082)
if (c < U'\uA620' || c > U'\uAA59')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
0x00000000000003FFu, 0x0000000000000000u, 0x0000000000000000u, 0x000000000000FFC0u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x03FF000000000000u, 0x000003FF00000000u,
0x0000000000000000u, 0x0000000000000000u, 0x03FF000000000000u, 0x0000000003FF0000u,
0x03FF000000000000u,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0xA620ull) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0xA620ull) % 0x40ull));
}
case 0x15: return c >= U'\uABF0' && c <= U'\uABF9';
case 0x1F: return c >= U'\uFF10' && c <= U'\uFF19';
case 0x20: // [32] 10140 - 10916
{
// 70 code units from 5 ranges (spanning a search area of 874)
if (c > U'\U000104A9')
return false;
TOML_ASSUME(c >= U'\U00010140');
constexpr uint_least64_t bitmask_table_1[] = {
0x001FFFFFFFFFFFFFu, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000402u, 0x0000000000000000u, 0x00000000003E0000u, 0x0000000000000000u,
0x0000000000000000u, 0x000003FF00000000u,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x10140ull) / 0x40ull]
& (0x1ull << (static_cast<uint_least64_t>(c) % 0x40ull));
}
case 0x21: return (U'\U00010D30' <= c && c <= U'\U00010D39') || (U'\U00011066' <= c && c <= U'\U0001106F');
case 0x22: // [34] 110EE - 118C4
{
// 90 code units from 9 ranges (spanning a search area of 1610)
if (c < U'\U000110F0' || c > U'\U00011739')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
0x00000000000003FFu, 0x000000000000FFC0u, 0x0000000000000000u, 0x000003FF00000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x00000000000003FFu, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x000003FF00000000u, 0x0000000000000000u, 0x000003FF00000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x000003FF00000000u, 0x0000000000000000u, 0x0000000003FF0000u,
0x0000000000000000u, 0x00000000000003FFu,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x110F0ull) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0x110F0ull) % 0x40ull));
}
case 0x23: // [35] 118C5 - 1209B
{
// 50 code units from 5 ranges (spanning a search area of 1226)
if (c < U'\U000118E0' || c > U'\U00011DA9')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
0x00000000000003FFu, 0x03FF000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x03FF000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x03FF000000000000u, 0x0000000000000000u, 0x00000000000003FFu,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x118E0ull) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0x118E0ull) % 0x40ull));
}
case 0x24: return c >= U'\U00012400' && c <= U'\U0001246E';
case 0x2D:
return (U'\U00016A60' <= c && c <= U'\U00016A69') || (U'\U00016AC0' <= c && c <= U'\U00016AC9')
|| (U'\U00016B50' <= c && c <= U'\U00016B59');
case 0x3B: return c >= U'\U0001D7CE' && c <= U'\U0001D7FF';
case 0x3C: return (U'\U0001E140' <= c && c <= U'\U0001E149') || (U'\U0001E2F0' <= c && c <= U'\U0001E2F9');
case 0x3D: return c >= U'\U0001E950' && c <= U'\U0001E959';
case 0x3F: return c >= U'\U0001FBF0';
default: TOML_UNREACHABLE;
}
TOML_UNREACHABLE;
}
//# Returns true if a codepoint belongs to any of these categories:
//# Mn, Mc
TOML_CONST_GETTER
constexpr bool is_combining_mark(char32_t c) noexcept
{
// 2395 code units from 302 ranges (spanning a search area of 917232)
if (c < U'\u0300' || c > U'\U000E01EF')
return false;
const auto child_index_0 = (static_cast<uint_least64_t>(c) - 0x300ull) / 0x37FCull;
if ((1ull << child_index_0) & 0x7FFFFFFFFFFFFE02ull)
return false;
switch (child_index_0)
{
case 0x00: // [0] 0300 - 3AFB
{
// 1141 code units from 158 ranges (spanning a search area of 11675)
if (c > U'\u309A')
return false;
TOML_ASSUME(c >= U'\u0300');
constexpr uint_least64_t bitmask_table_1[] = {
0xFFFFFFFFFFFFFFFFu, 0x0000FFFFFFFFFFFFu, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x00000000000000F8u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0xBFFFFFFFFFFE0000u, 0x00000000000000B6u,
0x0000000007FF0000u, 0x00010000FFFFF800u, 0x0000000000000000u, 0x00003D9F9FC00000u,
0xFFFF000000020000u, 0x00000000000007FFu, 0x0001FFC000000000u, 0x200FF80000000000u,
0x00003EEFFBC00000u, 0x000000000E000000u, 0x00000000FF000000u, 0xFFFFFFFBFFFFFC00u,
0xDC0000000000000Fu, 0x0000000C00FEFFFFu, 0xD00000000000000Eu, 0x4000000C0080399Fu,
0xD00000000000000Eu, 0x0023000000023987u, 0xD00000000000000Eu, 0xFC00000C00003BBFu,
0xD00000000000000Eu, 0x0000000C00E0399Fu, 0xC000000000000004u, 0x0000000000803DC7u,
0xD00000000000001Fu, 0x0000000C00603DDFu, 0xD00000000000000Eu, 0x0000000C00603DDFu,
0xD80000000000000Fu, 0x0000000C00803DDFu, 0x000000000000000Eu, 0x000C0000FF5F8400u,
0x07F2000000000000u, 0x0000000000007F80u, 0x1FF2000000000000u, 0x0000000000003F00u,
0xC2A0000003000000u, 0xFFFE000000000000u, 0x1FFFFFFFFEFFE0DFu, 0x0000000000000040u,
0x7FFFF80000000000u, 0x001E3F9DC3C00000u, 0x000000003C00BFFCu, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x00000000E0000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x001C0000003C0000u, 0x000C0000000C0000u, 0xFFF0000000000000u, 0x00000000200FFFFFu,
0x000000000000B800u, 0x0000000000000000u, 0x0000020000000060u, 0x0000000000000000u,
0x0FFF0FFF00000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x000000000F800000u, 0x9FFFFFFF7FE00000u, 0xBFFF000000000000u, 0x0000000000007FFFu,
0xFFF000000000001Fu, 0x000FF8000000001Fu, 0x00003FFE00000007u, 0x000FFFC000000000u,
0x00FFFFF000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x039021FFFFF70000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0xFFFFFFFFFFFFFFFFu,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0001FFE21FFF0000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0003800000000000u,
0x0000000000000000u, 0x8000000000000000u, 0x0000000000000000u, 0xFFFFFFFF00000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000FC0000000000u, 0x0000000000000000u, 0x0000000006000000u,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x300ull) / 0x40ull]
& (0x1ull << (static_cast<uint_least64_t>(c) % 0x40ull));
}
case 0x02: // [2] 72F8 - AAF3
{
// 137 code units from 28 ranges (spanning a search area of 1153)
if (c < U'\uA66F' || c > U'\uAAEF')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
0x0001800000007FE1u, 0x0000000000000000u, 0x0000000000000006u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x21F0000010880000u, 0x0000000000000000u,
0x0000000000060000u, 0xFFFE0000007FFFE0u, 0x7F80000000010007u, 0x0000001FFF000000u,
0x00000000001E0000u, 0x004000000003FFF0u, 0xFC00000000000000u, 0x00000000601000FFu,
0x0000000000007000u, 0xF00000000005833Au, 0x0000000000000001u,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0xA66Full) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0xA66Full) % 0x40ull));
}
case 0x03:
return (U'\uAAF5' <= c && c <= U'\uAAF6') || (U'\uABE3' <= c && c <= U'\uABEA')
|| (U'\uABEC' <= c && c <= U'\uABED');
case 0x04: // [4] E2F0 - 11AEB
{
// 410 code units from 67 ranges (spanning a search area of 8060)
if (c < U'\uFB1E' || c > U'\U00011A99')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
0x0000000000000001u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0003FFFC00000000u,
0x000000000003FFFCu, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000080000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000004u,
0x0000000000000000u, 0x000000001F000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0003C1B800000000u,
0x000000021C000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000180u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x00000000000003C0u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000006000u, 0x0000000000000000u,
0x0007FF0000000000u, 0x000000F000000000u, 0x0000000000000000u, 0x0000001C00000000u,
0x000001FFFC000000u, 0x0000001E00640000u, 0x000000101FFC0000u, 0x0000001C00000000u,
0x00000180007FFE00u, 0x0000001C00200000u, 0x00037807FFE00000u, 0x0000000000000000u,
0x0000000103FFC000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000003C00001FFEu,
0x0200E67F60000000u, 0x00000000007C7F30u, 0x0000000000000000u, 0x0000000000000000u,
0x000001FFFF800000u, 0x0000000000000001u, 0x0000003FFFFC0000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0xC0000007FCFE0000u, 0x0000000000000000u,
0x00000007FFFC0000u, 0x0000000000000000u, 0x0000000003FFE000u, 0x8000000000000000u,
0x0000000000003FFFu, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x000000001FFFC000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x00000035E6FC0000u, 0x0000000000000000u, 0xF3F8000000000000u, 0x00001FF800000047u,
0x3FF80201EFE00000u, 0x0FFFF00000000000u,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0xFB1Eull) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0xFB1Eull) % 0x40ull));
}
case 0x05: // [5] 11AEC - 152E7
{
// 85 code units from 13 ranges (spanning a search area of 712)
if (c < U'\U00011C2F' || c > U'\U00011EF6')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
0x000000000001FEFFu, 0xFDFFFFF800000000u, 0x00000000000000FFu, 0x0000000000000000u,
0x00000000017F68FCu, 0x000001F6F8000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x00000000000000F0u,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x11C2Full) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0x11C2Full) % 0x40ull));
}
case 0x06: // [6] 152E8 - 18AE3
{
// 75 code units from 7 ranges (spanning a search area of 1282)
if (c < U'\U00016AF0' || c > U'\U00016FF1')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
0x000000000000001Fu, 0x000000000000007Fu, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0xFFFFFFFE80000000u, 0x0000000780FFFFFFu, 0x0010000000000000u,
0x0000000000000003u,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x16AF0ull) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0x16AF0ull) % 0x40ull));
}
case 0x07: return c >= U'\U0001BC9D' && c <= U'\U0001BC9E';
case 0x08: // [8] 1C2E0 - 1FADB
{
// 293 code units from 24 ranges (spanning a search area of 6731)
if (c < U'\U0001CF00' || c > U'\U0001E94A')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
0xFFFF3FFFFFFFFFFFu, 0x000000000000007Fu, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0xF807E3E000000000u, 0x00003C0000000FE7u, 0x0000000000000000u,
0x0000000000000000u, 0x000000000000001Cu, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0xF87FFFFFFFFFFFFFu, 0x00201FFFFFFFFFFFu, 0x0000FFFEF8000010u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x000007DBF9FFFF7Fu, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x007F000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000400000000000u, 0x0000F00000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u, 0x00000000007F0000u,
0x0000000000000000u, 0x00000000000007F0u,
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x1CF00ull) / 0x40ull]
& (0x1ull << (static_cast<uint_least64_t>(c) % 0x40ull));
}
case 0x3F: return c >= U'\U000E0100';
default: TOML_UNREACHABLE;
}
TOML_UNREACHABLE;
}
TOML_CONST_GETTER
constexpr bool is_non_ascii_bare_key_character(char32_t c) noexcept
{
return is_non_ascii_letter(c) || is_non_ascii_number(c) || is_combining_mark(c);
}
#endif // TOML_LANG_UNRELEASED
}
TOML_IMPL_NAMESPACE_END;
#if TOML_GCC && TOML_GCC < 9
#pragma GCC pop_options
#endif
/// \endcond
#include "header_end.h"

View File

@ -48,6 +48,7 @@ TOML_DISABLE_SUGGEST_ATTR_WARNINGS;
#include "impl/array.h"
#include "impl/key.h"
#include "impl/table.h"
#include "impl/unicode_autogenerated.h"
#include "impl/unicode.h"
#include "impl/parse_error.h"
#include "impl/parse_result.h"

View File

@ -5,6 +5,8 @@ option('pedantic', type: 'boolean', value: false, description: 'Enable as man
option('time_trace', type: 'boolean', value: false, description: 'Enable the -ftime-trace option (Clang only)')
option('asan_examples', type: 'boolean', value: false)
option('asan_tests', type: 'boolean', value: false)
option('ubsan_examples', type: 'boolean', value: false)
option('ubsan_tests', type: 'boolean', value: false)
option('build_tt_encoder', type: 'boolean', value: false, description: 'Enable to build the toml-test encoder.')
option('build_tt_decoder', type: 'boolean', value: false, description: 'Enable to build the toml-test decoder.')
option('compile_library', type: 'boolean', value: false, description: 'Compile as a library')

View File

@ -42,9 +42,17 @@ fruit = []
"Entry 2",
])"sv;
static constexpr auto bool_mixed_case = R"(valid = False)"sv;
static constexpr auto bool_wrong_case_false = R"(b = FALSE)"sv;
static constexpr auto bool_wrong_case_true = R"(a = TRUE)"sv;
static constexpr auto bool_almost_false_with_extra = R"(a = falsify)"sv;
static constexpr auto bool_almost_false = R"(a = fals)"sv;
static constexpr auto bool_almost_true_with_extra = R"(a = truthy)"sv;
static constexpr auto bool_almost_true = R"(a = tru)"sv;
static constexpr auto bool_just_f = R"(a = f)"sv;
static constexpr auto bool_just_t = R"(a = t)"sv;
static constexpr auto bool_mixed_case = R"(valid = False)"sv;
static constexpr auto bool_starting_same_false = R"(a = falsey)"sv;
static constexpr auto bool_starting_same_true = R"(a = truer)"sv;
static constexpr auto bool_wrong_case_false = R"(b = FALSE)"sv;
static constexpr auto bool_wrong_case_true = R"(a = TRUE)"sv;
static constexpr auto control_bare_cr =
"# The following line contains a single carriage return control character\r\n"
@ -318,7 +326,6 @@ k = """t\ """)"sv;
static constexpr auto string_multiline_no_close = R"(invalid = """
this will fail)"sv;
static constexpr auto string_multiline_quotes_1 = R"(a = """6 quotes: """""")"sv;
static constexpr auto string_multiline_quotes_2 = R"(a = """6 quotes: """""")"sv;
static constexpr auto string_no_close = R"(no-ending-quote = "One time, at band camp)"sv;
static constexpr auto string_text_after_string = R"(string = "Is there life after strings?" No.)"sv;
static constexpr auto string_wrong_close = R"(bad-ending-quote = "double and single')"sv;
@ -441,8 +448,24 @@ TEST_CASE("conformance - burntsushi/invalid")
parsing_should_fail(FILE_LINE_ARGS, array_text_in_array); // array-text-in-array
parsing_should_fail(FILE_LINE_ARGS, bool_almost_false_with_extra); // bool-almost-false-with-extra
parsing_should_fail(FILE_LINE_ARGS, bool_almost_false); // bool-almost-false
parsing_should_fail(FILE_LINE_ARGS, bool_almost_true_with_extra); // bool-almost-true-with-extra
parsing_should_fail(FILE_LINE_ARGS, bool_almost_true); // bool-almost-true
parsing_should_fail(FILE_LINE_ARGS, bool_just_f); // bool-just-f
parsing_should_fail(FILE_LINE_ARGS, bool_just_t); // bool-just-t
parsing_should_fail(FILE_LINE_ARGS, bool_mixed_case); // bool-mixed-case
parsing_should_fail(FILE_LINE_ARGS, bool_starting_same_false); // bool-starting-same-false
parsing_should_fail(FILE_LINE_ARGS, bool_starting_same_true); // bool-starting-same-true
parsing_should_fail(FILE_LINE_ARGS, bool_wrong_case_false); // bool-wrong-case-false
parsing_should_fail(FILE_LINE_ARGS, bool_wrong_case_true); // bool-wrong-case-true
@ -813,8 +836,6 @@ TEST_CASE("conformance - burntsushi/invalid")
parsing_should_fail(FILE_LINE_ARGS, string_multiline_quotes_1); // string-multiline-quotes-1
parsing_should_fail(FILE_LINE_ARGS, string_multiline_quotes_2); // string-multiline-quotes-2
parsing_should_fail(FILE_LINE_ARGS, string_no_close); // string-no-close
parsing_should_fail(FILE_LINE_ARGS, string_text_after_string); // string-text-after-string

View File

@ -466,7 +466,11 @@ one_space = """ "one quote" """
two_space = """ ""two quotes"" """
mismatch1 = """aaa'''bbb"""
mismatch2 = '''aaa"""bbb''')"sv;
mismatch2 = '''aaa"""bbb'''
# Three opening """, then one escaped ", then two "" (allowed), and then three
# closing """
escaped = """lol\"""""")"sv;
static constexpr auto string_multiline =
"# NOTE: this file includes some literal tab characters.\n"
"\n"
@ -2170,20 +2174,25 @@ another line)"sv },
REQUIRE(tbl == expected);
});
parsing_should_succeed(
FILE_LINE_ARGS,
string_multiline_quotes,
[](toml::table&& tbl) // string-multiline-quotes
{
const auto expected = toml::table{
{ R"(lit_one)"sv, R"('one quote')"sv }, { R"(lit_one_space)"sv, R"( 'one quote' )"sv },
{ R"(lit_two)"sv, R"(''two quotes'')"sv }, { R"(lit_two_space)"sv, R"( ''two quotes'' )"sv },
{ R"(mismatch1)"sv, R"(aaa'''bbb)"sv }, { R"(mismatch2)"sv, R"(aaa"""bbb)"sv },
{ R"(one)"sv, R"("one quote")"sv }, { R"(one_space)"sv, R"( "one quote" )"sv },
{ R"(two)"sv, R"(""two quotes"")"sv }, { R"(two_space)"sv, R"( ""two quotes"" )"sv },
};
REQUIRE(tbl == expected);
});
parsing_should_succeed(FILE_LINE_ARGS,
string_multiline_quotes,
[](toml::table&& tbl) // string-multiline-quotes
{
const auto expected = toml::table{
{ R"(escaped)"sv, R"(lol""")"sv },
{ R"(lit_one)"sv, R"('one quote')"sv },
{ R"(lit_one_space)"sv, R"( 'one quote' )"sv },
{ R"(lit_two)"sv, R"(''two quotes'')"sv },
{ R"(lit_two_space)"sv, R"( ''two quotes'' )"sv },
{ R"(mismatch1)"sv, R"(aaa'''bbb)"sv },
{ R"(mismatch2)"sv, R"(aaa"""bbb)"sv },
{ R"(one)"sv, R"("one quote")"sv },
{ R"(one_space)"sv, R"( "one quote" )"sv },
{ R"(two)"sv, R"(""two quotes"")"sv },
{ R"(two_space)"sv, R"( ""two quotes"" )"sv },
};
REQUIRE(tbl == expected);
});
parsing_should_succeed(FILE_LINE_ARGS,
string_multiline,

View File

@ -116,6 +116,7 @@ foreach cpp20 : cpp20_modes
single_header = (counter % 2 == 1)
tl_optional = (counter % 4 == 2 and exceptions and not get_option('compile_library') and has_tl_optional)
address_sanitizer = (is_clang and not (single_header or tl_optional or fast_math)) and get_option('asan_tests')
ub_sanitizer = (is_clang and not (single_header or tl_optional or fast_math)) and get_option('ubsan_tests')
if cpp20
test_name = 'cpp20'
@ -143,9 +144,15 @@ foreach cpp20 : cpp20_modes
endif
endif
if address_sanitizer
if address_sanitizer or ub_sanitizer
test_args += [ '-g3' ]
test_overrides += 'b_sanitize=address'
if address_sanitizer and ub_sanitizer
test_overrides += 'b_sanitize=address,undefined'
elif address_sanitizer
test_overrides += 'b_sanitize=address'
else
test_overrides += 'b_sanitize=undefined'
endif
endif
if fast_math

View File

@ -73,6 +73,7 @@
<ClInclude Include="include\toml++\impl\table.h" />
<ClInclude Include="include\toml++\impl\table.inl" />
<ClInclude Include="include\toml++\impl\unicode.h" />
<ClInclude Include="include\toml++\impl\unicode_autogenerated.h" />
<ClInclude Include="include\toml++\impl\value.h" />
<ClInclude Include="include\toml++\impl\version.h" />
<ClInclude Include="include\toml++\impl\std_string.inl" />

View File

@ -130,6 +130,9 @@
<ClInclude Include="include\toml++\impl\at_path.h">
<Filter>include\impl</Filter>
</ClInclude>
<ClInclude Include="include\toml++\impl\unicode_autogenerated.h">
<Filter>include\impl</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="toml++.props" />

347
toml.hpp
View File

@ -111,6 +111,7 @@
#if TOML_CLANG >= 10
#define TOML_DISABLE_SPAM_WARNINGS_CLANG_10 \
_Pragma("clang diagnostic ignored \"-Wzero-as-null-pointer-constant\"") \
_Pragma("clang diagnostic ignored \"-Wsuggest-destructor-override\"") \
static_assert(true)
#else
#define TOML_DISABLE_SPAM_WARNINGS_CLANG_10 static_assert(true)
@ -124,7 +125,6 @@
_Pragma("clang diagnostic ignored \"-Wchar-subscripts\"") \
_Pragma("clang diagnostic ignored \"-Wmissing-field-initializers\"") \
_Pragma("clang diagnostic ignored \"-Wpadded\"") \
_Pragma("clang diagnostic ignored \"-Wsuggest-destructor-override\"") \
static_assert(true)
#define TOML_POP_WARNINGS \
@ -7102,7 +7102,7 @@ TOML_NAMESPACE_END;
#endif
TOML_POP_WARNINGS;
//******** impl/unicode.h ********************************************************************************************
//******** impl/unicode_autogenerated.h ******************************************************************************
TOML_PUSH_WARNINGS;
#ifdef _MSC_VER
@ -7117,60 +7117,10 @@ TOML_PUSH_WARNINGS;
#pragma GCC optimize("O1") // codegen bugs
#endif
// the functions in this namespace block are automatically generated by a tool - they are not meant to be hand-edited
TOML_IMPL_NAMESPACE_START
{
// note: a number of these functions were machine-generated. you'll know them when you see them.
// they are tested separately in another project, I promise!
TOML_CONST_GETTER
constexpr bool is_string_delimiter(char32_t c) noexcept
{
return c == U'"' || c == U'\'';
}
TOML_CONST_GETTER
constexpr bool is_ascii_letter(char32_t c) noexcept
{
return (c >= U'a' && c <= U'z') || (c >= U'A' && c <= U'Z');
}
TOML_CONST_GETTER
constexpr bool is_binary_digit(char32_t c) noexcept
{
return c == U'0' || c == U'1';
}
TOML_CONST_GETTER
constexpr bool is_octal_digit(char32_t c) noexcept
{
return (c >= U'0' && c <= U'7');
}
TOML_CONST_GETTER
constexpr bool is_decimal_digit(char32_t c) noexcept
{
return (c >= U'0' && c <= U'9');
}
TOML_CONST_GETTER
constexpr bool is_hexadecimal_digit(char32_t c) noexcept
{
return U'0' <= c && c <= U'f' && (1ull << (static_cast<uint_least64_t>(c) - 0x30u)) & 0x7E0000007E03FFull;
}
template <typename T>
TOML_CONST_GETTER
constexpr uint_least32_t hex_to_dec(const T c) noexcept
{
if constexpr (std::is_same_v<remove_cvref<T>, uint_least32_t>)
return c >= 0x41u // >= 'A'
? 10u + (c | 0x20u) - 0x61u // - 'a'
: c - 0x30u // - '0'
;
else
return hex_to_dec(static_cast<uint_least32_t>(c));
}
TOML_CONST_GETTER
constexpr bool is_ascii_horizontal_whitespace(char32_t c) noexcept
{
@ -7180,6 +7130,8 @@ TOML_IMPL_NAMESPACE_START
TOML_CONST_GETTER
constexpr bool is_non_ascii_horizontal_whitespace(char32_t c) noexcept
{
// 20 code units from 8 ranges (spanning a search area of 65120)
if (c < U'\xA0' || c > U'\uFEFF')
return false;
@ -7195,7 +7147,7 @@ TOML_IMPL_NAMESPACE_START
return (U'\u2000' <= c && c <= U'\u200B') || (U'\u205F' <= c && c <= U'\u2060') || c == U'\u202F';
default: TOML_UNREACHABLE;
}
// 20 code units from 8 ranges (spanning a search area of 65120)
TOML_UNREACHABLE;
}
@ -7208,7 +7160,7 @@ TOML_IMPL_NAMESPACE_START
TOML_CONST_GETTER
constexpr bool is_ascii_vertical_whitespace(char32_t c) noexcept
{
return U'\n' <= c && c <= U'\r';
return c >= U'\n' && c <= U'\r';
}
TOML_CONST_GETTER
@ -7236,14 +7188,13 @@ TOML_IMPL_NAMESPACE_START
if (c == U'+')
return true;
#endif
// 64 code units from 5 ranges (spanning a search area of 78)
if (c < U'-' || c > U'z')
return false;
if ((1ull << (static_cast<uint_least64_t>(c) - 0x2Du)) & 0xFFF43FFFFFF01FF9ull)
return true;
return (((static_cast<uint_least64_t>(c) - 0x2Dull) / 0x40ull) != 0)
|| ((1ull << (static_cast<uint_least64_t>(c) - 0x2Du)) & 0xFFF43FFFFFF01FF9ull);
return (((static_cast<uint_least64_t>(c) - 0x2Dull) / 0x40ull) != 0ull)
|| ((1ull << (static_cast<uint_least64_t>(c) - 0x2Dull)) & 0xFFF43FFFFFF01FF9ull);
}
#if TOML_LANG_UNRELEASED // toml/issues/687 (unicode bare keys)
@ -7251,7 +7202,9 @@ TOML_IMPL_NAMESPACE_START
TOML_CONST_GETTER
constexpr bool is_non_ascii_letter(char32_t c) noexcept
{
if (U'\xAA' > c || c > U'\U0003134A')
// 131704 code units from 646 ranges (spanning a search area of 201377)
if (c < U'\xAA' || c > U'\U0003134A')
return false;
const auto child_index_0 = (static_cast<uint_least64_t>(c) - 0xAAull) / 0xC4Bull;
@ -7263,9 +7216,11 @@ TOML_IMPL_NAMESPACE_START
{
case 0x00: // [0] 00AA - 0CF4
{
// 1957 code units from 126 ranges (spanning a search area of 3145)
if (c > U'\u0CF2')
return false;
TOML_ASSUME(U'\xAA' <= c);
TOML_ASSUME(c >= U'\xAA');
constexpr uint_least64_t bitmask_table_1[] = {
0xFFFFDFFFFFC10801u, 0xFFFFFFFFFFFFDFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
@ -7284,11 +7239,12 @@ TOML_IMPL_NAMESPACE_START
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0xAAull) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0xAAull) % 0x40ull));
// 1957 code units from 126 ranges (spanning a search area of 3145)
}
case 0x01: // [1] 0CF5 - 193F
{
if (U'\u0D04' > c || c > U'\u191E')
// 2241 code units from 82 ranges (spanning a search area of 3099)
if (c < U'\u0D04' || c > U'\u191E')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
@ -7308,11 +7264,12 @@ TOML_IMPL_NAMESPACE_START
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0xD04ull) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0xD04ull) % 0x40ull));
// 2241 code units from 82 ranges (spanning a search area of 3099)
}
case 0x02: // [2] 1940 - 258A
{
if (U'\u1950' > c || c > U'\u2184')
// 1185 code units from 59 ranges (spanning a search area of 2101)
if (c < U'\u1950' || c > U'\u2184')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
@ -7328,11 +7285,12 @@ TOML_IMPL_NAMESPACE_START
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x1950ull) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0x1950ull) % 0x40ull));
// 1185 code units from 59 ranges (spanning a search area of 2101)
}
case 0x03: // [3] 258B - 31D5
{
if (U'\u2C00' > c || c > U'\u31BF')
// 773 code units from 28 ranges (spanning a search area of 1472)
if (c < U'\u2C00' || c > U'\u31BF')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
@ -7345,13 +7303,14 @@ TOML_IMPL_NAMESPACE_START
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x2C00ull) / 0x40ull]
& (0x1ull << (static_cast<uint_least64_t>(c) % 0x40ull));
// 773 code units from 28 ranges (spanning a search area of 1472)
}
case 0x04: return (U'\u31F0' <= c && c <= U'\u31FF') || U'\u3400' <= c;
case 0x06: return c <= U'\u4DBF' || U'\u4E00' <= c;
case 0x0D: // [13] A079 - ACC3
{
TOML_ASSUME(U'\uA079' <= c && c <= U'\uACC3');
// 2567 code units from 54 ranges (spanning a search area of 3147)
TOML_ASSUME(c >= U'\uA079' && c <= U'\uACC3');
constexpr uint_least64_t bitmask_table_1[] = {
0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu, 0xFFFFFFFFFFFFFFFFu,
@ -7370,13 +7329,14 @@ TOML_IMPL_NAMESPACE_START
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0xA079ull) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0xA079ull) % 0x40ull));
// 2567 code units from 54 ranges (spanning a search area of 3147)
}
case 0x11:
return c <= U'\uD7A3' || (U'\uD7B0' <= c && c <= U'\uD7C6') || (U'\uD7CB' <= c && c <= U'\uD7FB');
case 0x14: // [20] F686 - 102D0
{
if (U'\uF900' > c)
// 1710 code units from 34 ranges (spanning a search area of 2513)
if (c < U'\uF900')
return false;
TOML_ASSUME(c <= U'\U000102D0');
@ -7394,11 +7354,12 @@ TOML_IMPL_NAMESPACE_START
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0xF900ull) / 0x40ull]
& (0x1ull << (static_cast<uint_least64_t>(c) % 0x40ull));
// 1710 code units from 34 ranges (spanning a search area of 2513)
}
case 0x15: // [21] 102D1 - 10F1B
{
if (U'\U00010300' > c)
// 1747 code units from 59 ranges (spanning a search area of 3100)
if (c < U'\U00010300')
return false;
TOML_ASSUME(c <= U'\U00010F1B');
@ -7419,13 +7380,14 @@ TOML_IMPL_NAMESPACE_START
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x10300ull) / 0x40ull]
& (0x1ull << (static_cast<uint_least64_t>(c) % 0x40ull));
// 1747 code units from 59 ranges (spanning a search area of 3100)
}
case 0x16: // [22] 10F1C - 11B66
{
// 1174 code units from 71 ranges (spanning a search area of 3037)
if (c > U'\U00011AF8')
return false;
TOML_ASSUME(U'\U00010F1C' <= c);
TOML_ASSUME(c >= U'\U00010F1C');
constexpr uint_least64_t bitmask_table_1[] = {
0x000003FFFFF00801u, 0x0000003FFFF00000u, 0x000001FFFFF00000u, 0xFFFFFF8007FFFFF0u,
@ -7443,11 +7405,12 @@ TOML_IMPL_NAMESPACE_START
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x10F1Cull) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0x10F1Cull) % 0x40ull));
// 1174 code units from 71 ranges (spanning a search area of 3037)
}
case 0x17: // [23] 11B67 - 127B1
{
if (U'\U00011C00' > c || c > U'\U00012543')
// 1304 code units from 16 ranges (spanning a search area of 2372)
if (c < U'\U00011C00' || c > U'\U00012543')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
@ -7464,14 +7427,15 @@ TOML_IMPL_NAMESPACE_START
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x11C00ull) / 0x40ull]
& (0x1ull << (static_cast<uint_least64_t>(c) % 0x40ull));
// 1304 code units from 16 ranges (spanning a search area of 2372)
}
case 0x18: return (U'\U00012F90' <= c && c <= U'\U00012FF0') || U'\U00013000' <= c;
case 0x19: return c <= U'\U0001342E';
case 0x1A: return U'\U00014400' <= c && c <= U'\U00014646';
case 0x1A: return c >= U'\U00014400' && c <= U'\U00014646';
case 0x1D: // [29] 16529 - 17173
{
if (U'\U00016800' > c)
// 1329 code units from 15 ranges (spanning a search area of 2420)
if (c < U'\U00016800')
return false;
TOML_ASSUME(c <= U'\U00017173');
@ -7489,13 +7453,14 @@ TOML_IMPL_NAMESPACE_START
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x16800ull) / 0x40ull]
& (0x1ull << (static_cast<uint_least64_t>(c) % 0x40ull));
// 1329 code units from 15 ranges (spanning a search area of 2420)
}
case 0x1F: return c <= U'\U000187F7' || U'\U00018800' <= c;
case 0x20: return c <= U'\U00018CD5' || (U'\U00018D00' <= c && c <= U'\U00018D08');
case 0x23: // [35] 1AEEB - 1BB35
{
if (U'\U0001AFF0' > c || c > U'\U0001B2FB')
// 707 code units from 7 ranges (spanning a search area of 780)
if (c < U'\U0001AFF0' || c > U'\U0001B2FB')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
@ -7506,27 +7471,30 @@ TOML_IMPL_NAMESPACE_START
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x1AFF0ull) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0x1AFF0ull) % 0x40ull));
// 707 code units from 7 ranges (spanning a search area of 780)
}
case 0x24: // [36] 1BB36 - 1C780
{
if (U'\U0001BC00' > c || c > U'\U0001BC99')
// 139 code units from 4 ranges (spanning a search area of 154)
if (c < U'\U0001BC00' || c > U'\U0001BC99')
return false;
switch ((static_cast<uint_least64_t>(c) - 0x1BC00ull) / 0x40ull)
{
case 0x01:
return c <= U'\U0001BC7C'
&& (1ull << (static_cast<uint_least64_t>(c) - 0x1BC40u)) & 0x1FFF07FFFFFFFFFFull;
&& (1ull << (static_cast<uint_least64_t>(c) - 0x1BC40ull)) & 0x1FFF07FFFFFFFFFFull;
case 0x02: return (1u << (static_cast<uint_least32_t>(c) - 0x1BC80u)) & 0x3FF01FFu;
default: return true;
}
// 139 code units from 4 ranges (spanning a search area of 154)
TOML_UNREACHABLE;
}
case 0x26: // [38] 1D3CC - 1E016
{
if (U'\U0001D400' > c || c > U'\U0001DF1E')
// 967 code units from 31 ranges (spanning a search area of 2847)
if (c < U'\U0001D400' || c > U'\U0001DF1E')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
@ -7545,11 +7513,12 @@ TOML_IMPL_NAMESPACE_START
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x1D400ull) / 0x40ull]
& (0x1ull << (static_cast<uint_least64_t>(c) % 0x40ull));
// 967 code units from 31 ranges (spanning a search area of 2847)
}
case 0x27: // [39] 1E017 - 1EC61
{
if (U'\U0001E100' > c || c > U'\U0001E94B')
// 421 code units from 12 ranges (spanning a search area of 2124)
if (c < U'\U0001E100' || c > U'\U0001E94B')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
@ -7565,44 +7534,47 @@ TOML_IMPL_NAMESPACE_START
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x1E100ull) / 0x40ull]
& (0x1ull << (static_cast<uint_least64_t>(c) % 0x40ull));
// 421 code units from 12 ranges (spanning a search area of 2124)
}
case 0x28: // [40] 1EC62 - 1F8AC
{
if (U'\U0001EE00' > c || c > U'\U0001EEBB')
// 141 code units from 33 ranges (spanning a search area of 188)
if (c < U'\U0001EE00' || c > U'\U0001EEBB')
return false;
switch ((static_cast<uint_least64_t>(c) - 0x1EE00ull) / 0x40ull)
{
case 0x00:
return c <= U'\U0001EE3B'
&& (1ull << (static_cast<uint_least64_t>(c) - 0x1EE00u)) & 0xAF7FE96FFFFFFEFull;
&& (1ull << (static_cast<uint_least64_t>(c) - 0x1EE00ull)) & 0xAF7FE96FFFFFFEFull;
case 0x01:
return U'\U0001EE42' <= c && c <= U'\U0001EE7E'
&& (1ull << (static_cast<uint_least64_t>(c) - 0x1EE42u)) & 0x17BDFDE5AAA5BAA1ull;
case 0x02: return (1ull << (static_cast<uint_least64_t>(c) - 0x1EE80u)) & 0xFFFFBEE0FFFFBFFull;
return c >= U'\U0001EE42' && c <= U'\U0001EE7E'
&& (1ull << (static_cast<uint_least64_t>(c) - 0x1EE42ull)) & 0x17BDFDE5AAA5BAA1ull;
case 0x02: return (1ull << (static_cast<uint_least64_t>(c) - 0x1EE80ull)) & 0xFFFFBEE0FFFFBFFull;
default: TOML_UNREACHABLE;
}
// 141 code units from 33 ranges (spanning a search area of 188)
TOML_UNREACHABLE;
}
case 0x29: return U'\U00020000' <= c;
case 0x29: return c >= U'\U00020000';
case 0x37: return c <= U'\U0002A6DF' || U'\U0002A700' <= c;
case 0x38: return c <= U'\U0002B738' || (U'\U0002B740' <= c && c <= U'\U0002B81D') || U'\U0002B820' <= c;
case 0x3A: return c <= U'\U0002CEA1' || U'\U0002CEB0' <= c;
case 0x3C: return c <= U'\U0002EBE0';
case 0x3D: return U'\U0002F800' <= c && c <= U'\U0002FA1D';
case 0x3E: return U'\U00030000' <= c;
case 0x3D: return c >= U'\U0002F800' && c <= U'\U0002FA1D';
case 0x3E: return c >= U'\U00030000';
default: TOML_UNREACHABLE;
}
// 131704 code units from 646 ranges (spanning a search area of 201377)
TOML_UNREACHABLE;
}
TOML_CONST_GETTER
constexpr bool is_non_ascii_number(char32_t c) noexcept
{
if (U'\u0660' > c || c > U'\U0001FBF9')
// 886 code units from 73 ranges (spanning a search area of 128410)
if (c < U'\u0660' || c > U'\U0001FBF9')
return false;
const auto child_index_0 = (static_cast<uint_least64_t>(c) - 0x660ull) / 0x7D7ull;
@ -7612,9 +7584,11 @@ TOML_IMPL_NAMESPACE_START
{
case 0x00: // [0] 0660 - 0E36
{
// 130 code units from 13 ranges (spanning a search area of 1936)
if (c > U'\u0DEF')
return false;
TOML_ASSUME(U'\u0660' <= c);
TOML_ASSUME(c >= U'\u0660');
constexpr uint_least64_t bitmask_table_1[] = {
0x00000000000003FFu, 0x0000000000000000u, 0x0000000003FF0000u, 0x0000000000000000u,
@ -7628,11 +7602,12 @@ TOML_IMPL_NAMESPACE_START
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x660ull) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0x660ull) % 0x40ull));
// 130 code units from 13 ranges (spanning a search area of 1936)
}
case 0x01: // [1] 0E37 - 160D
{
if (U'\u0E50' > c || c > U'\u1099')
// 50 code units from 5 ranges (spanning a search area of 586)
if (c < U'\u0E50' || c > U'\u1099')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
@ -7642,11 +7617,12 @@ TOML_IMPL_NAMESPACE_START
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0xE50ull) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0xE50ull) % 0x40ull));
// 50 code units from 5 ranges (spanning a search area of 586)
}
case 0x02: // [2] 160E - 1DE4
{
if (U'\u16EE' > c || c > U'\u1C59')
// 103 code units from 11 ranges (spanning a search area of 1388)
if (c < U'\u16EE' || c > U'\u1C59')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
@ -7659,17 +7635,15 @@ TOML_IMPL_NAMESPACE_START
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x16EEull) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0x16EEull) % 0x40ull));
// 103 code units from 11 ranges (spanning a search area of 1388)
}
case 0x03:
return U'\u2160' <= c && c <= U'\u2188'
&& (1ull << (static_cast<uint_least64_t>(c) - 0x2160u)) & 0x1E7FFFFFFFFull;
case 0x03: return (U'\u2160' <= c && c <= U'\u2182') || (U'\u2185' <= c && c <= U'\u2188');
case 0x05:
return U'\u3007' <= c && c <= U'\u303A'
&& (1ull << (static_cast<uint_least64_t>(c) - 0x3007u)) & 0xE0007FC000001ull;
return (U'\u3021' <= c && c <= U'\u3029') || (U'\u3038' <= c && c <= U'\u303A') || c == U'\u3007';
case 0x14: // [20] A32C - AB02
{
if (U'\uA620' > c || c > U'\uAA59')
// 70 code units from 7 ranges (spanning a search area of 1082)
if (c < U'\uA620' || c > U'\uAA59')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
@ -7681,15 +7655,16 @@ TOML_IMPL_NAMESPACE_START
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0xA620ull) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0xA620ull) % 0x40ull));
// 70 code units from 7 ranges (spanning a search area of 1082)
}
case 0x15: return U'\uABF0' <= c && c <= U'\uABF9';
case 0x1F: return U'\uFF10' <= c && c <= U'\uFF19';
case 0x15: return c >= U'\uABF0' && c <= U'\uABF9';
case 0x1F: return c >= U'\uFF10' && c <= U'\uFF19';
case 0x20: // [32] 10140 - 10916
{
// 70 code units from 5 ranges (spanning a search area of 874)
if (c > U'\U000104A9')
return false;
TOML_ASSUME(U'\U00010140' <= c);
TOML_ASSUME(c >= U'\U00010140');
constexpr uint_least64_t bitmask_table_1[] = {
0x001FFFFFFFFFFFFFu, 0x0000000000000000u, 0x0000000000000000u, 0x0000000000000000u,
@ -7699,12 +7674,13 @@ TOML_IMPL_NAMESPACE_START
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x10140ull) / 0x40ull]
& (0x1ull << (static_cast<uint_least64_t>(c) % 0x40ull));
// 70 code units from 5 ranges (spanning a search area of 874)
}
case 0x21: return (U'\U00010D30' <= c && c <= U'\U00010D39') || (U'\U00011066' <= c && c <= U'\U0001106F');
case 0x22: // [34] 110EE - 118C4
{
if (U'\U000110F0' > c || c > U'\U00011739')
// 90 code units from 9 ranges (spanning a search area of 1610)
if (c < U'\U000110F0' || c > U'\U00011739')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
@ -7718,11 +7694,12 @@ TOML_IMPL_NAMESPACE_START
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x110F0ull) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0x110F0ull) % 0x40ull));
// 90 code units from 9 ranges (spanning a search area of 1610)
}
case 0x23: // [35] 118C5 - 1209B
{
if (U'\U000118E0' > c || c > U'\U00011DA9')
// 50 code units from 5 ranges (spanning a search area of 1226)
if (c < U'\U000118E0' || c > U'\U00011DA9')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
@ -7734,26 +7711,27 @@ TOML_IMPL_NAMESPACE_START
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x118E0ull) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0x118E0ull) % 0x40ull));
// 50 code units from 5 ranges (spanning a search area of 1226)
}
case 0x24: return U'\U00012400' <= c && c <= U'\U0001246E';
case 0x24: return c >= U'\U00012400' && c <= U'\U0001246E';
case 0x2D:
return (U'\U00016A60' <= c && c <= U'\U00016A69') || (U'\U00016AC0' <= c && c <= U'\U00016AC9')
|| (U'\U00016B50' <= c && c <= U'\U00016B59');
case 0x3B: return U'\U0001D7CE' <= c && c <= U'\U0001D7FF';
case 0x3B: return c >= U'\U0001D7CE' && c <= U'\U0001D7FF';
case 0x3C: return (U'\U0001E140' <= c && c <= U'\U0001E149') || (U'\U0001E2F0' <= c && c <= U'\U0001E2F9');
case 0x3D: return U'\U0001E950' <= c && c <= U'\U0001E959';
case 0x3F: return U'\U0001FBF0' <= c;
case 0x3D: return c >= U'\U0001E950' && c <= U'\U0001E959';
case 0x3F: return c >= U'\U0001FBF0';
default: TOML_UNREACHABLE;
}
// 886 code units from 73 ranges (spanning a search area of 128410)
TOML_UNREACHABLE;
}
TOML_CONST_GETTER
constexpr bool is_combining_mark(char32_t c) noexcept
{
if (U'\u0300' > c || c > U'\U000E01EF')
// 2395 code units from 302 ranges (spanning a search area of 917232)
if (c < U'\u0300' || c > U'\U000E01EF')
return false;
const auto child_index_0 = (static_cast<uint_least64_t>(c) - 0x300ull) / 0x37FCull;
@ -7763,9 +7741,11 @@ TOML_IMPL_NAMESPACE_START
{
case 0x00: // [0] 0300 - 3AFB
{
// 1141 code units from 158 ranges (spanning a search area of 11675)
if (c > U'\u309A')
return false;
TOML_ASSUME(U'\u0300' <= c);
TOML_ASSUME(c >= U'\u0300');
constexpr uint_least64_t bitmask_table_1[] = {
0xFFFFFFFFFFFFFFFFu, 0x0000FFFFFFFFFFFFu, 0x0000000000000000u, 0x0000000000000000u,
@ -7817,11 +7797,12 @@ TOML_IMPL_NAMESPACE_START
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x300ull) / 0x40ull]
& (0x1ull << (static_cast<uint_least64_t>(c) % 0x40ull));
// 1141 code units from 158 ranges (spanning a search area of 11675)
}
case 0x02: // [2] 72F8 - AAF3
{
if (U'\uA66F' > c || c > U'\uAAEF')
// 137 code units from 28 ranges (spanning a search area of 1153)
if (c < U'\uA66F' || c > U'\uAAEF')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
@ -7833,14 +7814,15 @@ TOML_IMPL_NAMESPACE_START
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0xA66Full) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0xA66Full) % 0x40ull));
// 137 code units from 28 ranges (spanning a search area of 1153)
}
case 0x03:
return (U'\uAAF5' <= c && c <= U'\uAAF6') || (U'\uABE3' <= c && c <= U'\uABEA')
|| (U'\uABEC' <= c && c <= U'\uABED');
case 0x04: // [4] E2F0 - 11AEB
{
if (U'\uFB1E' > c || c > U'\U00011A99')
// 410 code units from 67 ranges (spanning a search area of 8060)
if (c < U'\uFB1E' || c > U'\U00011A99')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
@ -7879,11 +7861,12 @@ TOML_IMPL_NAMESPACE_START
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0xFB1Eull) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0xFB1Eull) % 0x40ull));
// 410 code units from 67 ranges (spanning a search area of 8060)
}
case 0x05: // [5] 11AEC - 152E7
{
if (U'\U00011C2F' > c || c > U'\U00011EF6')
// 85 code units from 13 ranges (spanning a search area of 712)
if (c < U'\U00011C2F' || c > U'\U00011EF6')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
@ -7893,11 +7876,12 @@ TOML_IMPL_NAMESPACE_START
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x11C2Full) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0x11C2Full) % 0x40ull));
// 85 code units from 13 ranges (spanning a search area of 712)
}
case 0x06: // [6] 152E8 - 18AE3
{
if (U'\U00016AF0' > c || c > U'\U00016FF1')
// 75 code units from 7 ranges (spanning a search area of 1282)
if (c < U'\U00016AF0' || c > U'\U00016FF1')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
@ -7910,12 +7894,13 @@ TOML_IMPL_NAMESPACE_START
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x16AF0ull) / 0x40ull]
& (0x1ull << ((static_cast<uint_least64_t>(c) - 0x16AF0ull) % 0x40ull));
// 75 code units from 7 ranges (spanning a search area of 1282)
}
case 0x07: return U'\U0001BC9D' <= c && c <= U'\U0001BC9E';
case 0x07: return c >= U'\U0001BC9D' && c <= U'\U0001BC9E';
case 0x08: // [8] 1C2E0 - 1FADB
{
if (U'\U0001CF00' > c || c > U'\U0001E94A')
// 293 code units from 24 ranges (spanning a search area of 6731)
if (c < U'\U0001CF00' || c > U'\U0001E94A')
return false;
constexpr uint_least64_t bitmask_table_1[] = {
@ -7949,12 +7934,11 @@ TOML_IMPL_NAMESPACE_START
};
return bitmask_table_1[(static_cast<uint_least64_t>(c) - 0x1CF00ull) / 0x40ull]
& (0x1ull << (static_cast<uint_least64_t>(c) % 0x40ull));
// 293 code units from 24 ranges (spanning a search area of 6731)
}
case 0x3F: return U'\U000E0100' <= c;
case 0x3F: return c >= U'\U000E0100';
default: TOML_UNREACHABLE;
}
// 2395 code units from 302 ranges (spanning a search area of 917232)
TOML_UNREACHABLE;
}
@ -7965,6 +7949,79 @@ TOML_IMPL_NAMESPACE_START
}
#endif // TOML_LANG_UNRELEASED
}
TOML_IMPL_NAMESPACE_END;
#if TOML_GCC && TOML_GCC < 9
#pragma GCC pop_options
#endif
#ifdef _MSC_VER
#pragma pop_macro("min")
#pragma pop_macro("max")
#endif
TOML_POP_WARNINGS;
//******** impl/unicode.h ********************************************************************************************
TOML_PUSH_WARNINGS;
#ifdef _MSC_VER
#pragma push_macro("min")
#pragma push_macro("max")
#undef min
#undef max
#endif
TOML_IMPL_NAMESPACE_START
{
TOML_CONST_GETTER
constexpr bool is_string_delimiter(char32_t c) noexcept
{
return c == U'"' || c == U'\'';
}
TOML_CONST_GETTER
constexpr bool is_ascii_letter(char32_t c) noexcept
{
return (c >= U'a' && c <= U'z') || (c >= U'A' && c <= U'Z');
}
TOML_CONST_GETTER
constexpr bool is_binary_digit(char32_t c) noexcept
{
return c == U'0' || c == U'1';
}
TOML_CONST_GETTER
constexpr bool is_octal_digit(char32_t c) noexcept
{
return (c >= U'0' && c <= U'7');
}
TOML_CONST_GETTER
constexpr bool is_decimal_digit(char32_t c) noexcept
{
return (c >= U'0' && c <= U'9');
}
TOML_CONST_GETTER
constexpr bool is_hexadecimal_digit(char32_t c) noexcept
{
return U'0' <= c && c <= U'f' && (1ull << (static_cast<uint_least64_t>(c) - 0x30u)) & 0x7E0000007E03FFull;
}
template <typename T>
TOML_CONST_GETTER
constexpr uint_least32_t hex_to_dec(const T c) noexcept
{
if constexpr (std::is_same_v<remove_cvref<T>, uint_least32_t>)
return c >= 0x41u // >= 'A'
? 10u + (c | 0x20u) - 0x61u // - 'a'
: c - 0x30u // - '0'
;
else
return hex_to_dec(static_cast<uint_least32_t>(c));
}
TOML_CONST_GETTER
constexpr bool is_bare_key_character(char32_t c) noexcept
@ -14115,7 +14172,7 @@ TOML_IMPL_NAMESPACE_START
{
set_error_at(key_buffer.starts[i],
"cannot redefine existing "sv,
to_sv(p->type()),
to_sv(pit->second.type()),
" as dotted key-value pair"sv);
return_after_error({});
}