Warning: This file is not a C or C++ file. It does not have highlighting.
1 | //===-- A self contained equivalent of std::array ---------------*- C++ -*-===// |
---|---|
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #ifndef LLVM_LIBC_SRC___SUPPORT_CPP_ARRAY_H |
10 | #define LLVM_LIBC_SRC___SUPPORT_CPP_ARRAY_H |
11 | |
12 | #include "src/__support/CPP/iterator.h" // reverse_iterator |
13 | #include "src/__support/macros/attributes.h" |
14 | #include "src/__support/macros/config.h" |
15 | #include <stddef.h> // For size_t. |
16 | |
17 | namespace LIBC_NAMESPACE_DECL { |
18 | namespace cpp { |
19 | |
20 | template <class T, size_t N> struct array { |
21 | static_assert(N != 0, |
22 | "Cannot create a LIBC_NAMESPACE::cpp::array of size 0."); |
23 | |
24 | T Data[N]; |
25 | using value_type = T; |
26 | using iterator = T *; |
27 | using const_iterator = const T *; |
28 | using reverse_iterator = cpp::reverse_iterator<iterator>; |
29 | using const_reverse_iterator = cpp::reverse_iterator<const_iterator>; |
30 | |
31 | LIBC_INLINE constexpr T *data() { return Data; } |
32 | LIBC_INLINE constexpr const T *data() const { return Data; } |
33 | |
34 | LIBC_INLINE constexpr T &front() { return Data[0]; } |
35 | LIBC_INLINE constexpr const T &front() const { return Data[0]; } |
36 | |
37 | LIBC_INLINE constexpr T &back() { return Data[N - 1]; } |
38 | LIBC_INLINE constexpr const T &back() const { return Data[N - 1]; } |
39 | |
40 | LIBC_INLINE constexpr T &operator[](size_t Index) { return Data[Index]; } |
41 | |
42 | LIBC_INLINE constexpr const T &operator[](size_t Index) const { |
43 | return Data[Index]; |
44 | } |
45 | |
46 | LIBC_INLINE constexpr size_t size() const { return N; } |
47 | |
48 | LIBC_INLINE constexpr bool empty() const { return N == 0; } |
49 | |
50 | LIBC_INLINE constexpr iterator begin() { return Data; } |
51 | LIBC_INLINE constexpr const_iterator begin() const { return Data; } |
52 | LIBC_INLINE constexpr const_iterator cbegin() const { return begin(); } |
53 | |
54 | LIBC_INLINE constexpr iterator end() { return Data + N; } |
55 | LIBC_INLINE constexpr const_iterator end() const { return Data + N; } |
56 | LIBC_INLINE constexpr const_iterator cend() const { return end(); } |
57 | |
58 | LIBC_INLINE constexpr reverse_iterator rbegin() { |
59 | return reverse_iterator{end()}; |
60 | } |
61 | LIBC_INLINE constexpr const_reverse_iterator rbegin() const { |
62 | return const_reverse_iterator{end()}; |
63 | } |
64 | LIBC_INLINE constexpr const_reverse_iterator crbegin() const { |
65 | return rbegin(); |
66 | } |
67 | |
68 | LIBC_INLINE constexpr reverse_iterator rend() { |
69 | return reverse_iterator{begin()}; |
70 | } |
71 | LIBC_INLINE constexpr const_reverse_iterator rend() const { |
72 | return const_reverse_iterator{begin()}; |
73 | } |
74 | LIBC_INLINE constexpr const_reverse_iterator crend() const { return rend(); } |
75 | }; |
76 | |
77 | } // namespace cpp |
78 | } // namespace LIBC_NAMESPACE_DECL |
79 | |
80 | #endif // LLVM_LIBC_SRC___SUPPORT_CPP_ARRAY_H |
81 |
Warning: This file is not a C or C++ file. It does not have highlighting.