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_UTILS_CPP_ARRAY_H
10 #define LLVM_LIBC_UTILS_CPP_ARRAY_H
11 
12 #include <stddef.h> // For size_t.
13 
14 namespace __llvm_libc {
15 namespace cpp {
16 
17 template <class T, size_t N> struct Array {
18   static_assert(N != 0, "Cannot create a __llvm_libc::cpp::Array of size 0.");
19 
20   T Data[N];
21 
22   using iterator = T *;
23   using const_iterator = const T *;
24 
dataArray25   constexpr T *data() { return Data; }
dataArray26   constexpr const T *data() const { return Data; }
27 
frontArray28   constexpr T &front() { return Data[0]; }
frontArray29   constexpr T &front() const { return Data[0]; }
30 
backArray31   constexpr T &back() { return Data[N - 1]; }
backArray32   constexpr T &back() const { return Data[N - 1]; }
33 
34   constexpr T &operator[](size_t Index) { return Data[Index]; }
35 
36   constexpr const T &operator[](size_t Index) const { return Data[Index]; }
37 
sizeArray38   constexpr size_t size() const { return N; }
39 
emptyArray40   constexpr bool empty() const { return N == 0; }
41 
beginArray42   constexpr iterator begin() { return Data; }
beginArray43   constexpr const_iterator begin() const { return Data; }
44 
endArray45   constexpr iterator end() { return Data + N; }
endArray46   const_iterator end() const { return Data + N; }
47 };
48 
49 } // namespace cpp
50 } // namespace __llvm_libc
51 
52 #endif // LLVM_LIBC_UTILS_CPP_ARRAY_H
53