41 c_array(Tp* _base,
size_t _size)
47 c_array(
const c_array&) =
default;
48 c_array(c_array&&) noexcept = default;
49 c_array& operator=(const c_array&) = default;
50 c_array& operator=(c_array&&) noexcept = default;
53 size_t size()
const {
return m_size; }
56 Tp& operator[](
size_t i) {
return m_base[i]; }
59 const Tp& operator[](
size_t i)
const {
return m_base[i]; }
64 if(i < m_size)
return m_base[i];
65 throw std::out_of_range(std::string{
typeid(*this).name()} + std::to_string(i) +
66 " exceeds size " + std::to_string(m_size));
70 const Tp& at(
size_t i)
const
72 if(i < m_size)
return m_base[i];
73 throw std::out_of_range(std::string{
typeid(*this).name()} + std::to_string(i) +
74 " exceeds size " + std::to_string(m_size));
78 c_array<Tp> slice(
size_t start,
size_t end) {
return c_array<Tp>(&m_base[start], end - start); }
86 void pop_back() { --m_size; }
88 operator Tp*()
const {
return m_base; }
91 template <
typename Up>
100 void operator++() { ++m_ptr; }
101 void operator++(
int) { m_ptr++; }
104 Up& operator*()
const {
return *m_ptr; }
107 bool operator==(
const iterator& rhs)
const {
return m_ptr == rhs.m_ptr; }
108 bool operator!=(
const iterator& rhs)
const {
return m_ptr != rhs.m_ptr; }
115 iterator<Tp> begin() {
return iterator<Tp>{m_base}; }
116 iterator<const Tp> begin()
const {
return iterator<const Tp>{m_base}; }
119 iterator<Tp> end() {
return iterator<Tp>{&m_base[m_size]}; }
120 iterator<const Tp> end()
const {
return iterator<const Tp>{&m_base[m_size]}; }
123 Tp* m_base =
nullptr;
128template <
typename Tp>
130make_c_array(Tp* base,
size_t size)
132 return c_array<Tp>(base, size);