7#include "../utility/module.hpp"
8#include "../strings.hpp"
11namespace hi::inline
v1 {
32 template<std::
size_t I>
36 c == 0 or (
c >=
'a' and
c <=
'z') or (
c >=
'A' and
c <=
'Z') or (
c >=
'1' and
c <=
'5'),
37 "Must be letters or the digits between '1' and '5', or nul");
41 (
c >=
'a' and
c <=
'z') ?
c -
'a' + 1 :
42 (
c >=
'A' and
c <=
'Z') ?
c -
'A' + 1 :
43 (
c >=
'1' and
c <=
'5') ?
c -
'1' + 27 :
48 constexpr auto shift = I * 5;
49 rhs._v &= ~(0x1f <<
shift);
60 template<std::
size_t I>
61 [[nodiscard]]
constexpr friend char get(
iso_639 const& rhs)
noexcept
63 constexpr auto shift = I * 5;
68 return 'a' + narrow_cast<char>(x - 1);
70 return '1' + narrow_cast<char>(x - 27);
85 constexpr iso_639(std::string_view str) : _v(0)
88 hi_check(str.size() == 2 or str.size() == 3,
"ISO-639 incorrect length.");
90 set<0>(*
this, str[0]);
91 set<1>(*
this, str[1]);
92 if (str.size() == 3) {
93 set<2>(*
this, str[2]);
96 throw parse_error(std::format(
"A ISO-639 language code must be 2 or 3 letters in length, got '{}'", str));
106 hilet tmp = _v & 0x7fff;
118 [[nodiscard]]
constexpr bool empty() const noexcept
125 constexpr explicit operator bool() const noexcept
132 [[nodiscard]]
size_t hash() const noexcept
177 [[nodiscard]]
size_t operator()(hi::iso_639
const& rhs)
const noexcept
#define hi_check(expression, message,...)
Check if the expression is valid, or throw a parse_error.
Definition assert.hpp:95
#define hi_assert(expression,...)
Assert if expression is true.
Definition assert.hpp:184
#define hilet
Invariant should be the default for variables.
Definition utility.hpp:23
DOXYGEN BUG.
Definition algorithm.hpp:13
@ shift
The shift key is being held.
geometry/margins.hpp
Definition cache.hpp:11
ISO-639 language code.
Definition iso_639.hpp:24
constexpr std::string code() const noexcept
Get the 2 or 3 letter ISO-639 code.
Definition iso_639.hpp:139
constexpr bool empty() const noexcept
Check if the language is empty.
Definition iso_639.hpp:118
size_t hash() const noexcept
Get the hash value for this language code.
Definition iso_639.hpp:132
constexpr friend char get(iso_639 const &rhs) noexcept
Get the letter at a specific position.
Definition iso_639.hpp:61
constexpr friend iso_639 & set(iso_639 &rhs, char c)
Set the letter at a specific position.
Definition iso_639.hpp:33
constexpr friend auto operator<=>(iso_639 const &lhs, iso_639 const &rhs) noexcept=default
Compare two language codes.
constexpr iso_639(std::string_view str)
Construct a language from the 2 or 3 letter code.
Definition iso_639.hpp:85
constexpr friend bool operator==(iso_639 const &lhs, iso_639 const &rhs) noexcept=default
Compare two language codes.
constexpr std::size_t size() const noexcept
Get the number of character.
Definition iso_639.hpp:104