tetl 0.1.0
Embedded Template Library
Loading...
Searching...
No Matches
uninitialized_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_UNINITIALIZED_ARRAY_HPP
5#define TETL_ARRAY_UNINITIALIZED_ARRAY_HPP
6
7#include <etl/_config/all.hpp>
8
9#include <etl/_array/c_array.hpp>
10#include <etl/_cstddef/size_t.hpp>
11#include <etl/_iterator/data.hpp>
12#include <etl/_iterator/size.hpp>
13#include <etl/_type_traits/is_trivially_default_constructible.hpp>
14#include <etl/_type_traits/is_trivially_destructible.hpp>
15
16namespace etl {
17
18namespace detail {
19template <typename T>
20concept sufficiently_trivial = etl::is_trivially_default_constructible_v<T> and etl::is_trivially_destructible_v<T>;
21} // namespace detail
22
23/// \headerfile etl/array.hpp
24/// \ingroup array
25template <typename T, etl::size_t Size>
27 using value_type = T;
28
29 constexpr uninitialized_array() = default;
30
31 [[nodiscard]] constexpr auto data() const noexcept -> T const*
32 {
33 return reinterpret_cast<T const*>(_storage);
34 }
35
36 [[nodiscard]] constexpr auto data() noexcept -> T*
37 {
38 return reinterpret_cast<T*>(_storage);
39 }
40
41 [[nodiscard]] static constexpr auto size() noexcept -> etl::size_t
42 {
43 return Size;
44 }
45
46private:
47 alignas(T) TETL_NO_UNIQUE_ADDRESS etl::c_array<char, sizeof(T) * Size> _storage;
48};
49
50template <etl::detail::sufficiently_trivial T, etl::size_t Size>
51 requires(Size != 0)
52struct uninitialized_array<T, Size> {
53 using value_type = T;
54
55 constexpr uninitialized_array() = default;
56
57 [[nodiscard]] constexpr auto data() const noexcept -> T const*
58 {
59 return static_cast<T const*>(_storage);
60 }
61
62 [[nodiscard]] constexpr auto data() noexcept -> T*
63 {
64 return static_cast<T*>(_storage);
65 }
66
67 [[nodiscard]] static constexpr auto size() noexcept -> etl::size_t
68 {
69 return Size;
70 }
71
72private:
73 TETL_NO_UNIQUE_ADDRESS etl::c_array<T, Size> _storage;
74};
75
76template <typename T, etl::size_t Size>
77 requires(Size == 0)
78struct uninitialized_array<T, Size> {
79 using value_type = T;
80
81 constexpr uninitialized_array() = default;
82
83 [[nodiscard]] constexpr auto data() const noexcept -> T const*
84 {
85 return nullptr;
86 }
87
88 [[nodiscard]] constexpr auto data() noexcept -> T*
89 {
90 return nullptr;
91 }
92
93 [[nodiscard]] static constexpr auto size() noexcept -> etl::size_t
94 {
95 return 0;
96 }
97};
98
99} // namespace etl
100
101#endif // TETL_ARRAY_UNINITIALIZED_ARRAY_HPP
Definition adjacent_find.hpp:9
constexpr uninitialized_array()=default
constexpr auto data() const noexcept -> T const *
Definition uninitialized_array.hpp:57
constexpr auto data() noexcept -> T *
Definition uninitialized_array.hpp:62
static constexpr auto size() noexcept -> etl::size_t
Definition uninitialized_array.hpp:67
Definition uninitialized_array.hpp:26
constexpr uninitialized_array()=default
constexpr auto data() const noexcept -> T const *
Definition uninitialized_array.hpp:31
constexpr auto data() noexcept -> T *
Definition uninitialized_array.hpp:36
static constexpr auto size() noexcept -> etl::size_t
Definition uninitialized_array.hpp:41