HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
fixed_string.hpp
1// Copyright Take Vos 2021-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 "utility.hpp"
8#include <string>
9#include <string_view>
10#include <format>
11#include <array>
12
13namespace hi::inline v1 {
14
32template<int N>
34 using value_type = char;
35
36 std::array<char, N> _str = {};
37
38 constexpr fixed_string() noexcept = default;
39 constexpr fixed_string(fixed_string const&) noexcept = default;
40 constexpr fixed_string(fixed_string&&) noexcept = default;
41 constexpr fixed_string& operator=(fixed_string const&) noexcept = default;
42 constexpr fixed_string& operator=(fixed_string&&) noexcept = default;
43
44 template<std::size_t O>
45 constexpr fixed_string(char const (&str)[O]) noexcept requires((O - 1) == N)
46 {
47 for (auto i = 0_uz; i != (O - 1); ++i) {
48 _str[i] = str[i];
49 }
50 }
51
52 constexpr operator std::string_view() const noexcept
53 {
54 return std::string_view{_str.data(), size()};
55 }
56
57 constexpr operator std::string() const noexcept
58 {
59 return std::string{_str.data(), size()};
60 }
61
62 [[nodiscard]] constexpr std::size_t size() const noexcept
63 {
64 return N;
65 }
66
67 [[nodiscard]] constexpr char& operator[](size_t index) noexcept
68 {
69#ifndef NDEBUG
70 if (not(index < N)) {
72 }
73#endif
74 return _str[index];
75 }
76
77 [[nodiscard]] constexpr char const& operator[](size_t index) const noexcept
78 {
79#ifndef NDEBUG
80 if (not(index < N)) {
82 }
83#endif
84 return _str[index];
85 }
86
87 [[nodiscard]] constexpr auto begin() noexcept
88 {
89 return _str.begin();
90 }
91
92 [[nodiscard]] constexpr auto end() noexcept
93 {
94 return _str.begin() + size();
95 }
96
97 [[nodiscard]] constexpr bool operator==(fixed_string const& rhs) const noexcept = default;
98 [[nodiscard]] constexpr auto operator<=>(fixed_string const& rhs) const noexcept = default;
99
100 template<size_t O>
101 [[nodiscard]] constexpr bool operator==(fixed_string<O> const& rhs) const noexcept requires(O != N)
102 {
103 return false;
104 }
105
106 template<size_t O>
107 [[nodiscard]] constexpr auto operator<=>(fixed_string<O> const& rhs) const noexcept requires(O != N)
108 {
109 return static_cast<std::string_view>(*this) <=> static_cast<std::string_view>(rhs);
110 }
111
112 [[nodiscard]] constexpr bool operator==(std::string_view rhs) const noexcept
113 {
114 return static_cast<std::string_view>(*this) == rhs;
115 }
116
117 [[nodiscard]] constexpr auto operator<=>(std::string_view rhs) const noexcept
118 {
119 return static_cast<std::string_view>(*this) <=> rhs;
120 }
121
122 [[nodiscard]] constexpr bool operator==(std::string const &rhs) const noexcept
123 {
124 return static_cast<std::string_view>(*this) == rhs;
125 }
126
127 [[nodiscard]] constexpr auto operator<=>(std::string const &rhs) const noexcept
128 {
129 return static_cast<std::string_view>(*this) <=> rhs;
130 }
131
132 [[nodiscard]] constexpr bool operator==(char const *rhs) const noexcept
133 {
134 return static_cast<std::string_view>(*this) == rhs;
135 }
136
137 [[nodiscard]] constexpr auto operator<=>(char const *rhs) const noexcept
138 {
139 return static_cast<std::string_view>(*this) <=> rhs;
140 }
141
142 template<size_t O>
143 [[nodiscard]] constexpr bool operator==(char const (&rhs)[O]) const noexcept
144 {
145 return *this == fixed_string<O - 1>(rhs);
146 }
147
148 template<size_t O>
149 [[nodiscard]] constexpr auto operator<=>(char const (&rhs)[O]) const noexcept
150 {
151 return *this <=> fixed_string<O - 1>(rhs);
152 }
153
154 template<size_t O>
155 [[nodiscard]] constexpr auto operator+(fixed_string<O> const& rhs) const noexcept
156 {
157 auto r = fixed_string<N + O>{};
158 auto dst_i = 0_uz;
159 for (auto src_i = 0_uz; src_i != N; ++src_i, ++dst_i) {
160 r[dst_i] = (*this)[src_i];
161 }
162 for (auto src_i = 0_uz; src_i != O; ++src_i, ++dst_i) {
163 r[dst_i] = rhs[src_i];
164 }
165
166 return r;
167 }
168};
169
170// template<typename CharT>
171//[[nodiscard]] constexpr std::size_t fixed_string_length_(CharT const *str) noexcept
172//{
173// std::size_t i = 0;
174// while (str[i++] != CharT{}) {}
175// return i;
176// }
177
178template<std::size_t N>
179fixed_string(char const (&str)[N]) -> fixed_string<N - 1>;
180
181} // namespace hi::inline v1
182
183template<std::size_t N, typename CharT>
184struct std::formatter<hi::fixed_string<N>, CharT> : std::formatter<std::string_view, CharT> {
185 constexpr auto format(hi::fixed_string<N> const& t, auto& fc)
186 {
187 return std::formatter<std::string_view, CharT>::format(static_cast<std::string_view>(t), fc);
188 }
189};
Utilities used by the HikoGUI library itself.
DOXYGEN BUG.
Definition algorithm.hpp:15
geometry/margins.hpp
Definition assert.hpp:18
A string which may be used as a none-type template parameter.
Definition fixed_string.hpp:33
T begin(T... args)
T data(T... args)
T terminate(T... args)