tetl 0.1.0
Embedded Template Library
Loading...
Searching...
No Matches
dynamic_array.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSL-1.0
2// SPDX-FileCopyrightText: Copyright (C) 2024 Tobias Hienzsch
3
4#ifndef TETL_ARRAY_DYNAMIC_ARRAY_HPP
5#define TETL_ARRAY_DYNAMIC_ARRAY_HPP
6
7#include <etl/_config/all.hpp>
8
9#include <etl/_cstddef/ptrdiff_t.hpp>
10#include <etl/_cstddef/size_t.hpp>
11#include <etl/_iterator/next.hpp>
12#include <etl/_memory/allocator_traits.hpp>
13#include <etl/_memory/ranges_destroy.hpp>
14#include <etl/_memory/uninitialized_fill.hpp>
15#include <etl/_type_traits/is_default_constructible.hpp>
16#include <etl/_utility/exchange.hpp>
17#include <etl/_utility/move.hpp>
18
19namespace etl {
20
21/// \headerfile etl/array.hpp
22/// \ingroup array
23template <typename T, typename Allocator>
25 using value_type = T;
26 using allocator_type = Allocator;
27 using size_type = etl::size_t;
28 using difference_type = etl::ptrdiff_t;
29 using pointer = T*;
30 using const_pointer = T const*;
31
32 dynamic_array()
33 requires(etl::is_default_constructible_v<Allocator>)
34 = default;
35
36 explicit dynamic_array(Allocator alloc)
37 : _alloc{etl::move(alloc)}
38 {
39 }
40
41 dynamic_array(etl::size_t n, T const& value, Allocator alloc = Allocator())
42 : _size{n}
43 , _alloc{etl::move(alloc)}
44 {
45 _ptr = etl::allocator_traits<Allocator>::allocate(_alloc, n);
46 etl::uninitialized_fill(begin(), end(), value);
47 }
48
49 explicit dynamic_array(etl::size_t n, Allocator alloc = Allocator())
50 : dynamic_array{n, T(), etl::move(alloc)}
51 {
52 }
53
54 dynamic_array(dynamic_array const& other) = delete;
55 auto operator=(dynamic_array const& other) -> dynamic_array& = delete;
56
57 dynamic_array(dynamic_array&& other) noexcept
58 : _ptr{etl::exchange(other._ptr, nullptr)}
59 , _size{etl::exchange(other._size, etl::size_t(0))}
60 , _alloc{etl::exchange(other._alloc, Allocator{})}
61 {
62 }
63
64 auto operator=(dynamic_array&& other) noexcept -> dynamic_array&
65 {
66 _ptr = etl::exchange(other._ptr, nullptr);
67 _size = etl::exchange(other._size, etl::size_t(0));
68 _alloc = etl::exchange(other._alloc, Allocator{});
69 return *this;
70 }
71
73 {
74 etl::ranges::destroy(*this);
75 etl::allocator_traits<Allocator>::deallocate(_alloc, _ptr, size());
76 }
77
78 [[nodiscard]] auto size() -> etl::size_t
79 {
80 return _size;
81 }
82
83 [[nodiscard]] auto size() const -> etl::size_t
84 {
85 return _size;
86 }
87
88 [[nodiscard]] auto data() -> T*
89 {
90 return _ptr;
91 }
92
93 [[nodiscard]] auto data() const -> T const*
94 {
95 return _ptr;
96 }
97
98 [[nodiscard]] auto begin() -> T*
99 {
100 return _ptr;
101 }
102
103 [[nodiscard]] auto begin() const -> T const*
104 {
105 return _ptr;
106 }
107
108 [[nodiscard]] auto end() -> T*
109 {
110 return etl::next(_ptr, static_cast<etl::ptrdiff_t>(size()));
111 }
112
113 [[nodiscard]] auto end() const -> T const*
114 {
115 return etl::next(_ptr, static_cast<etl::ptrdiff_t>(size()));
116 }
117
118private:
119 T* _ptr{nullptr};
120 etl::size_t _size{0};
121 TETL_NO_UNIQUE_ADDRESS Allocator _alloc;
122};
123
124} // namespace etl
125
126#endif // TETL_ARRAY_DYNAMIC_ARRAY_HPP
Definition ranges_in_fun_result.hpp:12
Definition adjacent_find.hpp:9
Definition allocator_traits.hpp:88
Definition dynamic_array.hpp:24
auto data() -> T *
Definition dynamic_array.hpp:88
auto begin() const -> T const *
Definition dynamic_array.hpp:103
auto end() const -> T const *
Definition dynamic_array.hpp:113
dynamic_array(dynamic_array const &other)=delete
auto operator=(dynamic_array const &other) -> dynamic_array &=delete
~dynamic_array()
Definition dynamic_array.hpp:72
auto data() const -> T const *
Definition dynamic_array.hpp:93
auto operator=(dynamic_array &&other) noexcept -> dynamic_array &
Definition dynamic_array.hpp:64
auto size() -> etl::size_t
Definition dynamic_array.hpp:78
dynamic_array(etl::size_t n, T const &value, Allocator alloc=Allocator())
Definition dynamic_array.hpp:41
auto end() -> T *
Definition dynamic_array.hpp:108
auto begin() -> T *
Definition dynamic_array.hpp:98
dynamic_array(dynamic_array &&other) noexcept
Definition dynamic_array.hpp:57
auto size() const -> etl::size_t
Definition dynamic_array.hpp:83
dynamic_array(Allocator alloc)
Definition dynamic_array.hpp:36
dynamic_array(etl::size_t n, Allocator alloc=Allocator())
Definition dynamic_array.hpp:49