nngn
Loading...
Searching...
No Matches
fixed_string.h
Go to the documentation of this file.
1#ifndef NNGN_UTILS_FIXED_STRING_H
2#define NNGN_UTILS_FIXED_STRING_H
3
4#include <algorithm>
5#include <cstddef>
6#include <ranges>
7#include <string_view>
8
9#include "utils.h"
10
11namespace nngn {
12
13template<std::size_t N>
16 constexpr fixed_string(const char (&s_)[N + 1]);
17 constexpr ~fixed_string(void) = default;
18 constexpr operator std::string_view(void) const { return {this->s, N}; }
19 constexpr std::size_t size(void) const { return N; }
20 constexpr const char *data(void) const { return this->s; }
21 constexpr const char *begin(void) const { return this->s; }
22 constexpr const char *end(void) const { return this->s + N; }
23 char s[N] = {};
24};
25static_assert(std::ranges::contiguous_range<fixed_string<1>>);
26
27template<std::size_t N>
28fixed_string(const char (&)[N]) -> fixed_string<N - 1>;
29
30template<std::size_t N>
31constexpr fixed_string<N>::fixed_string(const char (&s_)[N + 1]) {
32 std::copy(s_, s_ + N, this->s);
33}
34
36template<std::ranges::sized_range ...Rs>
37constexpr auto cat(const Rs &...rs) {
38 using T = std::common_type_t<std::ranges::range_value_t<Rs>...>;
39 constexpr auto n = (... + std::tuple_size_v<Rs>);
40 std::array<T, n> ret = {};
41 std::size_t i = 0;
42 (..., (std::copy(begin(rs), end(rs), &ret[i]), i += rs.size()));
43 return ret;
44}
45
46}
47
48namespace std {
49
50template<size_t N>
51struct tuple_size<nngn::fixed_string<N>> : integral_constant<size_t, N> {};
52
53}
54
55#endif
end
Definition: entities.lua:9
Definition: debug.h:45
constexpr const R * begin(const T< R > &v)
Definition: vec.h:207
constexpr auto cat(const Rs &...rs)
Concatenates multiple fixed_string objects into a character array.
Definition: fixed_string.h:37
Definition: debug.h:13
Definition: fixed_string.h:14
constexpr const char * end(void) const
Definition: fixed_string.h:22
char s[N]
Definition: fixed_string.h:23
constexpr const char * data(void) const
Definition: fixed_string.h:20
fixed_string()=default
constexpr const char * begin(void) const
Definition: fixed_string.h:21
constexpr std::size_t size(void) const
Definition: fixed_string.h:19
constexpr ~fixed_string(void)=default
std::chrono::seconds s
Definition: timing.cpp:6
#define NNGN_DEFAULT_CONSTRUCT(x)
Definition: utils.h:20