Path: blob/main/contrib/llvm-project/libc/src/__support/CPP/array.h
213799 views
//===-- A self contained equivalent of std::array ---------------*- C++ -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_ARRAY_H9#define LLVM_LIBC_SRC___SUPPORT_CPP_ARRAY_H1011#include "src/__support/CPP/iterator.h" // reverse_iterator12#include "src/__support/macros/attributes.h"13#include "src/__support/macros/config.h"14#include <stddef.h> // For size_t.1516namespace LIBC_NAMESPACE_DECL {17namespace cpp {1819template <class T, size_t N> struct array {20static_assert(N != 0,21"Cannot create a LIBC_NAMESPACE::cpp::array of size 0.");2223T Data[N];24using value_type = T;25using iterator = T *;26using const_iterator = const T *;27using reverse_iterator = cpp::reverse_iterator<iterator>;28using const_reverse_iterator = cpp::reverse_iterator<const_iterator>;2930LIBC_INLINE constexpr T *data() { return Data; }31LIBC_INLINE constexpr const T *data() const { return Data; }3233LIBC_INLINE constexpr T &front() { return Data[0]; }34LIBC_INLINE constexpr const T &front() const { return Data[0]; }3536LIBC_INLINE constexpr T &back() { return Data[N - 1]; }37LIBC_INLINE constexpr const T &back() const { return Data[N - 1]; }3839LIBC_INLINE constexpr T &operator[](size_t Index) { return Data[Index]; }4041LIBC_INLINE constexpr const T &operator[](size_t Index) const {42return Data[Index];43}4445LIBC_INLINE constexpr size_t size() const { return N; }4647LIBC_INLINE constexpr bool empty() const { return N == 0; }4849LIBC_INLINE constexpr iterator begin() { return Data; }50LIBC_INLINE constexpr const_iterator begin() const { return Data; }51LIBC_INLINE constexpr const_iterator cbegin() const { return begin(); }5253LIBC_INLINE constexpr iterator end() { return Data + N; }54LIBC_INLINE constexpr const_iterator end() const { return Data + N; }55LIBC_INLINE constexpr const_iterator cend() const { return end(); }5657LIBC_INLINE constexpr reverse_iterator rbegin() {58return reverse_iterator{end()};59}60LIBC_INLINE constexpr const_reverse_iterator rbegin() const {61return const_reverse_iterator{end()};62}63LIBC_INLINE constexpr const_reverse_iterator crbegin() const {64return rbegin();65}6667LIBC_INLINE constexpr reverse_iterator rend() {68return reverse_iterator{begin()};69}70LIBC_INLINE constexpr const_reverse_iterator rend() const {71return const_reverse_iterator{begin()};72}73LIBC_INLINE constexpr const_reverse_iterator crend() const { return rend(); }74};7576} // namespace cpp77} // namespace LIBC_NAMESPACE_DECL7879#endif // LLVM_LIBC_SRC___SUPPORT_CPP_ARRAY_H808182