1d3d498fbSGuillaume Chatelet //===-- A self contained equivalent of std::array ---------------*- C++ -*-===// 2d3d498fbSGuillaume Chatelet // 3d3d498fbSGuillaume Chatelet // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4d3d498fbSGuillaume Chatelet // See https://llvm.org/LICENSE.txt for license information. 5d3d498fbSGuillaume Chatelet // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6d3d498fbSGuillaume Chatelet // 7d3d498fbSGuillaume Chatelet //===----------------------------------------------------------------------===// 8d3d498fbSGuillaume Chatelet 9270547f3SGuillaume Chatelet #ifndef LLVM_LIBC_SRC___SUPPORT_CPP_ARRAY_H 10270547f3SGuillaume Chatelet #define LLVM_LIBC_SRC___SUPPORT_CPP_ARRAY_H 11d3d498fbSGuillaume Chatelet 12c63a291cSNick Desaulniers #include "src/__support/CPP/iterator.h" // reverse_iterator 13019a477cSRoland McGrath #include "src/__support/macros/attributes.h" 14*5ff3ff33SPetr Hosek #include "src/__support/macros/config.h" 15d3d498fbSGuillaume Chatelet #include <stddef.h> // For size_t. 16d3d498fbSGuillaume Chatelet 17*5ff3ff33SPetr Hosek namespace LIBC_NAMESPACE_DECL { 18d3d498fbSGuillaume Chatelet namespace cpp { 19d3d498fbSGuillaume Chatelet 20d3d498fbSGuillaume Chatelet template <class T, size_t N> struct array { 21b6bc9d72SGuillaume Chatelet static_assert(N != 0, 22b6bc9d72SGuillaume Chatelet "Cannot create a LIBC_NAMESPACE::cpp::array of size 0."); 23d3d498fbSGuillaume Chatelet 24d3d498fbSGuillaume Chatelet T Data[N]; 2540d85915SGuillaume Chatelet using value_type = T; 26d3d498fbSGuillaume Chatelet using iterator = T *; 27d3d498fbSGuillaume Chatelet using const_iterator = const T *; 28c63a291cSNick Desaulniers using reverse_iterator = cpp::reverse_iterator<iterator>; 29c63a291cSNick Desaulniers using const_reverse_iterator = cpp::reverse_iterator<const_iterator>; 30d3d498fbSGuillaume Chatelet 31019a477cSRoland McGrath LIBC_INLINE constexpr T *data() { return Data; } 32019a477cSRoland McGrath LIBC_INLINE constexpr const T *data() const { return Data; } 33d3d498fbSGuillaume Chatelet 34019a477cSRoland McGrath LIBC_INLINE constexpr T &front() { return Data[0]; } 352b677fa4SGuillaume Chatelet LIBC_INLINE constexpr const T &front() const { return Data[0]; } 36d3d498fbSGuillaume Chatelet 37019a477cSRoland McGrath LIBC_INLINE constexpr T &back() { return Data[N - 1]; } 382b677fa4SGuillaume Chatelet LIBC_INLINE constexpr const T &back() const { return Data[N - 1]; } 39d3d498fbSGuillaume Chatelet 40019a477cSRoland McGrath LIBC_INLINE constexpr T &operator[](size_t Index) { return Data[Index]; } 41d3d498fbSGuillaume Chatelet 42019a477cSRoland McGrath LIBC_INLINE constexpr const T &operator[](size_t Index) const { 43019a477cSRoland McGrath return Data[Index]; 44019a477cSRoland McGrath } 45d3d498fbSGuillaume Chatelet 46019a477cSRoland McGrath LIBC_INLINE constexpr size_t size() const { return N; } 47d3d498fbSGuillaume Chatelet 48019a477cSRoland McGrath LIBC_INLINE constexpr bool empty() const { return N == 0; } 49d3d498fbSGuillaume Chatelet 50019a477cSRoland McGrath LIBC_INLINE constexpr iterator begin() { return Data; } 51019a477cSRoland McGrath LIBC_INLINE constexpr const_iterator begin() const { return Data; } 52c63a291cSNick Desaulniers LIBC_INLINE constexpr const_iterator cbegin() const { return begin(); } 53d3d498fbSGuillaume Chatelet 54019a477cSRoland McGrath LIBC_INLINE constexpr iterator end() { return Data + N; } 5597ab3c34SGuillaume Chatelet LIBC_INLINE constexpr const_iterator end() const { return Data + N; } 56c63a291cSNick Desaulniers LIBC_INLINE constexpr const_iterator cend() const { return end(); } 57c63a291cSNick Desaulniers 58c63a291cSNick Desaulniers LIBC_INLINE constexpr reverse_iterator rbegin() { 59c63a291cSNick Desaulniers return reverse_iterator{end()}; 60c63a291cSNick Desaulniers } 61c63a291cSNick Desaulniers LIBC_INLINE constexpr const_reverse_iterator rbegin() const { 62c63a291cSNick Desaulniers return const_reverse_iterator{end()}; 63c63a291cSNick Desaulniers } 64c63a291cSNick Desaulniers LIBC_INLINE constexpr const_reverse_iterator crbegin() const { 65c63a291cSNick Desaulniers return rbegin(); 66c63a291cSNick Desaulniers } 67c63a291cSNick Desaulniers 68c63a291cSNick Desaulniers LIBC_INLINE constexpr reverse_iterator rend() { 69c63a291cSNick Desaulniers return reverse_iterator{begin()}; 70c63a291cSNick Desaulniers } 71c63a291cSNick Desaulniers LIBC_INLINE constexpr const_reverse_iterator rend() const { 72c63a291cSNick Desaulniers return const_reverse_iterator{begin()}; 73c63a291cSNick Desaulniers } 74c63a291cSNick Desaulniers LIBC_INLINE constexpr const_reverse_iterator crend() const { return rend(); } 75d3d498fbSGuillaume Chatelet }; 76d3d498fbSGuillaume Chatelet 77d3d498fbSGuillaume Chatelet } // namespace cpp 78*5ff3ff33SPetr Hosek } // namespace LIBC_NAMESPACE_DECL 79d3d498fbSGuillaume Chatelet 80270547f3SGuillaume Chatelet #endif // LLVM_LIBC_SRC___SUPPORT_CPP_ARRAY_H 81