// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // WARNING, this entire header is generated by // utils/generate_width_estimation_table.py // DO NOT MODIFY! // UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE // // See Terms of Use <https://www.unicode.org/copyright.html> // for definitions of Unicode Inc.'s Data Files and Software. // // NOTICE TO USER: Carefully read the following legal agreement. // BY DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S // DATA FILES ("DATA FILES"), AND/OR SOFTWARE ("SOFTWARE"), // YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE // TERMS AND CONDITIONS OF THIS AGREEMENT. // IF YOU DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE // THE DATA FILES OR SOFTWARE. // // COPYRIGHT AND PERMISSION NOTICE // // Copyright (c) 1991-2022 Unicode, Inc. All rights reserved. // Distributed under the Terms of Use in https://www.unicode.org/copyright.html. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of the Unicode data files and any associated documentation // (the "Data Files") or Unicode software and any associated documentation // (the "Software") to deal in the Data Files or Software // without restriction, including without limitation the rights to use, // copy, modify, merge, publish, distribute, and/or sell copies of // the Data Files or Software, and to permit persons to whom the Data Files // or Software are furnished to do so, provided that either // (a) this copyright and permission notice appear with all copies // of the Data Files or Software, or // (b) this copyright and permission notice appear in associated // Documentation. // // THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF // ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE // WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT OF THIRD PARTY RIGHTS. // IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS // NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL // DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, // DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER // TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR // PERFORMANCE OF THE DATA FILES OR SOFTWARE. // // Except as contained in this notice, the name of a copyright holder // shall not be used in advertising or otherwise to promote the sale, // use or other dealings in these Data Files or Software without prior // written authorization of the copyright holder. #ifndef _LIBCPP___FORMAT_WIDTH_ESTIMATION_TABLE_H #define _LIBCPP___FORMAT_WIDTH_ESTIMATION_TABLE_H #include <__algorithm/ranges_upper_bound.h> #include <__config> #include <cstddef> #include <cstdint> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header #endif _LIBCPP_BEGIN_NAMESPACE_STD #if _LIBCPP_STD_VER >= 20 namespace __width_estimation_table { /// The entries of the characters with an estimated width of 2. /// /// Contains the entries for [format.string.std]/12 /// - Any code point with the East_Asian_Width="W" or East_Asian_Width="F" /// Derived Extracted Property as described by UAX #44 /// - U+4DC0 - U+4DFF (Yijing Hexagram Symbols) /// - U+1F300 - U+1F5FF (Miscellaneous Symbols and Pictographs) /// - U+1F900 - U+1F9FF (Supplemental Symbols and Pictographs) /// /// The data is generated from /// - https://www.unicode.org/Public/UCD/latest/ucd/EastAsianWidth.txt /// - The "overrides" in [format.string.std]/12 /// /// The format of EastAsianWidth.txt is two fields separated by a semicolon. /// Field 0: Unicode code point value or range of code point values /// Field 1: East_Asian_Width property, consisting of one of the following values: /// "A", "F", "H", "N", "Na", "W" /// - All code points, assigned or unassigned, that are not listed /// explicitly are given the value "N". /// - The unassigned code points in the following blocks default to "W": /// CJK Unified Ideographs Extension A: U+3400..U+4DBF /// CJK Unified Ideographs: U+4E00..U+9FFF /// CJK Compatibility Ideographs: U+F900..U+FAFF /// - All undesignated code points in Planes 2 and 3, whether inside or /// outside of allocated blocks, default to "W": /// Plane 2: U+20000..U+2FFFD /// Plane 3: U+30000..U+3FFFD /// /// The table is similar to the table /// __extended_grapheme_custer_property_boundary::__entries /// which explains the details of these classes. The only difference is this /// table lacks a property, thus having more bits available for the size. /// /// The maximum code point that has an estimated width of 2 is U+3FFFD. This /// value can be encoded in 18 bits. Thus the upper 3 bits of the code point /// are always 0. These 3 bits are used to enlarge the offset range. This /// optimization reduces the table in Unicode 15 from 184 to 104 entries, /// saving 320 bytes. /// /// The data has 2 values: /// - bits [0, 13] The size of the range, allowing 16384 elements. /// - bits [14, 31] The lower bound code point of the range. The upper bound of /// the range is lower bound + size. _LIBCPP_HIDE_FROM_ABI inline constexpr uint32_t __entries[107] = …; /// The upper bound entry of EastAsianWidth.txt. /// /// Values greater than this value may have more than 18 significant bits. /// They always have a width of 1. This property makes it possible to store /// the table in its compact form. inline constexpr uint32_t __table_upper_bound = …; /// Returns the estimated width of a Unicode code point. /// /// \\pre The code point is a valid Unicode code point. [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr int __estimated_width(const char32_t __code_point) noexcept { … } } // namespace __width_estimation_table #endif // _LIBCPP_STD_VER >= 20 _LIBCPP_END_NAMESPACE_STD #endif // _LIBCPP___FORMAT_WIDTH_ESTIMATION_TABLE_H