xref: /llvm-project/libcxx/include/__format/width_estimation_table.h (revision e99c4906e44ae3f921fa05356909d006cda8d954)
168c3d66aSMark de Wever // -*- C++ -*-
268c3d66aSMark de Wever //===----------------------------------------------------------------------===//
368c3d66aSMark de Wever //
468c3d66aSMark de Wever // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
568c3d66aSMark de Wever // See https://llvm.org/LICENSE.txt for license information.
668c3d66aSMark de Wever // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
768c3d66aSMark de Wever //
868c3d66aSMark de Wever //===----------------------------------------------------------------------===//
968c3d66aSMark de Wever 
1068c3d66aSMark de Wever // WARNING, this entire header is generated by
1168c3d66aSMark de Wever // utils/generate_width_estimation_table.py
1268c3d66aSMark de Wever // DO NOT MODIFY!
1368c3d66aSMark de Wever 
1468c3d66aSMark de Wever // UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE
1568c3d66aSMark de Wever //
1668c3d66aSMark de Wever // See Terms of Use <https://www.unicode.org/copyright.html>
1768c3d66aSMark de Wever // for definitions of Unicode Inc.'s Data Files and Software.
1868c3d66aSMark de Wever //
1968c3d66aSMark de Wever // NOTICE TO USER: Carefully read the following legal agreement.
2068c3d66aSMark de Wever // BY DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S
2168c3d66aSMark de Wever // DATA FILES ("DATA FILES"), AND/OR SOFTWARE ("SOFTWARE"),
2268c3d66aSMark de Wever // YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE
2368c3d66aSMark de Wever // TERMS AND CONDITIONS OF THIS AGREEMENT.
2468c3d66aSMark de Wever // IF YOU DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE
2568c3d66aSMark de Wever // THE DATA FILES OR SOFTWARE.
2668c3d66aSMark de Wever //
2768c3d66aSMark de Wever // COPYRIGHT AND PERMISSION NOTICE
2868c3d66aSMark de Wever //
2968c3d66aSMark de Wever // Copyright (c) 1991-2022 Unicode, Inc. All rights reserved.
3068c3d66aSMark de Wever // Distributed under the Terms of Use in https://www.unicode.org/copyright.html.
3168c3d66aSMark de Wever //
3268c3d66aSMark de Wever // Permission is hereby granted, free of charge, to any person obtaining
3368c3d66aSMark de Wever // a copy of the Unicode data files and any associated documentation
3468c3d66aSMark de Wever // (the "Data Files") or Unicode software and any associated documentation
3568c3d66aSMark de Wever // (the "Software") to deal in the Data Files or Software
3668c3d66aSMark de Wever // without restriction, including without limitation the rights to use,
3768c3d66aSMark de Wever // copy, modify, merge, publish, distribute, and/or sell copies of
3868c3d66aSMark de Wever // the Data Files or Software, and to permit persons to whom the Data Files
3968c3d66aSMark de Wever // or Software are furnished to do so, provided that either
4068c3d66aSMark de Wever // (a) this copyright and permission notice appear with all copies
4168c3d66aSMark de Wever // of the Data Files or Software, or
4268c3d66aSMark de Wever // (b) this copyright and permission notice appear in associated
4368c3d66aSMark de Wever // Documentation.
4468c3d66aSMark de Wever //
4568c3d66aSMark de Wever // THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF
4668c3d66aSMark de Wever // ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
4768c3d66aSMark de Wever // WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
4868c3d66aSMark de Wever // NONINFRINGEMENT OF THIRD PARTY RIGHTS.
4968c3d66aSMark de Wever // IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS
5068c3d66aSMark de Wever // NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
5168c3d66aSMark de Wever // DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
5268c3d66aSMark de Wever // DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
5368c3d66aSMark de Wever // TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
5468c3d66aSMark de Wever // PERFORMANCE OF THE DATA FILES OR SOFTWARE.
5568c3d66aSMark de Wever //
5668c3d66aSMark de Wever // Except as contained in this notice, the name of a copyright holder
5768c3d66aSMark de Wever // shall not be used in advertising or otherwise to promote the sale,
5868c3d66aSMark de Wever // use or other dealings in these Data Files or Software without prior
5968c3d66aSMark de Wever // written authorization of the copyright holder.
6068c3d66aSMark de Wever 
6168c3d66aSMark de Wever #ifndef _LIBCPP___FORMAT_WIDTH_ESTIMATION_TABLE_H
6268c3d66aSMark de Wever #define _LIBCPP___FORMAT_WIDTH_ESTIMATION_TABLE_H
6368c3d66aSMark de Wever 
6468c3d66aSMark de Wever #include <__algorithm/ranges_upper_bound.h>
6568c3d66aSMark de Wever #include <__config>
66*e99c4906SNikolas Klauser #include <__cstddef/ptrdiff_t.h>
6768c3d66aSMark de Wever #include <cstdint>
6868c3d66aSMark de Wever 
6968c3d66aSMark de Wever #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
7068c3d66aSMark de Wever #  pragma GCC system_header
7168c3d66aSMark de Wever #endif
7268c3d66aSMark de Wever 
7368c3d66aSMark de Wever _LIBCPP_BEGIN_NAMESPACE_STD
7468c3d66aSMark de Wever 
7568c3d66aSMark de Wever #if _LIBCPP_STD_VER >= 20
7668c3d66aSMark de Wever 
7768c3d66aSMark de Wever namespace __width_estimation_table {
7868c3d66aSMark de Wever 
7968c3d66aSMark de Wever /// The entries of the characters with an estimated width of 2.
8068c3d66aSMark de Wever ///
8168c3d66aSMark de Wever /// Contains the entries for [format.string.std]/12
8268c3d66aSMark de Wever ///  -  Any code point with the East_Asian_Width="W" or East_Asian_Width="F"
8368c3d66aSMark de Wever ///     Derived Extracted Property as described by UAX #44
8468c3d66aSMark de Wever /// - U+4DC0 - U+4DFF (Yijing Hexagram Symbols)
8568c3d66aSMark de Wever /// - U+1F300 - U+1F5FF (Miscellaneous Symbols and Pictographs)
8668c3d66aSMark de Wever /// - U+1F900 - U+1F9FF (Supplemental Symbols and Pictographs)
8768c3d66aSMark de Wever ///
8868c3d66aSMark de Wever /// The data is generated from
8968c3d66aSMark de Wever /// - https://www.unicode.org/Public/UCD/latest/ucd/EastAsianWidth.txt
9068c3d66aSMark de Wever /// - The "overrides" in [format.string.std]/12
9168c3d66aSMark de Wever ///
9268c3d66aSMark de Wever /// The format of EastAsianWidth.txt is two fields separated by a semicolon.
9368c3d66aSMark de Wever /// Field 0: Unicode code point value or range of code point values
9468c3d66aSMark de Wever /// Field 1: East_Asian_Width property, consisting of one of the following values:
9568c3d66aSMark de Wever ///         "A", "F", "H", "N", "Na", "W"
9668c3d66aSMark de Wever ///  - All code points, assigned or unassigned, that are not listed
9768c3d66aSMark de Wever ///      explicitly are given the value "N".
9868c3d66aSMark de Wever ///  - The unassigned code points in the following blocks default to "W":
9968c3d66aSMark de Wever ///         CJK Unified Ideographs Extension A: U+3400..U+4DBF
10068c3d66aSMark de Wever ///         CJK Unified Ideographs:             U+4E00..U+9FFF
10168c3d66aSMark de Wever ///         CJK Compatibility Ideographs:       U+F900..U+FAFF
10268c3d66aSMark de Wever ///  - All undesignated code points in Planes 2 and 3, whether inside or
10368c3d66aSMark de Wever ///      outside of allocated blocks, default to "W":
10468c3d66aSMark de Wever ///         Plane 2:                            U+20000..U+2FFFD
10568c3d66aSMark de Wever ///         Plane 3:                            U+30000..U+3FFFD
10668c3d66aSMark de Wever ///
10768c3d66aSMark de Wever /// The table is similar to the table
10868c3d66aSMark de Wever ///  __extended_grapheme_custer_property_boundary::__entries
10968c3d66aSMark de Wever /// which explains the details of these classes. The only difference is this
11068c3d66aSMark de Wever /// table lacks a property, thus having more bits available for the size.
11168c3d66aSMark de Wever ///
11268c3d66aSMark de Wever /// The maximum code point that has an estimated width of 2 is U+3FFFD. This
11368c3d66aSMark de Wever /// value can be encoded in 18 bits. Thus the upper 3 bits of the code point
11468c3d66aSMark de Wever /// are always 0. These 3 bits are used to enlarge the offset range. This
11568c3d66aSMark de Wever /// optimization reduces the table in Unicode 15 from 184 to 104 entries,
11668c3d66aSMark de Wever /// saving 320 bytes.
11768c3d66aSMark de Wever ///
11868c3d66aSMark de Wever /// The data has 2 values:
11968c3d66aSMark de Wever /// - bits [0, 13] The size of the range, allowing 16384 elements.
12068c3d66aSMark de Wever /// - bits [14, 31] The lower bound code point of the range. The upper bound of
12168c3d66aSMark de Wever ///   the range is lower bound + size.
12259e66c51SMark de Wever _LIBCPP_HIDE_FROM_ABI inline constexpr uint32_t __entries[107] = {
12368c3d66aSMark de Wever     0x0440005f /* 00001100 - 0000115f [   96] */, //
12468c3d66aSMark de Wever     0x08c68001 /* 0000231a - 0000231b [    2] */, //
12568c3d66aSMark de Wever     0x08ca4001 /* 00002329 - 0000232a [    2] */, //
12668c3d66aSMark de Wever     0x08fa4003 /* 000023e9 - 000023ec [    4] */, //
12768c3d66aSMark de Wever     0x08fc0000 /* 000023f0 - 000023f0 [    1] */, //
12868c3d66aSMark de Wever     0x08fcc000 /* 000023f3 - 000023f3 [    1] */, //
12968c3d66aSMark de Wever     0x097f4001 /* 000025fd - 000025fe [    2] */, //
13068c3d66aSMark de Wever     0x09850001 /* 00002614 - 00002615 [    2] */, //
13168c3d66aSMark de Wever     0x0992000b /* 00002648 - 00002653 [   12] */, //
13268c3d66aSMark de Wever     0x099fc000 /* 0000267f - 0000267f [    1] */, //
13368c3d66aSMark de Wever     0x09a4c000 /* 00002693 - 00002693 [    1] */, //
13468c3d66aSMark de Wever     0x09a84000 /* 000026a1 - 000026a1 [    1] */, //
13568c3d66aSMark de Wever     0x09aa8001 /* 000026aa - 000026ab [    2] */, //
13668c3d66aSMark de Wever     0x09af4001 /* 000026bd - 000026be [    2] */, //
13768c3d66aSMark de Wever     0x09b10001 /* 000026c4 - 000026c5 [    2] */, //
13868c3d66aSMark de Wever     0x09b38000 /* 000026ce - 000026ce [    1] */, //
13968c3d66aSMark de Wever     0x09b50000 /* 000026d4 - 000026d4 [    1] */, //
14068c3d66aSMark de Wever     0x09ba8000 /* 000026ea - 000026ea [    1] */, //
14168c3d66aSMark de Wever     0x09bc8001 /* 000026f2 - 000026f3 [    2] */, //
14268c3d66aSMark de Wever     0x09bd4000 /* 000026f5 - 000026f5 [    1] */, //
14368c3d66aSMark de Wever     0x09be8000 /* 000026fa - 000026fa [    1] */, //
14468c3d66aSMark de Wever     0x09bf4000 /* 000026fd - 000026fd [    1] */, //
14568c3d66aSMark de Wever     0x09c14000 /* 00002705 - 00002705 [    1] */, //
14668c3d66aSMark de Wever     0x09c28001 /* 0000270a - 0000270b [    2] */, //
14768c3d66aSMark de Wever     0x09ca0000 /* 00002728 - 00002728 [    1] */, //
14868c3d66aSMark de Wever     0x09d30000 /* 0000274c - 0000274c [    1] */, //
14968c3d66aSMark de Wever     0x09d38000 /* 0000274e - 0000274e [    1] */, //
15068c3d66aSMark de Wever     0x09d4c002 /* 00002753 - 00002755 [    3] */, //
15168c3d66aSMark de Wever     0x09d5c000 /* 00002757 - 00002757 [    1] */, //
15268c3d66aSMark de Wever     0x09e54002 /* 00002795 - 00002797 [    3] */, //
15368c3d66aSMark de Wever     0x09ec0000 /* 000027b0 - 000027b0 [    1] */, //
15468c3d66aSMark de Wever     0x09efc000 /* 000027bf - 000027bf [    1] */, //
15568c3d66aSMark de Wever     0x0ac6c001 /* 00002b1b - 00002b1c [    2] */, //
15668c3d66aSMark de Wever     0x0ad40000 /* 00002b50 - 00002b50 [    1] */, //
15768c3d66aSMark de Wever     0x0ad54000 /* 00002b55 - 00002b55 [    1] */, //
15868c3d66aSMark de Wever     0x0ba00019 /* 00002e80 - 00002e99 [   26] */, //
15968c3d66aSMark de Wever     0x0ba6c058 /* 00002e9b - 00002ef3 [   89] */, //
16068c3d66aSMark de Wever     0x0bc000d5 /* 00002f00 - 00002fd5 [  214] */, //
16159e66c51SMark de Wever     0x0bfc004e /* 00002ff0 - 0000303e [   79] */, //
16268c3d66aSMark de Wever     0x0c104055 /* 00003041 - 00003096 [   86] */, //
16368c3d66aSMark de Wever     0x0c264066 /* 00003099 - 000030ff [  103] */, //
16468c3d66aSMark de Wever     0x0c41402a /* 00003105 - 0000312f [   43] */, //
16568c3d66aSMark de Wever     0x0c4c405d /* 00003131 - 0000318e [   94] */, //
16668c3d66aSMark de Wever     0x0c640053 /* 00003190 - 000031e3 [   84] */, //
16759e66c51SMark de Wever     0x0c7bc02f /* 000031ef - 0000321e [   48] */, //
16868c3d66aSMark de Wever     0x0c880027 /* 00003220 - 00003247 [   40] */, //
16968c3d66aSMark de Wever     0x0c943fff /* 00003250 - 0000724f [16384] */, //
17068c3d66aSMark de Wever     0x1c94323c /* 00007250 - 0000a48c [12861] */, //
17168c3d66aSMark de Wever     0x29240036 /* 0000a490 - 0000a4c6 [   55] */, //
17268c3d66aSMark de Wever     0x2a58001c /* 0000a960 - 0000a97c [   29] */, //
17368c3d66aSMark de Wever     0x2b002ba3 /* 0000ac00 - 0000d7a3 [11172] */, //
17468c3d66aSMark de Wever     0x3e4001ff /* 0000f900 - 0000faff [  512] */, //
17568c3d66aSMark de Wever     0x3f840009 /* 0000fe10 - 0000fe19 [   10] */, //
17668c3d66aSMark de Wever     0x3f8c0022 /* 0000fe30 - 0000fe52 [   35] */, //
17768c3d66aSMark de Wever     0x3f950012 /* 0000fe54 - 0000fe66 [   19] */, //
17868c3d66aSMark de Wever     0x3f9a0003 /* 0000fe68 - 0000fe6b [    4] */, //
17968c3d66aSMark de Wever     0x3fc0405f /* 0000ff01 - 0000ff60 [   96] */, //
18068c3d66aSMark de Wever     0x3ff80006 /* 0000ffe0 - 0000ffe6 [    7] */, //
18168c3d66aSMark de Wever     0x5bf80004 /* 00016fe0 - 00016fe4 [    5] */, //
18268c3d66aSMark de Wever     0x5bfc0001 /* 00016ff0 - 00016ff1 [    2] */, //
18368c3d66aSMark de Wever     0x5c0017f7 /* 00017000 - 000187f7 [ 6136] */, //
18468c3d66aSMark de Wever     0x620004d5 /* 00018800 - 00018cd5 [ 1238] */, //
18568c3d66aSMark de Wever     0x63400008 /* 00018d00 - 00018d08 [    9] */, //
18668c3d66aSMark de Wever     0x6bfc0003 /* 0001aff0 - 0001aff3 [    4] */, //
18768c3d66aSMark de Wever     0x6bfd4006 /* 0001aff5 - 0001affb [    7] */, //
18868c3d66aSMark de Wever     0x6bff4001 /* 0001affd - 0001affe [    2] */, //
18968c3d66aSMark de Wever     0x6c000122 /* 0001b000 - 0001b122 [  291] */, //
19068c3d66aSMark de Wever     0x6c4c8000 /* 0001b132 - 0001b132 [    1] */, //
19168c3d66aSMark de Wever     0x6c540002 /* 0001b150 - 0001b152 [    3] */, //
19268c3d66aSMark de Wever     0x6c554000 /* 0001b155 - 0001b155 [    1] */, //
19368c3d66aSMark de Wever     0x6c590003 /* 0001b164 - 0001b167 [    4] */, //
19468c3d66aSMark de Wever     0x6c5c018b /* 0001b170 - 0001b2fb [  396] */, //
19568c3d66aSMark de Wever     0x7c010000 /* 0001f004 - 0001f004 [    1] */, //
19668c3d66aSMark de Wever     0x7c33c000 /* 0001f0cf - 0001f0cf [    1] */, //
19768c3d66aSMark de Wever     0x7c638000 /* 0001f18e - 0001f18e [    1] */, //
19868c3d66aSMark de Wever     0x7c644009 /* 0001f191 - 0001f19a [   10] */, //
19968c3d66aSMark de Wever     0x7c800002 /* 0001f200 - 0001f202 [    3] */, //
20068c3d66aSMark de Wever     0x7c84002b /* 0001f210 - 0001f23b [   44] */, //
20168c3d66aSMark de Wever     0x7c900008 /* 0001f240 - 0001f248 [    9] */, //
20268c3d66aSMark de Wever     0x7c940001 /* 0001f250 - 0001f251 [    2] */, //
20368c3d66aSMark de Wever     0x7c980005 /* 0001f260 - 0001f265 [    6] */, //
20468c3d66aSMark de Wever     0x7cc0034f /* 0001f300 - 0001f64f [  848] */, //
20568c3d66aSMark de Wever     0x7da00045 /* 0001f680 - 0001f6c5 [   70] */, //
20668c3d66aSMark de Wever     0x7db30000 /* 0001f6cc - 0001f6cc [    1] */, //
20768c3d66aSMark de Wever     0x7db40002 /* 0001f6d0 - 0001f6d2 [    3] */, //
20868c3d66aSMark de Wever     0x7db54002 /* 0001f6d5 - 0001f6d7 [    3] */, //
20968c3d66aSMark de Wever     0x7db70003 /* 0001f6dc - 0001f6df [    4] */, //
21068c3d66aSMark de Wever     0x7dbac001 /* 0001f6eb - 0001f6ec [    2] */, //
21168c3d66aSMark de Wever     0x7dbd0008 /* 0001f6f4 - 0001f6fc [    9] */, //
21268c3d66aSMark de Wever     0x7df8000b /* 0001f7e0 - 0001f7eb [   12] */, //
21368c3d66aSMark de Wever     0x7dfc0000 /* 0001f7f0 - 0001f7f0 [    1] */, //
21468c3d66aSMark de Wever     0x7e4000ff /* 0001f900 - 0001f9ff [  256] */, //
21568c3d66aSMark de Wever     0x7e9c000c /* 0001fa70 - 0001fa7c [   13] */, //
21668c3d66aSMark de Wever     0x7ea00008 /* 0001fa80 - 0001fa88 [    9] */, //
21768c3d66aSMark de Wever     0x7ea4002d /* 0001fa90 - 0001fabd [   46] */, //
21868c3d66aSMark de Wever     0x7eafc006 /* 0001fabf - 0001fac5 [    7] */, //
21968c3d66aSMark de Wever     0x7eb3800d /* 0001face - 0001fadb [   14] */, //
22068c3d66aSMark de Wever     0x7eb80008 /* 0001fae0 - 0001fae8 [    9] */, //
22168c3d66aSMark de Wever     0x7ebc0008 /* 0001faf0 - 0001faf8 [    9] */, //
22268c3d66aSMark de Wever     0x80003fff /* 00020000 - 00023fff [16384] */, //
22368c3d66aSMark de Wever     0x90003fff /* 00024000 - 00027fff [16384] */, //
22468c3d66aSMark de Wever     0xa0003fff /* 00028000 - 0002bfff [16384] */, //
22568c3d66aSMark de Wever     0xb0003ffd /* 0002c000 - 0002fffd [16382] */, //
22668c3d66aSMark de Wever     0xc0003fff /* 00030000 - 00033fff [16384] */, //
22768c3d66aSMark de Wever     0xd0003fff /* 00034000 - 00037fff [16384] */, //
22868c3d66aSMark de Wever     0xe0003fff /* 00038000 - 0003bfff [16384] */, //
22968c3d66aSMark de Wever     0xf0003ffd /* 0003c000 - 0003fffd [16382] */};
23068c3d66aSMark de Wever 
23168c3d66aSMark de Wever /// The upper bound entry of EastAsianWidth.txt.
23268c3d66aSMark de Wever ///
23368c3d66aSMark de Wever /// Values greater than this value may have more than 18 significant bits.
23468c3d66aSMark de Wever /// They always have a width of 1. This property makes it possible to store
23568c3d66aSMark de Wever /// the table in its compact form.
23668c3d66aSMark de Wever inline constexpr uint32_t __table_upper_bound = 0x0003fffd;
23768c3d66aSMark de Wever 
23868c3d66aSMark de Wever /// Returns the estimated width of a Unicode code point.
23968c3d66aSMark de Wever ///
24088184e50SEisuke Kawashima /// \\pre The code point is a valid Unicode code point.
24168c3d66aSMark de Wever [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr int __estimated_width(const char32_t __code_point) noexcept {
24268c3d66aSMark de Wever   // Since __table_upper_bound contains the unshifted range do the
24368c3d66aSMark de Wever   // comparison without shifting.
24468c3d66aSMark de Wever   if (__code_point > __table_upper_bound) [[unlikely]]
24568c3d66aSMark de Wever     return 1;
24668c3d66aSMark de Wever 
24768c3d66aSMark de Wever   // When the code-point is less than the first element in the table
24868c3d66aSMark de Wever   // the lookup is quite expensive. Since quite some scripts are in
24968c3d66aSMark de Wever   // that range, it makes sense to validate that first.
25068c3d66aSMark de Wever   // The std_format_spec_string_unicode benchmark gives a measurable
25168c3d66aSMark de Wever   // improvement.
25268c3d66aSMark de Wever   if (__code_point < (__entries[0] >> 14))
25368c3d66aSMark de Wever     return 1;
25468c3d66aSMark de Wever 
25568c3d66aSMark de Wever   ptrdiff_t __i = std::ranges::upper_bound(__entries, (__code_point << 14) | 0x3fffu) - __entries;
25668c3d66aSMark de Wever   if (__i == 0)
25768c3d66aSMark de Wever     return 1;
25868c3d66aSMark de Wever 
25968c3d66aSMark de Wever   --__i;
26068c3d66aSMark de Wever   uint32_t __upper_bound = (__entries[__i] >> 14) + (__entries[__i] & 0x3fffu);
26168c3d66aSMark de Wever   return 1 + (__code_point <= __upper_bound);
26268c3d66aSMark de Wever }
26368c3d66aSMark de Wever 
26468c3d66aSMark de Wever } // namespace __width_estimation_table
26568c3d66aSMark de Wever 
26668c3d66aSMark de Wever #endif // _LIBCPP_STD_VER >= 20
26768c3d66aSMark de Wever 
26868c3d66aSMark de Wever _LIBCPP_END_NAMESPACE_STD
26968c3d66aSMark de Wever 
27068c3d66aSMark de Wever #endif // _LIBCPP___FORMAT_WIDTH_ESTIMATION_TABLE_H
271