export dem symbols

master
Daniel Kolesa 2018-01-11 23:38:03 +01:00
parent a93ae710d0
commit dab034d9e0
3 changed files with 100 additions and 86 deletions

View File

@ -279,7 +279,8 @@ struct parse_state {
code_vec const &singles code_vec const &singles
) { ) {
format( format(
writer, "%s %s%s(char32_t c) noexcept {\n", ret_type, prefix, fname writer, "OSTD_EXPORT %s %s%s(char32_t c) noexcept {\n",
ret_type, prefix, fname
); );
format(writer, " return utf::uctype_func<\n"); format(writer, " return utf::uctype_func<\n");
auto it1 = { &ranges, &laces1, &laces2, &singles }; auto it1 = { &ranges, &laces1, &laces2, &singles };

View File

@ -61,6 +61,7 @@
#include <vector> #include <vector>
#include <stdexcept> #include <stdexcept>
#include <ostd/platform.hh>
#include <ostd/range.hh> #include <ostd/range.hh>
#include <ostd/algorithm.hh> #include <ostd/algorithm.hh>
@ -74,10 +75,10 @@ static_assert(
); );
namespace detail { namespace detail {
std::size_t tstrlen(char const *p) noexcept; OSTD_EXPORT std::size_t tstrlen(char const *p) noexcept;
std::size_t tstrlen(char16_t const *p) noexcept; OSTD_EXPORT std::size_t tstrlen(char16_t const *p) noexcept;
std::size_t tstrlen(char32_t const *p) noexcept; OSTD_EXPORT std::size_t tstrlen(char32_t const *p) noexcept;
std::size_t tstrlen(wchar_t const *p) noexcept; OSTD_EXPORT std::size_t tstrlen(wchar_t const *p) noexcept;
} }
/** @addtogroup Strings /** @addtogroup Strings
@ -800,14 +801,14 @@ namespace utf {
* The string is advanced past the Unicode character in the front. * The string is advanced past the Unicode character in the front.
* If the decoding fails, `false` is returned, otherwise it's `true`. * If the decoding fails, `false` is returned, otherwise it's `true`.
*/ */
bool decode(string_range &r, char32_t &ret) noexcept; OSTD_EXPORT bool decode(string_range &r, char32_t &ret) noexcept;
/* @brief Get the Unicode code point for a UTF-16 sequence. /* @brief Get the Unicode code point for a UTF-16 sequence.
* *
* The string is advanced past the Unicode character in the front. * The string is advanced past the Unicode character in the front.
* If the decoding fails, `false` is returned, otherwise it's `true`. * If the decoding fails, `false` is returned, otherwise it's `true`.
*/ */
bool decode(u16string_range &r, char32_t &ret) noexcept; OSTD_EXPORT bool decode(u16string_range &r, char32_t &ret) noexcept;
/* @brief Get the Unicode code point from a UTF-32 string. /* @brief Get the Unicode code point from a UTF-32 string.
* *
@ -815,7 +816,7 @@ namespace utf {
* returns `false` for the front character, in which case the string * returns `false` for the front character, in which case the string
* will not be advanced. * will not be advanced.
*/ */
bool decode(u32string_range &r, char32_t &ret) noexcept; OSTD_EXPORT bool decode(u32string_range &r, char32_t &ret) noexcept;
/* @brief Get the Unicode code point for a wide Unicode char/sequence. /* @brief Get the Unicode code point for a wide Unicode char/sequence.
* *
@ -825,13 +826,13 @@ namespace utf {
* priority (on systems where two or more of the types are the same * priority (on systems where two or more of the types are the same
* size). * size).
*/ */
bool decode(wstring_range &r, char32_t &ret) noexcept; OSTD_EXPORT bool decode(wstring_range &r, char32_t &ret) noexcept;
namespace detail { namespace detail {
std::size_t encode( OSTD_EXPORT std::size_t encode(
char (&ret)[4], char32_t ch char (&ret)[4], char32_t ch
) noexcept; ) noexcept;
std::size_t encode( OSTD_EXPORT std::size_t encode(
char16_t (&ret)[2], char32_t ch char16_t (&ret)[2], char32_t ch
) noexcept; ) noexcept;
} }
@ -959,7 +960,8 @@ namespace utf {
* If you're sure the string is valid or you don't need to handle the * If you're sure the string is valid or you don't need to handle the
* error, you can use the more convenient overload below. * error, you can use the more convenient overload below.
*/ */
std::size_t length(string_range r, string_range &cont) noexcept; OSTD_EXPORT std::size_t length(string_range r, string_range &cont)
noexcept;
/** @brief Get the number of Unicode code points in a string. /** @brief Get the number of Unicode code points in a string.
* *
@ -972,7 +974,8 @@ namespace utf {
* If you're sure the string is valid or you don't need to handle the * If you're sure the string is valid or you don't need to handle the
* error, you can use the more convenient overload below. * error, you can use the more convenient overload below.
*/ */
std::size_t length(u16string_range r, u16string_range &cont) noexcept; OSTD_EXPORT std::size_t length(u16string_range r, u16string_range &cont)
noexcept;
/** @brief Get the number of Unicode code points in a string. /** @brief Get the number of Unicode code points in a string.
* *
@ -985,7 +988,8 @@ namespace utf {
* If you're sure the string is valid or you don't need to handle the * If you're sure the string is valid or you don't need to handle the
* error, you can use the more convenient overload below. * error, you can use the more convenient overload below.
*/ */
std::size_t length(u32string_range r, u32string_range &cont) noexcept; OSTD_EXPORT std::size_t length(u32string_range r, u32string_range &cont)
noexcept;
/** @brief Get the number of Unicode code points in a string. /** @brief Get the number of Unicode code points in a string.
* *
@ -1001,7 +1005,8 @@ namespace utf {
* The behavior of this function is platform dependent as wide * The behavior of this function is platform dependent as wide
* characters represent different things on different systems. * characters represent different things on different systems.
*/ */
std::size_t length(wstring_range r, wstring_range &cont) noexcept; OSTD_EXPORT std::size_t length(wstring_range r, wstring_range &cont)
noexcept;
/** @brief Get the number of Unicode code points in a UTF-8 string. /** @brief Get the number of Unicode code points in a UTF-8 string.
* *
@ -1013,7 +1018,7 @@ namespace utf {
* If you need to stop at an invalid code unit and get the * If you need to stop at an invalid code unit and get the
* continuation string, use the overload above. * continuation string, use the overload above.
*/ */
std::size_t length(string_range r) noexcept; OSTD_EXPORT std::size_t length(string_range r) noexcept;
/** @brief Get the number of Unicode code points in a UTF-16 string. /** @brief Get the number of Unicode code points in a UTF-16 string.
* *
@ -1025,7 +1030,7 @@ namespace utf {
* If you need to stop at an invalid code unit and get the * If you need to stop at an invalid code unit and get the
* continuation string, use the overload above. * continuation string, use the overload above.
*/ */
std::size_t length(u16string_range r) noexcept; OSTD_EXPORT std::size_t length(u16string_range r) noexcept;
/** @brief Get the number of Unicode code points in a UTF-32 string. /** @brief Get the number of Unicode code points in a UTF-32 string.
* *
@ -1033,7 +1038,7 @@ namespace utf {
* invalid values as code points, so this function effectively just * invalid values as code points, so this function effectively just
* returns the size of the given range. * returns the size of the given range.
*/ */
std::size_t length(u32string_range r) noexcept; OSTD_EXPORT std::size_t length(u32string_range r) noexcept;
/** @brief Get the number of Unicode code points in a wide string. /** @brief Get the number of Unicode code points in a wide string.
* *
@ -1048,7 +1053,7 @@ namespace utf {
* The behavior of this function is platform dependent as wide * The behavior of this function is platform dependent as wide
* characters represent different things on different systems. * characters represent different things on different systems.
*/ */
std::size_t length(wstring_range r) noexcept; OSTD_EXPORT std::size_t length(wstring_range r) noexcept;
namespace detail { namespace detail {
template<typename IC, typename OC> template<typename IC, typename OC>
@ -1135,7 +1140,7 @@ namespace utf {
* This is true for either utf::isalpha() or utf::isdigit(). Also * This is true for either utf::isalpha() or utf::isdigit(). Also
* equivalent to std::isalnum(). * equivalent to std::isalnum().
*/ */
bool isalnum(char32_t c) noexcept; OSTD_EXPORT bool isalnum(char32_t c) noexcept;
/** @brief Check whether a code point is alphabetic. /** @brief Check whether a code point is alphabetic.
* *
@ -1145,7 +1150,7 @@ namespace utf {
* *
* The categories considered alphabetic are `L*`. * The categories considered alphabetic are `L*`.
*/ */
bool isalpha(char32_t c) noexcept; OSTD_EXPORT bool isalpha(char32_t c) noexcept;
/** @brief Check whether a code point is a blank. /** @brief Check whether a code point is a blank.
* *
@ -1154,7 +1159,7 @@ namespace utf {
* *
* The blank characters are only space (U+20) and tab (`U+9`). * The blank characters are only space (U+20) and tab (`U+9`).
*/ */
bool isblank(char32_t c) noexcept; OSTD_EXPORT bool isblank(char32_t c) noexcept;
/** @brief Check whether a code point is a control character. /** @brief Check whether a code point is a control character.
* *
@ -1163,7 +1168,7 @@ namespace utf {
* *
* The category considered control characters is `Cc`. * The category considered control characters is `Cc`.
*/ */
bool iscntrl(char32_t c) noexcept; OSTD_EXPORT bool iscntrl(char32_t c) noexcept;
/** @brief Check whether a code point is a digit. /** @brief Check whether a code point is a digit.
* *
@ -1173,14 +1178,14 @@ namespace utf {
* *
* The category considered a digit is `Nd`. * The category considered a digit is `Nd`.
*/ */
bool isdigit(char32_t c) noexcept; OSTD_EXPORT bool isdigit(char32_t c) noexcept;
/** @brief Check whether a code point is graphic. /** @brief Check whether a code point is graphic.
* *
* This is true when the input is not utf::isspace() and is * This is true when the input is not utf::isspace() and is
* utf::isprint(). Also equivalent to std::isgraph(). * utf::isprint(). Also equivalent to std::isgraph().
*/ */
bool isgraph(char32_t c) noexcept; OSTD_EXPORT bool isgraph(char32_t c) noexcept;
/** @brief Check whether a code point is lowercase. /** @brief Check whether a code point is lowercase.
* *
@ -1190,7 +1195,7 @@ namespace utf {
* *
* The category considered a lowercase is `Ll`. * The category considered a lowercase is `Ll`.
*/ */
bool islower(char32_t c) noexcept; OSTD_EXPORT bool islower(char32_t c) noexcept;
/** @brief Check whether a code point is printable. /** @brief Check whether a code point is printable.
* *
@ -1198,7 +1203,7 @@ namespace utf {
* all characters that are not utf::iscntrl() and that are not * all characters that are not utf::iscntrl() and that are not
* U+2028, U+2029, U+FFF9, U+FFFA, U+FFFB. * U+2028, U+2029, U+FFF9, U+FFFA, U+FFFB.
*/ */
bool isprint(char32_t c) noexcept; OSTD_EXPORT bool isprint(char32_t c) noexcept;
/** @brief Check whether a code point is punctuation. /** @brief Check whether a code point is punctuation.
* *
@ -1207,7 +1212,7 @@ namespace utf {
* false for others. Punctuation characters are those that satisfy * false for others. Punctuation characters are those that satisfy
* utf::isgraph() but are not utf::isalnum(). * utf::isgraph() but are not utf::isalnum().
*/ */
bool ispunct(char32_t c) noexcept; OSTD_EXPORT bool ispunct(char32_t c) noexcept;
/** @brief Check whether a code point is a whitespace. /** @brief Check whether a code point is a whitespace.
* *
@ -1217,7 +1222,7 @@ namespace utf {
* The categories considered blanks are `Z*` with the `B`, `S` and `WS` * The categories considered blanks are `Z*` with the `B`, `S` and `WS`
* bidirectional categories. * bidirectional categories.
*/ */
bool isspace(char32_t c) noexcept; OSTD_EXPORT bool isspace(char32_t c) noexcept;
/** @brief Check whether a code point is titlecase. /** @brief Check whether a code point is titlecase.
* *
@ -1226,7 +1231,7 @@ namespace utf {
* *
* The category considered a uppercase is `Lt`. * The category considered a uppercase is `Lt`.
*/ */
bool istitle(char32_t c) noexcept; OSTD_EXPORT bool istitle(char32_t c) noexcept;
/** @brief Check whether a code point is uppercase. /** @brief Check whether a code point is uppercase.
* *
@ -1236,7 +1241,7 @@ namespace utf {
* *
* The category considered a uppercase is `Lu`. * The category considered a uppercase is `Lu`.
*/ */
bool isupper(char32_t c) noexcept; OSTD_EXPORT bool isupper(char32_t c) noexcept;
/** @brief Check whether a code point is a valid character. /** @brief Check whether a code point is a valid character.
* *
@ -1247,7 +1252,7 @@ namespace utf {
* *
* This is Unicode specific and has no standard ctype equivalent. * This is Unicode specific and has no standard ctype equivalent.
*/ */
bool isvalid(char32_t c) noexcept; OSTD_EXPORT bool isvalid(char32_t c) noexcept;
/** @brief Check whether a code point is a hexadecimal digit. /** @brief Check whether a code point is a hexadecimal digit.
* *
@ -1259,7 +1264,7 @@ namespace utf {
* but unlike the former it never changes behavior, i.e. it cannot * but unlike the former it never changes behavior, i.e. it cannot
* support codepage extensions, being Unicode only. * support codepage extensions, being Unicode only.
*/ */
bool isxdigit(char32_t c) noexcept; OSTD_EXPORT bool isxdigit(char32_t c) noexcept;
/** @brief Convert a Unicode code point to lowercase. /** @brief Convert a Unicode code point to lowercase.
* *
@ -1268,7 +1273,7 @@ namespace utf {
* this just returns the input unchanged, otherwise it returns the * this just returns the input unchanged, otherwise it returns the
* matching lowercase variant. * matching lowercase variant.
*/ */
char32_t tolower(char32_t c) noexcept; OSTD_EXPORT char32_t tolower(char32_t c) noexcept;
/** @brief Convert a Unicode code point to uppercase. /** @brief Convert a Unicode code point to uppercase.
* *
@ -1277,7 +1282,7 @@ namespace utf {
* this just returns the input unchanged, otherwise it returns the * this just returns the input unchanged, otherwise it returns the
* matching uppercase variant. * matching uppercase variant.
*/ */
char32_t toupper(char32_t c) noexcept; OSTD_EXPORT char32_t toupper(char32_t c) noexcept;
/** @brief Compare two UTF-8 strings. /** @brief Compare two UTF-8 strings.
* *
@ -1324,7 +1329,7 @@ namespace utf {
* *
* @see basic_char_range::case_compare() * @see basic_char_range::case_compare()
*/ */
int case_compare(string_range s1, string_range s2) noexcept; OSTD_EXPORT int case_compare(string_range s1, string_range s2) noexcept;
/** @brief Compare two UTF-16 strings as case insensitive. /** @brief Compare two UTF-16 strings as case insensitive.
* *
@ -1335,7 +1340,8 @@ namespace utf {
* *
* @see basic_char_range::case_compare() * @see basic_char_range::case_compare()
*/ */
int case_compare(u16string_range s1, u16string_range s2) noexcept; OSTD_EXPORT int case_compare(u16string_range s1, u16string_range s2)
noexcept;
/** @brief Compare two UTF-32 strings as case insensitive. /** @brief Compare two UTF-32 strings as case insensitive.
* *
@ -1346,7 +1352,8 @@ namespace utf {
* *
* @see basic_char_range::case_compare() * @see basic_char_range::case_compare()
*/ */
int case_compare(u32string_range s1, u32string_range s2) noexcept; OSTD_EXPORT int case_compare(u32string_range s1, u32string_range s2)
noexcept;
/** @brief Compare two wide strings as case insensitive. /** @brief Compare two wide strings as case insensitive.
* *
@ -1360,7 +1367,7 @@ namespace utf {
* *
* @see basic_char_range::case_compare() * @see basic_char_range::case_compare()
*/ */
int case_compare(wstring_range s1, wstring_range s2) noexcept; OSTD_EXPORT int case_compare(wstring_range s1, wstring_range s2) noexcept;
/** @} */ /** @} */
} /* namespace utf */ } /* namespace utf */

View File

@ -8,6 +8,8 @@
#include <cstring> #include <cstring>
#include <limits> #include <limits>
#include <type_traits> #include <type_traits>
#include "ostd/platform.hh"
#include "ostd/string.hh" #include "ostd/string.hh"
#include "ostd/format.hh" #include "ostd/format.hh"
@ -40,16 +42,16 @@ sloop:
return (p - bp); return (p - bp);
} }
std::size_t tstrlen(char const *p) noexcept { OSTD_EXPORT std::size_t tstrlen(char const *p) noexcept {
return tstrlen_impl(p); return tstrlen_impl(p);
} }
std::size_t tstrlen(char16_t const *p) noexcept { OSTD_EXPORT std::size_t tstrlen(char16_t const *p) noexcept {
return tstrlen_impl(p); return tstrlen_impl(p);
} }
std::size_t tstrlen(char32_t const *p) noexcept { OSTD_EXPORT std::size_t tstrlen(char32_t const *p) noexcept {
return tstrlen_impl(p); return tstrlen_impl(p);
} }
std::size_t tstrlen(wchar_t const *p) noexcept { OSTD_EXPORT std::size_t tstrlen(wchar_t const *p) noexcept {
return tstrlen_impl(p); return tstrlen_impl(p);
} }
@ -140,7 +142,7 @@ namespace detail {
return 1; return 1;
} }
std::size_t encode( OSTD_EXPORT std::size_t encode(
char (&ret)[4], char32_t ch char (&ret)[4], char32_t ch
) noexcept { ) noexcept {
if (ch <= 0x7F) { if (ch <= 0x7F) {
@ -174,7 +176,7 @@ namespace detail {
return 0; return 0;
} }
std::size_t encode( OSTD_EXPORT std::size_t encode(
char16_t (&ret)[2], char32_t ch char16_t (&ret)[2], char32_t ch
) noexcept { ) noexcept {
/* surrogate code point or out of bounds */ /* surrogate code point or out of bounds */
@ -223,7 +225,7 @@ namespace detail {
} }
} /* namespace detail */ } /* namespace detail */
bool decode(string_range &r, char32_t &ret) noexcept { OSTD_EXPORT bool decode(string_range &r, char32_t &ret) noexcept {
auto tn = r.size(); auto tn = r.size();
auto *beg = reinterpret_cast<unsigned char const *>(r.data()); auto *beg = reinterpret_cast<unsigned char const *>(r.data());
if (std::size_t n; (n = detail::u8_decode(beg, beg + tn, ret))) { if (std::size_t n; (n = detail::u8_decode(beg, beg + tn, ret))) {
@ -233,7 +235,7 @@ bool decode(string_range &r, char32_t &ret) noexcept {
return false; return false;
} }
bool decode(u16string_range &r, char32_t &ret) noexcept { OSTD_EXPORT bool decode(u16string_range &r, char32_t &ret) noexcept {
auto tn = r.size(); auto tn = r.size();
auto *beg = r.data(); auto *beg = r.data();
if (std::size_t n; (n = detail::u16_decode(beg, beg + tn, ret))) { if (std::size_t n; (n = detail::u16_decode(beg, beg + tn, ret))) {
@ -243,7 +245,7 @@ bool decode(u16string_range &r, char32_t &ret) noexcept {
return false; return false;
} }
bool decode(u32string_range &r, char32_t &ret) noexcept { OSTD_EXPORT bool decode(u32string_range &r, char32_t &ret) noexcept {
if (r.empty()) { if (r.empty()) {
return false; return false;
} }
@ -256,7 +258,7 @@ bool decode(u32string_range &r, char32_t &ret) noexcept {
return true; return true;
} }
bool decode(wstring_range &r, char32_t &ret) noexcept { OSTD_EXPORT bool decode(wstring_range &r, char32_t &ret) noexcept {
std::size_t n, tn = r.size(); std::size_t n, tn = r.size();
if constexpr(is_wchar_u32) { if constexpr(is_wchar_u32) {
if (!tn) { if (!tn) {
@ -283,35 +285,39 @@ bool decode(wstring_range &r, char32_t &ret) noexcept {
return false; return false;
} }
std::size_t length(string_range r, string_range &cont) noexcept { OSTD_EXPORT std::size_t length(string_range r, string_range &cont) noexcept {
return detail::length(r, cont); return detail::length(r, cont);
} }
std::size_t length(u16string_range r, u16string_range &cont) noexcept { OSTD_EXPORT std::size_t length(u16string_range r, u16string_range &cont)
noexcept
{
return detail::length(r, cont); return detail::length(r, cont);
} }
std::size_t length(u32string_range r, u32string_range &cont) noexcept { OSTD_EXPORT std::size_t length(u32string_range r, u32string_range &cont)
noexcept
{
return detail::length(r, cont); return detail::length(r, cont);
} }
std::size_t length(wstring_range r, wstring_range &cont) noexcept { OSTD_EXPORT std::size_t length(wstring_range r, wstring_range &cont) noexcept {
return detail::length(r, cont); return detail::length(r, cont);
} }
std::size_t length(string_range r) noexcept { OSTD_EXPORT std::size_t length(string_range r) noexcept {
return detail::length(r); return detail::length(r);
} }
std::size_t length(u16string_range r) noexcept { OSTD_EXPORT std::size_t length(u16string_range r) noexcept {
return detail::length(r); return detail::length(r);
} }
std::size_t length(u32string_range r) noexcept { OSTD_EXPORT std::size_t length(u32string_range r) noexcept {
return detail::length(r); return detail::length(r);
} }
std::size_t length(wstring_range r) noexcept { OSTD_EXPORT std::size_t length(wstring_range r) noexcept {
return detail::length(r); return detail::length(r);
} }
@ -319,19 +325,19 @@ std::size_t length(wstring_range r) noexcept {
* the other ones use custom tables for lookups * the other ones use custom tables for lookups
*/ */
bool isalnum(char32_t c) noexcept { OSTD_EXPORT bool isalnum(char32_t c) noexcept {
return (utf::isalpha(c) || utf::isdigit(c)); return (utf::isalpha(c) || utf::isdigit(c));
} }
bool isblank(char32_t c) noexcept { OSTD_EXPORT bool isblank(char32_t c) noexcept {
return ((c == ' ') || (c == '\t')); return ((c == ' ') || (c == '\t'));
} }
bool isgraph(char32_t c) noexcept { OSTD_EXPORT bool isgraph(char32_t c) noexcept {
return (!utf::isspace(c) && utf::isprint(c)); return (!utf::isspace(c) && utf::isprint(c));
} }
bool isprint(char32_t c) noexcept { OSTD_EXPORT bool isprint(char32_t c) noexcept {
switch (c) { switch (c) {
case 0x2028: case 0x2028:
case 0x2029: case 0x2029:
@ -344,11 +350,11 @@ bool isprint(char32_t c) noexcept {
} }
} }
bool ispunct(char32_t c) noexcept { OSTD_EXPORT bool ispunct(char32_t c) noexcept {
return (utf::isgraph(c) && !utf::isalnum(c)); return (utf::isgraph(c) && !utf::isalnum(c));
} }
bool isvalid(char32_t c) noexcept { OSTD_EXPORT bool isvalid(char32_t c) noexcept {
/* surrogate code points */ /* surrogate code points */
if ((c >= 0xD800) && (c <= 0xDFFF)) { if ((c >= 0xD800) && (c <= 0xDFFF)) {
return false; return false;
@ -365,7 +371,7 @@ bool isvalid(char32_t c) noexcept {
return (c <= utf::max_unicode); return (c <= utf::max_unicode);
} }
bool isxdigit(char32_t c) noexcept { OSTD_EXPORT bool isxdigit(char32_t c) noexcept {
if ((c >= '0') && (c <= '9')) { if ((c >= '0') && (c <= '9')) {
return true; return true;
} }
@ -478,15 +484,15 @@ struct uctype_func {
}; };
/* these are geneated */ /* these are geneated */
bool isalpha(char32_t c) noexcept; OSTD_EXPORT bool isalpha(char32_t c) noexcept;
bool iscntrl(char32_t c) noexcept; OSTD_EXPORT bool iscntrl(char32_t c) noexcept;
bool isdigit(char32_t c) noexcept; OSTD_EXPORT bool isdigit(char32_t c) noexcept;
bool islower(char32_t c) noexcept; OSTD_EXPORT bool islower(char32_t c) noexcept;
bool isspace(char32_t c) noexcept; OSTD_EXPORT bool isspace(char32_t c) noexcept;
bool istitle(char32_t c) noexcept; OSTD_EXPORT bool istitle(char32_t c) noexcept;
bool isupper(char32_t c) noexcept; OSTD_EXPORT bool isupper(char32_t c) noexcept;
char32_t tolower(char32_t c) noexcept; OSTD_EXPORT char32_t tolower(char32_t c) noexcept;
char32_t toupper(char32_t c) noexcept; OSTD_EXPORT char32_t toupper(char32_t c) noexcept;
#if __has_include("string_utf.hh") #if __has_include("string_utf.hh")
#include "string_utf.hh" #include "string_utf.hh"
@ -496,42 +502,42 @@ char32_t toupper(char32_t c) noexcept;
* is generated during build) by providing a bunch of ASCII only fallbacks * is generated during build) by providing a bunch of ASCII only fallbacks
*/ */
bool isalpha(char32_t c) noexcept { OSTD_EXPORT bool isalpha(char32_t c) noexcept {
return (utf::isupper(c) || utf::islower(c)); return (utf::isupper(c) || utf::islower(c));
} }
bool iscntrl(char32_t c) noexcept { OSTD_EXPORT bool iscntrl(char32_t c) noexcept {
return ((c <= 0x1F) || (c == 0x7F)); return ((c <= 0x1F) || (c == 0x7F));
} }
bool isdigit(char32_t c) noexcept { OSTD_EXPORT bool isdigit(char32_t c) noexcept {
return ((c >= '0') && (c <= '9')); return ((c >= '0') && (c <= '9'));
} }
bool islower(char32_t c) noexcept { OSTD_EXPORT bool islower(char32_t c) noexcept {
return ((c >= 'a') && (c <= 'z')); return ((c >= 'a') && (c <= 'z'));
} }
bool isspace(char32_t c) noexcept { OSTD_EXPORT bool isspace(char32_t c) noexcept {
return ((c == ' ') || ((c >= 0x09) && (c <= 0x0D))); return ((c == ' ') || ((c >= 0x09) && (c <= 0x0D)));
} }
bool istitle(char32_t) noexcept { OSTD_EXPORT bool istitle(char32_t) noexcept {
return false; return false;
} }
bool isupper(char32_t c) noexcept { OSTD_EXPORT bool isupper(char32_t c) noexcept {
return ((c >= 'A') && (c <= 'Z')); return ((c >= 'A') && (c <= 'Z'));
} }
char32_t tolower(char32_t c) noexcept { OSTD_EXPORT char32_t tolower(char32_t c) noexcept {
if (utf::isupper(c)) { if (utf::isupper(c)) {
return c | 32; return c | 32;
} }
return c; return c;
} }
char32_t toupper(char32_t c) noexcept { OSTD_EXPORT char32_t toupper(char32_t c) noexcept {
if (utf::islower(c)) { if (utf::islower(c)) {
return c ^ 32; return c ^ 32;
} }
@ -593,23 +599,23 @@ namespace detail {
} }
} }
int case_compare(string_range s1, string_range s2) noexcept { OSTD_EXPORT int case_compare(string_range s1, string_range s2) noexcept {
auto *beg1 = reinterpret_cast<unsigned char const *>(s1.data()); auto *beg1 = reinterpret_cast<unsigned char const *>(s1.data());
auto *beg2 = reinterpret_cast<unsigned char const *>(s2.data()); auto *beg2 = reinterpret_cast<unsigned char const *>(s2.data());
return detail::case_compare(beg1, beg1 + s1.size(), beg2, beg2 + s2.size()); return detail::case_compare(beg1, beg1 + s1.size(), beg2, beg2 + s2.size());
} }
int case_compare(u16string_range s1, u16string_range s2) noexcept { OSTD_EXPORT int case_compare(u16string_range s1, u16string_range s2) noexcept {
auto *beg1 = s1.data(), *beg2 = s2.data(); auto *beg1 = s1.data(), *beg2 = s2.data();
return detail::case_compare(beg1, beg1 + s1.size(), beg2, beg2 + s2.size()); return detail::case_compare(beg1, beg1 + s1.size(), beg2, beg2 + s2.size());
} }
int case_compare(u32string_range s1, u32string_range s2) noexcept { OSTD_EXPORT int case_compare(u32string_range s1, u32string_range s2) noexcept {
auto *beg1 = s1.data(), *beg2 = s2.data(); auto *beg1 = s1.data(), *beg2 = s2.data();
return detail::case_compare(beg1, beg1 + s1.size(), beg2, beg2 + s2.size()); return detail::case_compare(beg1, beg1 + s1.size(), beg2, beg2 + s2.size());
} }
int case_compare(wstring_range s1, wstring_range s2) noexcept { OSTD_EXPORT int case_compare(wstring_range s1, wstring_range s2) noexcept {
using C = std::conditional_t<is_wchar_u8, unsigned char, wchar_fixed_t>; using C = std::conditional_t<is_wchar_u8, unsigned char, wchar_fixed_t>;
auto *beg1 = reinterpret_cast<C const *>(s1.data()); auto *beg1 = reinterpret_cast<C const *>(s1.data());
auto *beg2 = reinterpret_cast<C const *>(s2.data()); auto *beg2 = reinterpret_cast<C const *>(s2.data());