12#include "../macros.hpp"
15#include "debugger.hpp"
16#include "exception.hpp"
19hi_export_module(hikogui.utility.fixed_string);
21hi_export
namespace hi {
inline namespace v1 {
42 using value_type = char;
52 template<std::
size_t O>
54 requires((O - 1) == N)
56 for (
auto i = 0_uz; i != (O - 1); ++i) {
63 template<std::invocable F>
68 hi_assert(str.size() == N);
69 for (
auto i = 0_uz; i != str.size(); ++i) {
74 constexpr operator std::string_view() const noexcept
76 return std::string_view{_str.
data(), size()};
84 [[nodiscard]]
constexpr std::size_t size() const noexcept
89 [[nodiscard]]
constexpr bool empty() const noexcept
95 [[nodiscard]]
constexpr friend char& get(fixed_string& a)
noexcept
97 return std::get<I>(a._str);
101 [[nodiscard]]
constexpr friend char const& get(fixed_string
const& a)
noexcept
103 return std::get<I>(a._str);
106 [[nodiscard]]
constexpr char& operator[](
size_t index)
noexcept
109 if (not(index < N)) {
116 [[nodiscard]]
constexpr char const& operator[](
size_t index)
const noexcept
119 if (not(index < N)) {
126 [[nodiscard]]
constexpr auto begin() noexcept
131 [[nodiscard]]
constexpr auto end() noexcept
133 return _str.begin() + size();
136 [[nodiscard]]
constexpr bool operator==(fixed_string
const& rhs)
const noexcept =
default;
137 [[nodiscard]]
constexpr auto operator<=>(fixed_string
const& rhs)
const noexcept =
default;
140 [[nodiscard]]
constexpr bool operator==(fixed_string<O>
const& rhs)
const noexcept
147 [[nodiscard]]
constexpr auto operator<=>(fixed_string<O>
const& rhs)
const noexcept
150 return static_cast<std::string_view
>(*this) <=>
static_cast<std::string_view
>(rhs);
153 [[nodiscard]]
constexpr bool operator==(std::string_view rhs)
const noexcept
155 return static_cast<std::string_view
>(*this) == rhs;
158 [[nodiscard]]
constexpr auto operator<=>(std::string_view rhs)
const noexcept
160 return static_cast<std::string_view
>(*this) <=> rhs;
163 [[nodiscard]]
constexpr bool operator==(std::string
const& rhs)
const noexcept
165 return static_cast<std::string_view
>(*this) == rhs;
168 [[nodiscard]]
constexpr auto operator<=>(std::string
const& rhs)
const noexcept
170 return static_cast<std::string_view
>(*this) <=> rhs;
173 [[nodiscard]]
constexpr bool operator==(
char const *rhs)
const noexcept
175 return static_cast<std::string_view
>(*this) == rhs;
178 [[nodiscard]]
constexpr auto operator<=>(
char const *rhs)
const noexcept
180 return static_cast<std::string_view
>(*this) <=> rhs;
184 [[nodiscard]]
constexpr bool operator==(
char const (&rhs)[O])
const noexcept
186 return *
this == fixed_string<O - 1>(rhs);
190 [[nodiscard]]
constexpr auto operator<=>(
char const (&rhs)[O])
const noexcept
192 return *this <=> fixed_string<O - 1>(rhs);
198 [[nodiscard]]
constexpr auto operator+(fixed_string<R>
const& rhs)
const noexcept
200 auto r = fixed_string<N + R>{};
202 for (
auto src_i = 0_uz; src_i != N; ++src_i, ++dst_i) {
203 r[dst_i] = (*this)[src_i];
205 for (
auto src_i = 0_uz; src_i != R; ++src_i, ++dst_i) {
206 r[dst_i] = rhs[src_i];
213 [[nodiscard]]
constexpr auto operator+(
char const (&rhs)[R])
const noexcept
223 [[nodiscard]]
constexpr auto operator/(fixed_string<R>
const& rhs)
const noexcept
225 constexpr auto has_dot = N != 0 and R != 0 ? 1_uz : 0_uz;
226 auto r = fixed_string<N + R + has_dot>{};
229 for (
auto src_i = 0_uz; src_i != N; ++src_i, ++dst_i) {
230 r[dst_i] = (*this)[src_i];
237 for (
auto src_i = 0_uz; src_i != R; ++src_i, ++dst_i) {
238 r[dst_i] = rhs[src_i];
245 [[nodiscard]]
constexpr auto operator/(
char const (&rhs)[R])
const noexcept
251template<fixed_
string Tag>
252[[nodiscard]]
consteval uint32_t fourcc() noexcept
254 static_assert(Tag.size() == 4,
"fourcc must get a 4 character fixed_string");
256 return (
static_cast<uint32_t
>(get<0>(Tag)) << 24) | (
static_cast<uint32_t
>(get<1>(Tag)) << 16) |
257 (
static_cast<uint32_t
>(get<2>(Tag)) << 8) |
static_cast<uint32_t
>(get<3>(Tag));
260template<fixed_
string Tag>
261consteval uint32_t
operator"" _fcc()
263 return fourcc<Tag>();
266template<std::
size_t N>
269template<std::invocable F>
272#define hi_to_fixed_string(x) \
282hi_export
template<std::
size_t N,
typename CharT>
283struct std::formatter<
hi::fixed_string<N>, CharT> : std::formatter<std::string_view, CharT> {
286 return std::formatter<std::string_view, CharT>::format(
static_cast<std::string_view
>(t), fc);
Utilities to assert and bound check.
Functions for casting values between types savely.
geometry/margins.hpp
Definition lookahead_iterator.hpp:5
The HikoGUI API version 1.
Definition lookahead_iterator.hpp:6
constexpr Out char_cast(In rhs) noexcept
Cast a character.
Definition cast.hpp:550
A string which may be used as a none-type template parameter.
Definition fixed_string.hpp:41
constexpr auto operator/(fixed_string< R > const &rhs) const noexcept
Join two strings with a slash '/'.
Definition fixed_string.hpp:223
constexpr fixed_string(F const &f) noexcept
Create a fixed string from function returning a string-like.
Definition fixed_string.hpp:64
constexpr auto operator+(fixed_string< R > const &rhs) const noexcept
Append two strings.
Definition fixed_string.hpp:198