5#ifndef INCLUDE_GUARD_ARENE_BASE_ARENE_BASE_INLINE_CONTAINER_VECTOR_REFERENCE_HPP_
6#define INCLUDE_GUARD_ARENE_BASE_ARENE_BASE_INLINE_CONTAINER_VECTOR_REFERENCE_HPP_
9#include "arene/base/compiler_support/attributes.hpp"
10#include "arene/base/compiler_support/cpp14_inline.hpp"
11#include "arene/base/constraints/constraints.hpp"
12#include "arene/base/contracts/contract.hpp"
13#include "arene/base/detail/exceptions.hpp"
14#include "arene/base/inline_container/external_vector.hpp"
15#include "arene/base/inline_container/vector.hpp"
16#include "arene/base/stdlib_choice/cstddef.hpp"
17#include "arene/base/stdlib_choice/enable_if.hpp"
18#include "arene/base/stdlib_choice/ignore.hpp"
19#include "arene/base/stdlib_choice/is_base_of.hpp"
20#include "arene/base/utility/make_subrange.hpp"
30class const_vector_reference;
33namespace vector_reference_detail {
38struct const_operations {
40 using vector_base = inline_vector_detail::vector_base<T>;
42 using const_iterator =
typename vector_base::const_iterator;
44 using vector_ptr = vector_base
const*;
47 using data_op_type = T
const* (*)(vector_ptr);
49 using size_op_type = std::size_t (*)(vector_ptr);
51 using capacity_op_type = std::size_t (*)(vector_ptr);
53 using empty_op_type =
bool (*)(vector_ptr);
55 using element_op_type = T
const& (*)(vector_ptr, std::size_t);
57 using at_op_type = T
const& (*)(vector_ptr, std::size_t);
59 using front_op_type = T
const& (*)(vector_ptr);
61 using back_op_type = T
const& (*)(vector_ptr);
63 using begin_op_type = const_iterator (*)(vector_ptr);
65 using end_op_type = const_iterator (*)(vector_ptr);
73 capacity_op_type capacity;
77 element_op_type element;
95 using vector_base = inline_vector_detail::vector_base<T>;
97 using iterator =
typename vector_base::iterator;
99 using const_iterator =
typename vector_base::const_iterator;
101 using vector_ptr = vector_base*;
104 using data_op_type = T* (*)(vector_ptr);
106 using element_op_type = T& (*)(vector_ptr, std::size_t);
108 using at_op_type = T& (*)(vector_ptr, std::size_t);
110 using front_op_type = T& (*)(vector_ptr);
112 using back_op_type = T& (*)(vector_ptr);
114 using begin_op_type = iterator (*)(vector_ptr);
116 using end_op_type = iterator (*)(vector_ptr);
118 using push_back_op_type =
void (*)(vector_ptr, T
const&);
120 using insert_op_type = iterator (*)(vector_ptr, const_iterator, T
const&);
122 using erase_op_type = iterator (*)(vector_ptr, const_iterator);
124 using erase_range_op_type = iterator (*)(vector_ptr, const_iterator, const_iterator);
126 using pop_back_op_type =
void (*)(vector_ptr);
128 using clear_op_type =
void (*)(vector_ptr);
130 using resize_op_type =
void (*)(vector_ptr, std::size_t);
134 const_operations<T>
const* const_ops;
138 element_op_type element;
150 push_back_op_type push_back;
152 insert_op_type insert;
156 erase_range_op_type erase_range;
158 pop_back_op_type pop_back;
162 resize_op_type resize;
167template <
class Vector>
168class const_operations_impl {
171 using value_type =
typename Vector::value_type;
174 using vector_ptr = inline_vector_detail::vector_base<value_type>
const*;
180 static constexpr auto vector(vector_ptr vec)
noexcept -> Vector
const* {
return static_cast<Vector
const*>(vec); }
186 static constexpr auto do_data(vector_ptr ptr)
noexcept -> value_type
const* {
return vector(ptr)->data(); }
190 static constexpr auto do_size(vector_ptr ptr)
noexcept -> std::size_t {
return vector(ptr)->size(); }
194 static constexpr auto do_capacity(vector_ptr ptr)
noexcept -> std::size_t {
return vector(ptr)->capacity(); }
198 static constexpr auto do_empty(vector_ptr ptr)
noexcept ->
bool {
return vector(ptr)->empty(); }
204 static constexpr auto do_element(vector_ptr ptr, std::size_t index)
noexcept -> value_type
const& {
205 return (*vector(ptr))[index];
213 bool AreExceptionsEnabled = detail::are_exceptions_enabled::value,
214 constraints<std::enable_if_t<AreExceptionsEnabled>> =
nullptr>
215 static constexpr auto do_at(vector_ptr ptr, std::size_t index) -> value_type
const& {
216 return vector(ptr)->at(index);
221 bool AreExceptionsEnabled = detail::are_exceptions_enabled::value,
222 constraints<std::enable_if_t<!AreExceptionsEnabled>> =
nullptr>
223 ARENE_NORETURN
static constexpr auto do_at(vector_ptr, std::size_t) -> value_type
const& {
224 ARENE_INVARIANT_UNREACHABLE(
"do_at() called when exceptions are disabled");
230 static constexpr auto do_front(vector_ptr ptr)
noexcept -> value_type
const& {
return vector(ptr)->front(); }
235 static constexpr auto do_back(vector_ptr ptr)
noexcept -> value_type
const& {
return vector(ptr)->back(); }
239 static constexpr auto do_begin(vector_ptr ptr)
noexcept ->
typename Vector::const_iterator {
240 return vector(ptr)->begin();
245 static constexpr auto do_end(vector_ptr ptr)
noexcept ->
typename Vector::const_iterator {
246 return vector(ptr)->end();
251template <
class Vector>
252extern constexpr const_operations<
typename Vector::value_type> const_vector_operations{
253 &const_operations_impl<Vector>::do_data,
254 &const_operations_impl<Vector>::do_size,
255 &const_operations_impl<Vector>::do_capacity,
256 &const_operations_impl<Vector>::do_empty,
257 &const_operations_impl<Vector>::do_element,
258 &const_operations_impl<Vector>::
template do_at<>,
259 &const_operations_impl<Vector>::do_front,
260 &const_operations_impl<Vector>::do_back,
261 &const_operations_impl<Vector>::do_begin,
262 &const_operations_impl<Vector>::do_end
267template <
typename Vector>
268class operations_impl {
271 using value_type =
typename Vector::value_type;
274 using iterator =
typename Vector::iterator;
276 using const_iterator =
typename Vector::const_iterator;
278 using vector_ptr = inline_vector_detail::vector_base<value_type>*;
284 static constexpr auto vector(vector_ptr vec)
noexcept -> Vector* {
return static_cast<Vector*>(vec); }
290 static constexpr auto do_data(vector_ptr ptr)
noexcept -> value_type* {
return vector(ptr)->data(); }
296 static constexpr auto do_element(vector_ptr ptr, std::size_t index)
noexcept -> value_type& {
297 return (*vector(ptr))[index];
304 bool AreExceptionsEnabled = detail::are_exceptions_enabled::value,
305 constraints<std::enable_if_t<AreExceptionsEnabled>> =
nullptr>
306 static constexpr auto do_at(vector_ptr ptr, std::size_t index) -> value_type& {
307 return vector(ptr)->at(index);
312 bool AreExceptionsEnabled = detail::are_exceptions_enabled::value,
313 constraints<std::enable_if_t<!AreExceptionsEnabled>> =
nullptr>
314 ARENE_NORETURN
static constexpr auto do_at(vector_ptr, std::size_t) -> value_type& {
315 ARENE_INVARIANT_UNREACHABLE(
"do_at() called when exceptions are disabled");
321 static constexpr auto do_front(vector_ptr ptr)
noexcept -> value_type& {
return vector(ptr)->front(); }
325 static constexpr auto do_back(vector_ptr ptr)
noexcept -> value_type& {
return vector(ptr)->back(); }
330 static constexpr auto do_begin(vector_ptr ptr)
noexcept -> iterator {
return vector(ptr)->begin(); }
334 static constexpr auto do_end(vector_ptr ptr)
noexcept -> iterator {
return vector(ptr)->end(); }
339 static constexpr void do_push_back(vector_ptr ptr, value_type
const& value)
noexcept {
340 vector(ptr)->push_back(value);
347 static constexpr auto do_insert(vector_ptr ptr, const_iterator pos, value_type
const& element)
noexcept -> iterator {
348 return vector(ptr)->insert(pos, element);
355 static constexpr auto do_erase(vector_ptr ptr, const_iterator pos)
noexcept -> iterator {
356 return vector(ptr)->erase(pos);
363 static constexpr auto do_erase_range(vector_ptr ptr, const_iterator first, const_iterator last)
noexcept -> iterator {
364 return vector(ptr)->erase(first, last);
369 static constexpr void do_pop_back(vector_ptr ptr)
noexcept { vector(ptr)->pop_back(); }
373 static constexpr void do_clear(vector_ptr ptr)
noexcept { vector(ptr)->clear(); }
380 static constexpr void do_resize(vector_ptr ptr, std::size_t count)
noexcept { vector(ptr)->resize(count); }
384template <
class Vector>
385extern constexpr operations<
typename Vector::value_type> vector_operations{
386 &const_vector_operations<Vector>,
387 &operations_impl<Vector>::do_data,
388 &operations_impl<Vector>::do_element,
389 &operations_impl<Vector>::
template do_at<>,
390 &operations_impl<Vector>::do_front,
391 &operations_impl<Vector>::do_back,
392 &operations_impl<Vector>::do_begin,
393 &operations_impl<Vector>::do_end,
394 &operations_impl<Vector>::do_push_back,
395 &operations_impl<Vector>::do_insert,
396 &operations_impl<Vector>::do_erase,
397 &operations_impl<Vector>::do_erase_range,
398 &operations_impl<Vector>::do_pop_back,
399 &operations_impl<Vector>::do_clear,
400 &operations_impl<Vector>::do_resize
407 explicit ivref_passkey() =
default;
409 template <
typename T>
410 friend class ::
arene::
base::const_vector_reference;
423 inline_vector_detail::vector_base<T>* vector_ptr_;
425 vector_reference_detail::operations<T>
const* op_ptrs_;
429 using value_type = T;
440 template <std::size_t Capacity>
443 op_ptrs_(&vector_reference_detail::vector_operations<inline_vector<T, Capacity>>) {}
597class const_vector_reference {
599 inline_vector_detail::vector_base<T>
const* vector_ptr_;
601 vector_reference_detail::const_operations<T>
const* op_ptrs_;
605 using value_type = T;
607 using size_type = std::size_t;
609 using const_iterator =
typename inline_vector_detail::vector_base<T>::const_iterator;
611 using iterator = const_iterator;
616 template <std::size_t Capacity>
617 constexpr explicit const_vector_reference(inline_vector<T, Capacity>
const& vec)
619 op_ptrs_(&vector_reference_detail::const_vector_operations<inline_vector<T, Capacity>>) {}
623 constexpr explicit const_vector_reference(external_vector<T>
const& vec)
625 op_ptrs_(&vector_reference_detail::const_vector_operations<external_vector<T>>) {}
629 constexpr explicit const_vector_reference(vector_reference<T>
const ref)
630 : vector_ptr_(ref.get_vector_ptr(vector_reference_detail::ivref_passkey{})),
631 op_ptrs_(ref.const_operations_ptr(vector_reference_detail::ivref_passkey{})) {}
635 constexpr auto data()
const noexcept -> T
const* {
return op_ptrs_->data(vector_ptr_); }
639 constexpr auto size()
const noexcept -> size_type {
return op_ptrs_->size(vector_ptr_); }
643 constexpr auto capacity()
const noexcept -> size_type {
return op_ptrs_->capacity(vector_ptr_); }
646 constexpr auto max_size()
const noexcept -> size_type {
return op_ptrs_->capacity(vector_ptr_); }
650 constexpr auto empty()
const noexcept ->
bool {
return op_ptrs_->empty(vector_ptr_); }
656 constexpr auto operator[](size_type index)
const noexcept -> T
const& {
657 return op_ptrs_->element(vector_ptr_, index);
665 bool AreExceptionsEnabled = detail::are_exceptions_enabled::value,
666 constraints<std::enable_if_t<AreExceptionsEnabled>> =
nullptr>
667 constexpr auto at(size_type index)
const -> T
const& {
668 return op_ptrs_->at(vector_ptr_, index);
674 constexpr auto front()
const noexcept -> T
const& {
return op_ptrs_->front(vector_ptr_); }
678 constexpr auto back()
const noexcept -> T
const& {
return op_ptrs_->back(vector_ptr_); }
682 constexpr auto begin()
const noexcept -> const_iterator {
return op_ptrs_->begin(vector_ptr_); }
685 constexpr auto end()
const noexcept -> const_iterator {
return op_ptrs_->end(vector_ptr_); }
688 constexpr auto cbegin()
const noexcept -> const_iterator {
return op_ptrs_->begin(vector_ptr_); }
691 constexpr auto cend()
const noexcept -> const_iterator {
return op_ptrs_->end(vector_ptr_); }
696namespace vector_reference_detail {
701class make_const_vector_reference_fn {
714 constraints<std::enable_if_t<
715 std::is_base_of<inline_vector_detail::vector_base<
typename Vector::value_type>, Vector>::value>> =
nullptr>
716 constexpr auto operator()(Vector
const& vec)
const noexcept -> const_vector_reference<
typename Vector::value_type> {
717 return const_vector_reference<
typename Vector::value_type>{vec};
735 constraints<std::enable_if_t<
736 std::is_base_of<inline_vector_detail::vector_base<
typename Vector::value_type>, Vector>::value>> =
nullptr>
737 constexpr auto operator()(Vector
const&& vec)
const noexcept =
delete;
745class make_vector_reference_fn : make_const_vector_reference_fn {
758 constraints<std::enable_if_t<
759 std::is_base_of<inline_vector_detail::vector_base<
typename Vector::value_type>, Vector>::value>> =
nullptr>
760 constexpr auto operator()(Vector& vec)
const noexcept -> vector_reference<
typename Vector::value_type> {
761 return vector_reference<
typename Vector::value_type>{vec};
765 using make_const_vector_reference_fn::operator();
786ARENE_CPP14_INLINE_VARIABLE(vector_reference_detail::make_vector_reference_fn, make_vector_reference);
795ARENE_CPP14_INLINE_VARIABLE(vector_reference_detail::make_const_vector_reference_fn, make_const_vector_reference);
809using const_inline_vector_reference = const_vector_reference<T>;
A reference class to an inline_vector object, with size-erased type.
Definition vector_reference.hpp:421
Definition array_exceptions_disabled.cpp:11
Copyright 2026, Toyota Motor Corporation.
Definition array_exceptions_disabled.cpp:10