HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
iso_3166_intf.hpp
1// Copyright Take Vos 2022.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt)
4
5#pragma once
6
7#include <cctype>
8#include "../utility/utility.hpp"
9#include "../macros.hpp"
10
11hi_export_module(hikogui.i18n.iso_3166 : intf);
12
13namespace hi::inline v1 {
14
17hi_export class iso_3166 {
18public:
19 constexpr iso_3166(iso_3166 const&) noexcept = default;
20 constexpr iso_3166(iso_3166&&) noexcept = default;
21 constexpr iso_3166& operator=(iso_3166 const&) noexcept = default;
22 constexpr iso_3166& operator=(iso_3166&&) noexcept = default;
23
24 constexpr iso_3166() noexcept : _v(0) {}
25
26 constexpr iso_3166(uint16_t number) : _v(number)
27 {
28 hi_check(number <= 999, "ISO-3166 number must be between 0 and 999, got {}", number);
29 }
30
31 constexpr iso_3166(std::string_view str);
32
33 constexpr iso_3166(intrinsic_t, uint16_t v) noexcept : _v(v)
34 {
35 hi_axiom(_v < 1000);
36 }
37
38 [[nodiscard]] constexpr uint16_t const& intrinsic() const noexcept
39 {
40 return _v;
41 }
42
43 [[nodiscard]] constexpr uint16_t& intrinsic() noexcept
44 {
45 return _v;
46 }
47
48 [[nodiscard]] constexpr bool empty() const noexcept
49 {
50 return _v == 0;
51 }
52
53 constexpr explicit operator bool() const noexcept
54 {
55 return not empty();
56 }
57
58 [[nodiscard]] constexpr uint16_t number() const noexcept
59 {
60 return _v;
61 }
62
63 [[nodiscard]] constexpr std::string code2() const noexcept;
64 [[nodiscard]] constexpr std::string code3() const noexcept;
65
66 [[nodiscard]] constexpr friend std::string to_string(iso_3166 const &rhs) noexcept
67 {
68 return rhs.code2();
69 }
70
71 [[nodiscard]] constexpr friend bool operator==(iso_3166 const& lhs, iso_3166 const& rhs) noexcept = default;
72 [[nodiscard]] constexpr friend auto operator<=>(iso_3166 const& lhs, iso_3166 const& rhs) noexcept = default;
73
80 [[nodiscard]] constexpr friend bool matches(iso_3166 const& lhs, iso_3166 const& rhs) noexcept
81 {
82 return lhs.empty() or lhs == rhs;
83 }
84
85private:
86 uint16_t _v;
87};
88
89} // namespace hi::inline v1
90
91template<>
92struct std::hash<hi::iso_3166> {
93 [[nodiscard]] size_t operator()(hi::iso_3166 const& rhs) const noexcept
94 {
95 return std::hash<uint16_t>{}(rhs.number());
96 }
97};
DOXYGEN BUG.
Definition algorithm.hpp:16
geometry/margins.hpp
Definition lookahead_iterator.hpp:5
constexpr Out narrow_cast(In const &rhs) noexcept
Cast numeric values without loss of precision.
Definition cast.hpp:377
ISO-3166 country code.
Definition iso_3166_intf.hpp:17
constexpr friend bool matches(iso_3166 const &lhs, iso_3166 const &rhs) noexcept
Check if rhs matches with lhs.
Definition iso_3166_intf.hpp:80
T operator()(T... args)