5#ifndef INCLUDE_GUARD_ARENE_BASE_ARENE_BASE_STRINGS_INLINE_STRING_REFERENCE_HPP_
6#define INCLUDE_GUARD_ARENE_BASE_ARENE_BASE_STRINGS_INLINE_STRING_REFERENCE_HPP_
12#include "arene/base/compare/operators.hpp"
13#include "arene/base/compare/strong_ordering.hpp"
14#include "arene/base/compiler_support/attributes.hpp"
15#include "arene/base/constraints/constraints.hpp"
16#include "arene/base/contracts/contract.hpp"
17#include "arene/base/detail/exceptions.hpp"
18#include "arene/base/detail/raw_c_string.hpp"
19#include "arene/base/stdlib_choice/cstddef.hpp"
20#include "arene/base/stdlib_choice/enable_if.hpp"
21#include "arene/base/stdlib_choice/ignore.hpp"
22#include "arene/base/strings/inline_string.hpp"
23#include "arene/base/strings/string_view.hpp"
37namespace inline_string_reference_detail {
40struct const_operations {
43 using string_base = inline_string_detail::inline_string_base;
45 using string_ptr = string_base
const*;
47 using size_type = string_base::size_type;
49 using const_iterator = string_base::const_iterator;
54 using data_op_type = detail::raw_c_string (*)(string_ptr);
56 using size_op_type = size_type (*)(string_ptr);
58 using capacity_op_type = size_type (*)(string_ptr);
60 using empty_op_type =
bool (*)(string_ptr);
62 using element_op_type = detail::character
const& (*)(string_ptr, size_type);
64 using at_op_type = detail::character
const& (*)(string_ptr, size_type);
66 using front_op_type = detail::character
const& (*)(string_ptr);
68 using back_op_type = detail::character
const& (*)(string_ptr);
70 using begin_op_type = const_iterator (*)(string_ptr);
72 using end_op_type = const_iterator (*)(string_ptr);
74 using to_string_view_op_type = string_view (*)(string_ptr);
82 capacity_op_type capacity;
86 element_op_type element;
98 to_string_view_op_type to_string_view;
103template <std::size_t MaxSize>
104class const_operations_impl {
107 using this_string = inline_string<MaxSize>;
111 using string_ptr = const_operations::string_ptr;
113 using size_type = const_operations::size_type;
115 using const_iterator = const_operations::const_iterator;
121 static constexpr auto string(string_ptr ptr)
noexcept -> this_string
const* {
122 return static_cast<inline_string<MaxSize>
const*>(ptr);
128 static constexpr auto do_data(string_ptr ptr)
noexcept -> detail::raw_c_string {
return string(ptr)->data(); }
133 static constexpr auto do_size(string_ptr ptr)
noexcept -> size_type {
return string(ptr)->size(); }
138 static constexpr auto do_capacity(string_ptr ptr)
noexcept -> size_type {
return string(ptr)->capacity(); }
143 static constexpr auto do_empty(string_ptr ptr)
noexcept ->
bool {
return string(ptr)->empty(); }
149 static constexpr auto do_element(string_ptr ptr, size_type index)
noexcept -> detail::character
const& {
150 return (*string(ptr))[index];
158 bool AreExceptionsEnabled = detail::are_exceptions_enabled::value,
159 constraints<std::enable_if_t<AreExceptionsEnabled>> =
nullptr>
160 static constexpr auto do_at(string_ptr ptr, size_type index) -> detail::character
const& {
161 return string(ptr)->at(index);
167 bool AreExceptionsEnabled = detail::are_exceptions_enabled::value,
168 constraints<std::enable_if_t<!AreExceptionsEnabled>> =
nullptr>
169 ARENE_NORETURN
static auto do_at(string_ptr, std::size_t) -> detail::character
const& {
170 ARENE_INVARIANT_UNREACHABLE(
"do_at() called when exceptions are disabled");
176 static constexpr auto do_front(string_ptr ptr)
noexcept -> detail::character
const& {
return string(ptr)->front(); }
180 static constexpr auto do_back(string_ptr ptr)
noexcept -> detail::character
const& {
return string(ptr)->back(); }
185 static constexpr auto do_begin(string_ptr ptr)
noexcept -> const_iterator {
return string(ptr)->begin(); }
189 static constexpr auto do_end(string_ptr ptr)
noexcept -> const_iterator {
return string(ptr)->end(); }
194 static constexpr auto do_to_string_view(string_ptr ptr)
noexcept -> string_view {
195 return {do_data(ptr), do_size(ptr)};
201template <std::size_t MaxSize>
202extern constexpr const_operations const_string_operations{
203 &const_operations_impl<MaxSize>::do_data,
204 &const_operations_impl<MaxSize>::do_size,
205 &const_operations_impl<MaxSize>::do_capacity,
206 &const_operations_impl<MaxSize>::do_empty,
207 &const_operations_impl<MaxSize>::do_element,
208 &const_operations_impl<MaxSize>::do_at,
209 &const_operations_impl<MaxSize>::do_front,
210 &const_operations_impl<MaxSize>::do_back,
211 &const_operations_impl<MaxSize>::do_begin,
212 &const_operations_impl<MaxSize>::do_end,
213 &const_operations_impl<MaxSize>::do_to_string_view,
219 using string_base = inline_string_detail::inline_string_base;
221 using string_ptr = string_base*;
224 using size_type = string_base::size_type;
226 using iterator = string_base::iterator;
228 using const_iterator = string_base::const_iterator;
233 using element_op_type = detail::character& (*)(string_ptr, size_type);
235 using at_op_type = detail::character& (*)(string_ptr, size_type);
237 using front_op_type = detail::character& (*)(string_ptr);
239 using back_op_type = detail::character& (*)(string_ptr);
241 using begin_op_type = iterator (*)(string_ptr);
243 using end_op_type = iterator (*)(string_ptr);
245 using to_string_view_op_type = string_view (*)(string_ptr);
247 using assign_op_type = string_ptr (*)(string_ptr, string_view);
249 using append_op_type = string_ptr (*)(string_ptr, string_view);
251 using append_count_char_op_type = string_ptr (*)(string_ptr, size_type, detail::character);
253 using erase_op_type = string_ptr (*)(string_ptr, size_type, size_type);
255 using erase_it_op_type = iterator (*)(string_ptr, const_iterator, const_iterator);
259 const_operations
const* const_ops;
261 element_op_type element;
273 to_string_view_op_type to_string_view;
275 assign_op_type assign;
277 append_op_type append;
279 append_count_char_op_type append_count_char;
283 erase_it_op_type erase_it;
288template <std::size_t MaxSize>
289class operations_impl {
292 using this_string = inline_string<MaxSize>;
294 using string_ptr = inline_string_detail::inline_string_base*;
298 using size_type = operations::size_type;
300 using iterator = operations::iterator;
302 using const_iterator = operations::const_iterator;
308 static constexpr auto string(string_ptr ptr)
noexcept -> this_string* {
309 return static_cast<inline_string<MaxSize>*>(ptr);
316 static constexpr auto do_element(string_ptr ptr, size_type index)
noexcept -> detail::character& {
317 return (*string(ptr))[index];
325 bool AreExceptionsEnabled = detail::are_exceptions_enabled::value,
326 constraints<std::enable_if_t<AreExceptionsEnabled>> =
nullptr>
327 static constexpr auto do_at(string_ptr ptr, size_type index) -> detail::character& {
328 return string(ptr)->at(index);
334 bool AreExceptionsEnabled = detail::are_exceptions_enabled::value,
335 constraints<std::enable_if_t<!AreExceptionsEnabled>> =
nullptr>
336 ARENE_NORETURN
static auto do_at(string_ptr, std::size_t) -> detail::character& {
337 ARENE_INVARIANT_UNREACHABLE(
"do_at() called when exceptions are disabled");
343 static constexpr auto do_front(string_ptr ptr)
noexcept -> detail::character& {
return string(ptr)->front(); }
347 static constexpr auto do_back(string_ptr ptr)
noexcept -> detail::character& {
return string(ptr)->back(); }
352 static constexpr auto do_begin(string_ptr ptr)
noexcept -> iterator {
return string(ptr)->begin(); }
356 static constexpr auto do_end(string_ptr ptr)
noexcept -> iterator {
return string(ptr)->end(); }
361 static constexpr auto do_to_string_view(string_ptr ptr)
noexcept -> string_view {
362 return {string(ptr)->data(), string(ptr)->size()};
369 static constexpr auto do_assign(string_ptr ptr, string_view rhs)
noexcept -> string_ptr {
370 return &string(ptr)->assign(rhs);
377 static constexpr auto do_append(string_ptr ptr, string_view rhs)
noexcept -> string_ptr {
378 return &string(ptr)->append(rhs);
385 static constexpr auto do_append_count_char(string_ptr ptr, size_type count, detail::character chr)
noexcept
387 return &string(ptr)->append(count, chr);
395 static constexpr auto do_erase(string_ptr ptr, size_type pos, size_type count)
noexcept -> string_ptr {
396 return &string(ptr)->erase(pos, count);
403 static constexpr auto do_erase_it(string_ptr ptr, const_iterator first, const_iterator last)
noexcept -> iterator {
404 return string(ptr)->erase(first, last);
410template <std::size_t MaxSize>
411extern constexpr operations string_operations{
412 &const_string_operations<MaxSize>,
413 &operations_impl<MaxSize>::do_element,
414 &operations_impl<MaxSize>::do_at,
415 &operations_impl<MaxSize>::do_front,
416 &operations_impl<MaxSize>::do_back,
417 &operations_impl<MaxSize>::do_begin,
418 &operations_impl<MaxSize>::do_end,
419 &operations_impl<MaxSize>::do_to_string_view,
420 &operations_impl<MaxSize>::do_assign,
421 &operations_impl<MaxSize>::do_append,
422 &operations_impl<MaxSize>::do_append_count_char,
423 &operations_impl<MaxSize>::do_erase,
424 &operations_impl<MaxSize>::do_erase_it,
430 explicit ref_passkey() =
default;
442 inline_string_detail::inline_string_base* string_ptr_;
444 inline_string_reference_detail::operations
const* op_ptrs_;
629 inline_string_detail::inline_string_base
const* string_ptr_;
631 inline_string_reference_detail::const_operations
const* const_op_ptrs_;
A const reference class to an inline_string object, with size-erased type.
Definition inline_string_reference.hpp:627
A reference class to an inline_string object, with size-erased type.
Definition inline_string_reference.hpp:440
Definition array_exceptions_disabled.cpp:11
Copyright 2026, Toyota Motor Corporation.
Definition array_exceptions_disabled.cpp:10