1*bb722a7dSDimitry Andric //===-- A self contained equivalent of std::array ---------------*- C++ -*-===// 2*bb722a7dSDimitry Andric // 3*bb722a7dSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*bb722a7dSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*bb722a7dSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*bb722a7dSDimitry Andric // 7*bb722a7dSDimitry Andric //===----------------------------------------------------------------------===// 8*bb722a7dSDimitry Andric 9*bb722a7dSDimitry Andric #ifndef LLVM_LIBC_SRC___SUPPORT_CPP_ARRAY_H 10*bb722a7dSDimitry Andric #define LLVM_LIBC_SRC___SUPPORT_CPP_ARRAY_H 11*bb722a7dSDimitry Andric 12*bb722a7dSDimitry Andric #include "src/__support/CPP/iterator.h" // reverse_iterator 13*bb722a7dSDimitry Andric #include "src/__support/macros/attributes.h" 14*bb722a7dSDimitry Andric #include "src/__support/macros/config.h" 15*bb722a7dSDimitry Andric #include <stddef.h> // For size_t. 16*bb722a7dSDimitry Andric 17*bb722a7dSDimitry Andric namespace LIBC_NAMESPACE_DECL { 18*bb722a7dSDimitry Andric namespace cpp { 19*bb722a7dSDimitry Andric 20*bb722a7dSDimitry Andric template <class T, size_t N> struct array { 21*bb722a7dSDimitry Andric static_assert(N != 0, 22*bb722a7dSDimitry Andric "Cannot create a LIBC_NAMESPACE::cpp::array of size 0."); 23*bb722a7dSDimitry Andric 24*bb722a7dSDimitry Andric T Data[N]; 25*bb722a7dSDimitry Andric using value_type = T; 26*bb722a7dSDimitry Andric using iterator = T *; 27*bb722a7dSDimitry Andric using const_iterator = const T *; 28*bb722a7dSDimitry Andric using reverse_iterator = cpp::reverse_iterator<iterator>; 29*bb722a7dSDimitry Andric using const_reverse_iterator = cpp::reverse_iterator<const_iterator>; 30*bb722a7dSDimitry Andric dataarray31*bb722a7dSDimitry Andric LIBC_INLINE constexpr T *data() { return Data; } dataarray32*bb722a7dSDimitry Andric LIBC_INLINE constexpr const T *data() const { return Data; } 33*bb722a7dSDimitry Andric frontarray34*bb722a7dSDimitry Andric LIBC_INLINE constexpr T &front() { return Data[0]; } frontarray35*bb722a7dSDimitry Andric LIBC_INLINE constexpr const T &front() const { return Data[0]; } 36*bb722a7dSDimitry Andric backarray37*bb722a7dSDimitry Andric LIBC_INLINE constexpr T &back() { return Data[N - 1]; } backarray38*bb722a7dSDimitry Andric LIBC_INLINE constexpr const T &back() const { return Data[N - 1]; } 39*bb722a7dSDimitry Andric 40*bb722a7dSDimitry Andric LIBC_INLINE constexpr T &operator[](size_t Index) { return Data[Index]; } 41*bb722a7dSDimitry Andric 42*bb722a7dSDimitry Andric LIBC_INLINE constexpr const T &operator[](size_t Index) const { 43*bb722a7dSDimitry Andric return Data[Index]; 44*bb722a7dSDimitry Andric } 45*bb722a7dSDimitry Andric sizearray46*bb722a7dSDimitry Andric LIBC_INLINE constexpr size_t size() const { return N; } 47*bb722a7dSDimitry Andric emptyarray48*bb722a7dSDimitry Andric LIBC_INLINE constexpr bool empty() const { return N == 0; } 49*bb722a7dSDimitry Andric beginarray50*bb722a7dSDimitry Andric LIBC_INLINE constexpr iterator begin() { return Data; } beginarray51*bb722a7dSDimitry Andric LIBC_INLINE constexpr const_iterator begin() const { return Data; } cbeginarray52*bb722a7dSDimitry Andric LIBC_INLINE constexpr const_iterator cbegin() const { return begin(); } 53*bb722a7dSDimitry Andric endarray54*bb722a7dSDimitry Andric LIBC_INLINE constexpr iterator end() { return Data + N; } endarray55*bb722a7dSDimitry Andric LIBC_INLINE constexpr const_iterator end() const { return Data + N; } cendarray56*bb722a7dSDimitry Andric LIBC_INLINE constexpr const_iterator cend() const { return end(); } 57*bb722a7dSDimitry Andric rbeginarray58*bb722a7dSDimitry Andric LIBC_INLINE constexpr reverse_iterator rbegin() { 59*bb722a7dSDimitry Andric return reverse_iterator{end()}; 60*bb722a7dSDimitry Andric } rbeginarray61*bb722a7dSDimitry Andric LIBC_INLINE constexpr const_reverse_iterator rbegin() const { 62*bb722a7dSDimitry Andric return const_reverse_iterator{end()}; 63*bb722a7dSDimitry Andric } crbeginarray64*bb722a7dSDimitry Andric LIBC_INLINE constexpr const_reverse_iterator crbegin() const { 65*bb722a7dSDimitry Andric return rbegin(); 66*bb722a7dSDimitry Andric } 67*bb722a7dSDimitry Andric rendarray68*bb722a7dSDimitry Andric LIBC_INLINE constexpr reverse_iterator rend() { 69*bb722a7dSDimitry Andric return reverse_iterator{begin()}; 70*bb722a7dSDimitry Andric } rendarray71*bb722a7dSDimitry Andric LIBC_INLINE constexpr const_reverse_iterator rend() const { 72*bb722a7dSDimitry Andric return const_reverse_iterator{begin()}; 73*bb722a7dSDimitry Andric } crendarray74*bb722a7dSDimitry Andric LIBC_INLINE constexpr const_reverse_iterator crend() const { return rend(); } 75*bb722a7dSDimitry Andric }; 76*bb722a7dSDimitry Andric 77*bb722a7dSDimitry Andric } // namespace cpp 78*bb722a7dSDimitry Andric } // namespace LIBC_NAMESPACE_DECL 79*bb722a7dSDimitry Andric 80*bb722a7dSDimitry Andric #endif // LLVM_LIBC_SRC___SUPPORT_CPP_ARRAY_H 81