42 std::array<char, N + 1> elements;
47 : elements{std::to_array(data)} {}
49 template <std::size_t... Ns>
50 consteval literal_string(std::span<const char, Ns>... data)
noexcept
52 auto iter = elements.begin();
54 ((iter = std::ranges::copy(data, iter).out), ...,
static_cast<void>(iter));
57 template <std::size_t... Ns>
60 auto iter = elements.begin();
62 ((iter = std::ranges::copy(data, iter).out), ...,
static_cast<void>(iter));
65 template <std::same_as<
char>... Ts>
66 requires(
sizeof...(Ts) == N)
67 consteval literal_string(Ts... chars) noexcept : elements{chars...} {}
69 constexpr char& operator[](std::size_t index)
noexcept {
70 return elements[index];
73 constexpr const char& operator[](std::size_t index)
const noexcept {
74 return elements[index];
77 constexpr operator std::string_view()
const noexcept {
78 return std::string_view{elements.data(), size()};
85 [[nodiscard]]
static constexpr bool empty()
noexcept {
89 [[nodiscard]]
static constexpr std::size_t size()
noexcept {
93 [[nodiscard]]
constexpr char& front()
noexcept {
94 return elements.front();
97 [[nodiscard]]
constexpr const char& front()
const noexcept {
98 return elements.front();
101 [[nodiscard]]
constexpr char& back()
noexcept {
102 return elements[size() - 1];
105 [[nodiscard]]
constexpr const char& back()
const noexcept {
106 return elements[size() - 1];
109 [[nodiscard]]
constexpr auto begin()
noexcept {
110 return elements.begin();
113 [[nodiscard]]
constexpr auto begin()
const noexcept {
114 return elements.begin();
117 [[nodiscard]]
constexpr auto end()
noexcept {
118 return elements.begin() + size();
121 [[nodiscard]]
constexpr auto end()
const noexcept {
122 return elements.begin() + size();
125 [[nodiscard]]
constexpr char* data()
noexcept {
126 return elements.data();
129 [[nodiscard]]
constexpr const char* data()
const noexcept {
130 return elements.data();
133 [[nodiscard]]
constexpr const char* c_str()
const noexcept {
134 return elements.data();
137 [[nodiscard]]
constexpr bool contains(
char c)
const noexcept {
138 return std::find(begin(), end(), c) != end();
141 [[nodiscard]]
constexpr bool contains(std::string_view str)
const noexcept {
142 return str.size() <= size() ? std::search(begin(), end(), str.begin(), str.end()) != end() :
false;
145 [[nodiscard]]
constexpr auto to_span()
const noexcept {
146 return std::span<const char, N>{data(), size()};