10b57cec5SDimitry Andric// -*- C++ -*- 2349cc55cSDimitry Andric//===----------------------------------------------------------------------===// 30b57cec5SDimitry Andric// 40b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 50b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 60b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 70b57cec5SDimitry Andric// 80b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 90b57cec5SDimitry Andric 100b57cec5SDimitry Andric#ifndef _LIBCPP_ARRAY 110b57cec5SDimitry Andric#define _LIBCPP_ARRAY 120b57cec5SDimitry Andric 130b57cec5SDimitry Andric/* 140b57cec5SDimitry Andric array synopsis 150b57cec5SDimitry Andric 160b57cec5SDimitry Andricnamespace std 170b57cec5SDimitry Andric{ 180b57cec5SDimitry Andrictemplate <class T, size_t N > 190b57cec5SDimitry Andricstruct array 200b57cec5SDimitry Andric{ 210b57cec5SDimitry Andric // types: 22*700637cbSDimitry Andric using value_type = T; 23*700637cbSDimitry Andric using pointer = T*; 24*700637cbSDimitry Andric using const_pointer = const T*; 25*700637cbSDimitry Andric using reference = T&; 26*700637cbSDimitry Andric using const_reference = const T&; 27*700637cbSDimitry Andric using size_type = size_t; 28*700637cbSDimitry Andric using difference_type = ptrdiff_t; 29*700637cbSDimitry Andric using iterator = implementation-defined; 30*700637cbSDimitry Andric using const_iterator = implementation-defined; 31*700637cbSDimitry Andric using reverse_iterator = std::reverse_iterator<iterator>; 32*700637cbSDimitry Andric using const_reverse_iterator = std::reverse_iterator<const_iterator>; 330b57cec5SDimitry Andric 340b57cec5SDimitry Andric // No explicit construct/copy/destroy for aggregate type 355ffd83dbSDimitry Andric void fill(const T& u); // constexpr in C++20 365ffd83dbSDimitry Andric void swap(array& a) noexcept(is_nothrow_swappable_v<T>); // constexpr in C++20 370b57cec5SDimitry Andric 380b57cec5SDimitry Andric // iterators: 395ffd83dbSDimitry Andric iterator begin() noexcept; // constexpr in C++17 405ffd83dbSDimitry Andric const_iterator begin() const noexcept; // constexpr in C++17 415ffd83dbSDimitry Andric iterator end() noexcept; // constexpr in C++17 425ffd83dbSDimitry Andric const_iterator end() const noexcept; // constexpr in C++17 430b57cec5SDimitry Andric 445ffd83dbSDimitry Andric reverse_iterator rbegin() noexcept; // constexpr in C++17 455ffd83dbSDimitry Andric const_reverse_iterator rbegin() const noexcept; // constexpr in C++17 465ffd83dbSDimitry Andric reverse_iterator rend() noexcept; // constexpr in C++17 475ffd83dbSDimitry Andric const_reverse_iterator rend() const noexcept; // constexpr in C++17 480b57cec5SDimitry Andric 495ffd83dbSDimitry Andric const_iterator cbegin() const noexcept; // constexpr in C++17 505ffd83dbSDimitry Andric const_iterator cend() const noexcept; // constexpr in C++17 515ffd83dbSDimitry Andric const_reverse_iterator crbegin() const noexcept; // constexpr in C++17 525ffd83dbSDimitry Andric const_reverse_iterator crend() const noexcept; // constexpr in C++17 530b57cec5SDimitry Andric 540b57cec5SDimitry Andric // capacity: 550b57cec5SDimitry Andric constexpr size_type size() const noexcept; 560b57cec5SDimitry Andric constexpr size_type max_size() const noexcept; 570b57cec5SDimitry Andric constexpr bool empty() const noexcept; 580b57cec5SDimitry Andric 590b57cec5SDimitry Andric // element access: 605ffd83dbSDimitry Andric reference operator[](size_type n); // constexpr in C++17 610b57cec5SDimitry Andric const_reference operator[](size_type n) const; // constexpr in C++14 625ffd83dbSDimitry Andric reference at(size_type n); // constexpr in C++17 630b57cec5SDimitry Andric const_reference at(size_type n) const; // constexpr in C++14 640b57cec5SDimitry Andric 655ffd83dbSDimitry Andric reference front(); // constexpr in C++17 660b57cec5SDimitry Andric const_reference front() const; // constexpr in C++14 675ffd83dbSDimitry Andric reference back(); // constexpr in C++17 680b57cec5SDimitry Andric const_reference back() const; // constexpr in C++14 690b57cec5SDimitry Andric 705ffd83dbSDimitry Andric T* data() noexcept; // constexpr in C++17 715ffd83dbSDimitry Andric const T* data() const noexcept; // constexpr in C++17 720b57cec5SDimitry Andric}; 730b57cec5SDimitry Andric 740b57cec5SDimitry Andrictemplate <class T, class... U> 755ffd83dbSDimitry Andric array(T, U...) -> array<T, 1 + sizeof...(U)>; // C++17 760b57cec5SDimitry Andric 770b57cec5SDimitry Andrictemplate <class T, size_t N> 785ffd83dbSDimitry Andric bool operator==(const array<T,N>& x, const array<T,N>& y); // constexpr in C++20 790b57cec5SDimitry Andrictemplate <class T, size_t N> 8006c3fb27SDimitry Andric bool operator!=(const array<T,N>& x, const array<T,N>& y); // removed in C++20 810b57cec5SDimitry Andrictemplate <class T, size_t N> 8206c3fb27SDimitry Andric bool operator<(const array<T,N>& x, const array<T,N>& y); // removed in C++20 830b57cec5SDimitry Andrictemplate <class T, size_t N> 8406c3fb27SDimitry Andric bool operator>(const array<T,N>& x, const array<T,N>& y); // removed in C++20 850b57cec5SDimitry Andrictemplate <class T, size_t N> 8606c3fb27SDimitry Andric bool operator<=(const array<T,N>& x, const array<T,N>& y); // removed in C++20 870b57cec5SDimitry Andrictemplate <class T, size_t N> 8806c3fb27SDimitry Andric bool operator>=(const array<T,N>& x, const array<T,N>& y); // removed in C++20 8906c3fb27SDimitry Andrictemplate<class T, size_t N> 9006c3fb27SDimitry Andric constexpr synth-three-way-result<T> 9106c3fb27SDimitry Andric operator<=>(const array<T, N>& x, const array<T, N>& y); // since C++20 920b57cec5SDimitry Andric 930b57cec5SDimitry Andrictemplate <class T, size_t N > 945ffd83dbSDimitry Andric void swap(array<T,N>& x, array<T,N>& y) noexcept(noexcept(x.swap(y))); // constexpr in C++20 955ffd83dbSDimitry Andric 965ffd83dbSDimitry Andrictemplate <class T, size_t N> 975ffd83dbSDimitry Andric constexpr array<remove_cv_t<T>, N> to_array(T (&a)[N]); // C++20 985ffd83dbSDimitry Andrictemplate <class T, size_t N> 995ffd83dbSDimitry Andric constexpr array<remove_cv_t<T>, N> to_array(T (&&a)[N]); // C++20 1000b57cec5SDimitry Andric 1010b57cec5SDimitry Andrictemplate <class T> struct tuple_size; 1020b57cec5SDimitry Andrictemplate <size_t I, class T> struct tuple_element; 1030b57cec5SDimitry Andrictemplate <class T, size_t N> struct tuple_size<array<T, N>>; 1040b57cec5SDimitry Andrictemplate <size_t I, class T, size_t N> struct tuple_element<I, array<T, N>>; 1050b57cec5SDimitry Andrictemplate <size_t I, class T, size_t N> T& get(array<T, N>&) noexcept; // constexpr in C++14 1060b57cec5SDimitry Andrictemplate <size_t I, class T, size_t N> const T& get(const array<T, N>&) noexcept; // constexpr in C++14 1070b57cec5SDimitry Andrictemplate <size_t I, class T, size_t N> T&& get(array<T, N>&&) noexcept; // constexpr in C++14 1080b57cec5SDimitry Andrictemplate <size_t I, class T, size_t N> const T&& get(const array<T, N>&&) noexcept; // constexpr in C++14 1090b57cec5SDimitry Andric 1100b57cec5SDimitry Andric} // std 1110b57cec5SDimitry Andric 1120b57cec5SDimitry Andric*/ 1130b57cec5SDimitry Andric 114*700637cbSDimitry Andric#if __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS) 115*700637cbSDimitry Andric# include <__cxx03/array> 116*700637cbSDimitry Andric#else 11781ad6265SDimitry Andric# include <__algorithm/equal.h> 11881ad6265SDimitry Andric# include <__algorithm/fill_n.h> 11981ad6265SDimitry Andric# include <__algorithm/lexicographical_compare.h> 12006c3fb27SDimitry Andric# include <__algorithm/lexicographical_compare_three_way.h> 12181ad6265SDimitry Andric# include <__algorithm/swap_ranges.h> 1220fca6ea1SDimitry Andric# include <__assert> 1230b57cec5SDimitry Andric# include <__config> 124*700637cbSDimitry Andric# include <__cstddef/ptrdiff_t.h> 12506c3fb27SDimitry Andric# include <__fwd/array.h> 12681ad6265SDimitry Andric# include <__iterator/reverse_iterator.h> 127*700637cbSDimitry Andric# include <__iterator/static_bounded_iter.h> 1280fca6ea1SDimitry Andric# include <__iterator/wrap_iter.h> 12906c3fb27SDimitry Andric# include <__tuple/sfinae_helpers.h> 13006c3fb27SDimitry Andric# include <__type_traits/conditional.h> 1310fca6ea1SDimitry Andric# include <__type_traits/conjunction.h> 132*700637cbSDimitry Andric# include <__type_traits/enable_if.h> 13306c3fb27SDimitry Andric# include <__type_traits/is_array.h> 13406c3fb27SDimitry Andric# include <__type_traits/is_const.h> 13506c3fb27SDimitry Andric# include <__type_traits/is_constructible.h> 13606c3fb27SDimitry Andric# include <__type_traits/is_nothrow_constructible.h> 137*700637cbSDimitry Andric# include <__type_traits/is_replaceable.h> 13806c3fb27SDimitry Andric# include <__type_traits/is_same.h> 13906c3fb27SDimitry Andric# include <__type_traits/is_swappable.h> 1400fca6ea1SDimitry Andric# include <__type_traits/is_trivially_relocatable.h> 14106c3fb27SDimitry Andric# include <__type_traits/remove_cv.h> 1425f757f3fSDimitry Andric# include <__utility/empty.h> 14381ad6265SDimitry Andric# include <__utility/integer_sequence.h> 14481ad6265SDimitry Andric# include <__utility/move.h> 14581ad6265SDimitry Andric# include <__utility/unreachable.h> 146fe6060f1SDimitry Andric# include <stdexcept> 1470b57cec5SDimitry Andric# include <version> 1480b57cec5SDimitry Andric 14981ad6265SDimitry Andric// standard-mandated includes 15081ad6265SDimitry Andric 15181ad6265SDimitry Andric// [iterator.range] 15281ad6265SDimitry Andric# include <__iterator/access.h> 15381ad6265SDimitry Andric# include <__iterator/data.h> 15481ad6265SDimitry Andric# include <__iterator/empty.h> 15581ad6265SDimitry Andric# include <__iterator/reverse_access.h> 15681ad6265SDimitry Andric# include <__iterator/size.h> 15781ad6265SDimitry Andric 15881ad6265SDimitry Andric// [array.syn] 15981ad6265SDimitry Andric# include <compare> 16081ad6265SDimitry Andric# include <initializer_list> 16181ad6265SDimitry Andric 162bdd1243dSDimitry Andric// [tuple.helper] 16306c3fb27SDimitry Andric# include <__tuple/tuple_element.h> 16406c3fb27SDimitry Andric# include <__tuple/tuple_size.h> 165bdd1243dSDimitry Andric 1660b57cec5SDimitry Andric# if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 1670b57cec5SDimitry Andric# pragma GCC system_header 1680b57cec5SDimitry Andric# endif 1690b57cec5SDimitry Andric 170b3edf446SDimitry Andric_LIBCPP_PUSH_MACROS 171b3edf446SDimitry Andric# include <__undef_macros> 172b3edf446SDimitry Andric 1730b57cec5SDimitry Andric_LIBCPP_BEGIN_NAMESPACE_STD 1740b57cec5SDimitry Andric 1750b57cec5SDimitry Andrictemplate <class _Tp, size_t _Size> 176*700637cbSDimitry Andricstruct array { 177*700637cbSDimitry Andric using __trivially_relocatable _LIBCPP_NODEBUG = 178*700637cbSDimitry Andric __conditional_t<__libcpp_is_trivially_relocatable<_Tp>::value, array, void>; 179*700637cbSDimitry Andric using __replaceable _LIBCPP_NODEBUG = __conditional_t<__is_replaceable_v<_Tp>, array, void>; 1800fca6ea1SDimitry Andric 1810b57cec5SDimitry Andric // types: 182*700637cbSDimitry Andric using __self _LIBCPP_NODEBUG = array; 1835f757f3fSDimitry Andric using value_type = _Tp; 1845f757f3fSDimitry Andric using reference = value_type&; 1855f757f3fSDimitry Andric using const_reference = const value_type&; 1865f757f3fSDimitry Andric using pointer = value_type*; 1875f757f3fSDimitry Andric using const_pointer = const value_type*; 188*700637cbSDimitry Andric# if defined(_LIBCPP_ABI_BOUNDED_ITERATORS_IN_STD_ARRAY) 189*700637cbSDimitry Andric using iterator = __static_bounded_iter<pointer, _Size>; 190*700637cbSDimitry Andric using const_iterator = __static_bounded_iter<const_pointer, _Size>; 191*700637cbSDimitry Andric# elif defined(_LIBCPP_ABI_USE_WRAP_ITER_IN_STD_ARRAY) 1920fca6ea1SDimitry Andric using iterator = __wrap_iter<pointer>; 1930fca6ea1SDimitry Andric using const_iterator = __wrap_iter<const_pointer>; 1940fca6ea1SDimitry Andric# else 1950fca6ea1SDimitry Andric using iterator = pointer; 1960fca6ea1SDimitry Andric using const_iterator = const_pointer; 1970fca6ea1SDimitry Andric# endif 1985f757f3fSDimitry Andric using size_type = size_t; 1995f757f3fSDimitry Andric using difference_type = ptrdiff_t; 2005f757f3fSDimitry Andric using reverse_iterator = std::reverse_iterator<iterator>; 2015f757f3fSDimitry Andric using const_reverse_iterator = std::reverse_iterator<const_iterator>; 2020b57cec5SDimitry Andric 2030b57cec5SDimitry Andric _Tp __elems_[_Size]; 2040b57cec5SDimitry Andric 2050b57cec5SDimitry Andric // No explicit construct/copy/destroy for aggregate type 206cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void fill(const value_type& __u) { 2075f757f3fSDimitry Andric std::fill_n(data(), _Size, __u); 2080b57cec5SDimitry Andric } 2090b57cec5SDimitry Andric 2100fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void swap(array& __a) _NOEXCEPT_(__is_nothrow_swappable_v<_Tp>) { 2115f757f3fSDimitry Andric std::swap_ranges(data(), data() + _Size, __a.data()); 2120b57cec5SDimitry Andric } 2130b57cec5SDimitry Andric 2140b57cec5SDimitry Andric // iterators: 215*700637cbSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 iterator begin() _NOEXCEPT { 216*700637cbSDimitry Andric# if defined(_LIBCPP_ABI_BOUNDED_ITERATORS_IN_STD_ARRAY) 217*700637cbSDimitry Andric return std::__make_static_bounded_iter<_Size>(data(), data()); 218*700637cbSDimitry Andric# else 219*700637cbSDimitry Andric return iterator(data()); 220*700637cbSDimitry Andric# endif 221cb14a3feSDimitry Andric } 222*700637cbSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 const_iterator begin() const _NOEXCEPT { 223*700637cbSDimitry Andric# if defined(_LIBCPP_ABI_BOUNDED_ITERATORS_IN_STD_ARRAY) 224*700637cbSDimitry Andric return std::__make_static_bounded_iter<_Size>(data(), data()); 225*700637cbSDimitry Andric# else 226*700637cbSDimitry Andric return const_iterator(data()); 227*700637cbSDimitry Andric# endif 228*700637cbSDimitry Andric } 229*700637cbSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 iterator end() _NOEXCEPT { 230*700637cbSDimitry Andric# if defined(_LIBCPP_ABI_BOUNDED_ITERATORS_IN_STD_ARRAY) 231*700637cbSDimitry Andric return std::__make_static_bounded_iter<_Size>(data() + _Size, data()); 232*700637cbSDimitry Andric# else 233*700637cbSDimitry Andric return iterator(data() + _Size); 234*700637cbSDimitry Andric# endif 235*700637cbSDimitry Andric } 236cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 const_iterator end() const _NOEXCEPT { 237*700637cbSDimitry Andric# if defined(_LIBCPP_ABI_BOUNDED_ITERATORS_IN_STD_ARRAY) 238*700637cbSDimitry Andric return std::__make_static_bounded_iter<_Size>(data() + _Size, data()); 239*700637cbSDimitry Andric# else 240cb14a3feSDimitry Andric return const_iterator(data() + _Size); 241*700637cbSDimitry Andric# endif 242cb14a3feSDimitry Andric } 2430b57cec5SDimitry Andric 244cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reverse_iterator rbegin() _NOEXCEPT { 245cb14a3feSDimitry Andric return reverse_iterator(end()); 246cb14a3feSDimitry Andric } 247cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 const_reverse_iterator rbegin() const _NOEXCEPT { 248cb14a3feSDimitry Andric return const_reverse_iterator(end()); 249cb14a3feSDimitry Andric } 250cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reverse_iterator rend() _NOEXCEPT { 251cb14a3feSDimitry Andric return reverse_iterator(begin()); 252cb14a3feSDimitry Andric } 253cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 const_reverse_iterator rend() const _NOEXCEPT { 254cb14a3feSDimitry Andric return const_reverse_iterator(begin()); 255cb14a3feSDimitry Andric } 2560b57cec5SDimitry Andric 257cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 const_iterator cbegin() const _NOEXCEPT { return begin(); } 258cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 const_iterator cend() const _NOEXCEPT { return end(); } 259cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 const_reverse_iterator crbegin() const _NOEXCEPT { 260cb14a3feSDimitry Andric return rbegin(); 261cb14a3feSDimitry Andric } 262cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 const_reverse_iterator crend() const _NOEXCEPT { return rend(); } 2630b57cec5SDimitry Andric 2640b57cec5SDimitry Andric // capacity: 265cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR size_type size() const _NOEXCEPT { return _Size; } 266cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR size_type max_size() const _NOEXCEPT { return _Size; } 267*700637cbSDimitry Andric [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bool empty() const _NOEXCEPT { return _Size == 0; } 2680b57cec5SDimitry Andric 2690b57cec5SDimitry Andric // element access: 270cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reference operator[](size_type __n) _NOEXCEPT { 27106c3fb27SDimitry Andric _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__n < _Size, "out-of-bounds access in std::array<T, N>"); 2725ffd83dbSDimitry Andric return __elems_[__n]; 2735ffd83dbSDimitry Andric } 274cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 const_reference operator[](size_type __n) const _NOEXCEPT { 27506c3fb27SDimitry Andric _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__n < _Size, "out-of-bounds access in std::array<T, N>"); 2765ffd83dbSDimitry Andric return __elems_[__n]; 2775ffd83dbSDimitry Andric } 2780b57cec5SDimitry Andric 279cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reference at(size_type __n) { 2805ffd83dbSDimitry Andric if (__n >= _Size) 281*700637cbSDimitry Andric std::__throw_out_of_range("array::at"); 2825ffd83dbSDimitry Andric return __elems_[__n]; 2835ffd83dbSDimitry Andric } 2840b57cec5SDimitry Andric 285cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 const_reference at(size_type __n) const { 2865ffd83dbSDimitry Andric if (__n >= _Size) 287*700637cbSDimitry Andric std::__throw_out_of_range("array::at"); 2885ffd83dbSDimitry Andric return __elems_[__n]; 2895ffd83dbSDimitry Andric } 2905ffd83dbSDimitry Andric 2915f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reference front() _NOEXCEPT { return (*this)[0]; } 2925f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 const_reference front() const _NOEXCEPT { return (*this)[0]; } 2935f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reference back() _NOEXCEPT { return (*this)[_Size - 1]; } 294cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 const_reference back() const _NOEXCEPT { 295cb14a3feSDimitry Andric return (*this)[_Size - 1]; 296cb14a3feSDimitry Andric } 2970b57cec5SDimitry Andric 298cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 value_type* data() _NOEXCEPT { return __elems_; } 299cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 const value_type* data() const _NOEXCEPT { return __elems_; } 3000b57cec5SDimitry Andric}; 3010b57cec5SDimitry Andric 3020b57cec5SDimitry Andrictemplate <class _Tp> 303*700637cbSDimitry Andricstruct array<_Tp, 0> { 3040b57cec5SDimitry Andric // types: 305*700637cbSDimitry Andric using __self _LIBCPP_NODEBUG = array; 306*700637cbSDimitry Andric using value_type = _Tp; 307*700637cbSDimitry Andric using reference = value_type&; 308*700637cbSDimitry Andric using const_reference = const value_type&; 309*700637cbSDimitry Andric using pointer = value_type*; 310*700637cbSDimitry Andric using const_pointer = const value_type*; 311*700637cbSDimitry Andric# if defined(_LIBCPP_ABI_BOUNDED_ITERATORS_IN_STD_ARRAY) 312*700637cbSDimitry Andric using iterator = __static_bounded_iter<pointer, 0>; 313*700637cbSDimitry Andric using const_iterator = __static_bounded_iter<const_pointer, 0>; 314*700637cbSDimitry Andric# elif defined(_LIBCPP_ABI_USE_WRAP_ITER_IN_STD_ARRAY) 315*700637cbSDimitry Andric using iterator = __wrap_iter<pointer>; 316*700637cbSDimitry Andric using const_iterator = __wrap_iter<const_pointer>; 317*700637cbSDimitry Andric# else 318*700637cbSDimitry Andric using iterator = pointer; 319*700637cbSDimitry Andric using const_iterator = const_pointer; 320*700637cbSDimitry Andric# endif 321*700637cbSDimitry Andric using size_type = size_t; 322*700637cbSDimitry Andric using difference_type = ptrdiff_t; 323*700637cbSDimitry Andric using reverse_iterator = std::reverse_iterator<iterator>; 324*700637cbSDimitry Andric using const_reverse_iterator = std::reverse_iterator<const_iterator>; 3250b57cec5SDimitry Andric 326*700637cbSDimitry Andric using _EmptyType _LIBCPP_NODEBUG = __conditional_t<is_const<_Tp>::value, const __empty, __empty>; 3270b57cec5SDimitry Andric 328cb14a3feSDimitry Andric struct _ArrayInStructT { 329cb14a3feSDimitry Andric _Tp __data_[1]; 330cb14a3feSDimitry Andric }; 3315f757f3fSDimitry Andric _ALIGNAS_TYPE(_ArrayInStructT) _EmptyType __elems_[sizeof(_ArrayInStructT)]; 3320b57cec5SDimitry Andric 333cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 value_type* data() _NOEXCEPT { return nullptr; } 334cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 const value_type* data() const _NOEXCEPT { return nullptr; } 3355ffd83dbSDimitry Andric 3360b57cec5SDimitry Andric // No explicit construct/copy/destroy for aggregate type 337cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void fill(const value_type&) { 338cb14a3feSDimitry Andric static_assert(!is_const<_Tp>::value, "cannot fill zero-sized array of type 'const T'"); 3390b57cec5SDimitry Andric } 3400b57cec5SDimitry Andric 341cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void swap(array&) _NOEXCEPT { 342cb14a3feSDimitry Andric static_assert(!is_const<_Tp>::value, "cannot swap zero-sized array of type 'const T'"); 3430b57cec5SDimitry Andric } 3440b57cec5SDimitry Andric 3450b57cec5SDimitry Andric // iterators: 346*700637cbSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 iterator begin() _NOEXCEPT { 347*700637cbSDimitry Andric# if defined(_LIBCPP_ABI_BOUNDED_ITERATORS_IN_STD_ARRAY) 348*700637cbSDimitry Andric return std::__make_static_bounded_iter<0>(data(), data()); 349*700637cbSDimitry Andric# else 350*700637cbSDimitry Andric return iterator(data()); 351*700637cbSDimitry Andric# endif 352cb14a3feSDimitry Andric } 353*700637cbSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 const_iterator begin() const _NOEXCEPT { 354*700637cbSDimitry Andric# if defined(_LIBCPP_ABI_BOUNDED_ITERATORS_IN_STD_ARRAY) 355*700637cbSDimitry Andric return std::__make_static_bounded_iter<0>(data(), data()); 356*700637cbSDimitry Andric# else 357cb14a3feSDimitry Andric return const_iterator(data()); 358*700637cbSDimitry Andric# endif 359*700637cbSDimitry Andric } 360*700637cbSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 iterator end() _NOEXCEPT { 361*700637cbSDimitry Andric# if defined(_LIBCPP_ABI_BOUNDED_ITERATORS_IN_STD_ARRAY) 362*700637cbSDimitry Andric return std::__make_static_bounded_iter<0>(data(), data()); 363*700637cbSDimitry Andric# else 364*700637cbSDimitry Andric return iterator(data()); 365*700637cbSDimitry Andric# endif 366*700637cbSDimitry Andric } 367*700637cbSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 const_iterator end() const _NOEXCEPT { 368*700637cbSDimitry Andric# if defined(_LIBCPP_ABI_BOUNDED_ITERATORS_IN_STD_ARRAY) 369*700637cbSDimitry Andric return std::__make_static_bounded_iter<0>(data(), data()); 370*700637cbSDimitry Andric# else 371*700637cbSDimitry Andric return const_iterator(data()); 372*700637cbSDimitry Andric# endif 373cb14a3feSDimitry Andric } 3740b57cec5SDimitry Andric 375cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reverse_iterator rbegin() _NOEXCEPT { 376cb14a3feSDimitry Andric return reverse_iterator(end()); 377cb14a3feSDimitry Andric } 378cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 const_reverse_iterator rbegin() const _NOEXCEPT { 379cb14a3feSDimitry Andric return const_reverse_iterator(end()); 380cb14a3feSDimitry Andric } 381cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reverse_iterator rend() _NOEXCEPT { 382cb14a3feSDimitry Andric return reverse_iterator(begin()); 383cb14a3feSDimitry Andric } 384cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 const_reverse_iterator rend() const _NOEXCEPT { 385cb14a3feSDimitry Andric return const_reverse_iterator(begin()); 386cb14a3feSDimitry Andric } 3870b57cec5SDimitry Andric 388cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 const_iterator cbegin() const _NOEXCEPT { return begin(); } 389cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 const_iterator cend() const _NOEXCEPT { return end(); } 390cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 const_reverse_iterator crbegin() const _NOEXCEPT { 391cb14a3feSDimitry Andric return rbegin(); 392cb14a3feSDimitry Andric } 393cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 const_reverse_iterator crend() const _NOEXCEPT { return rend(); } 3940b57cec5SDimitry Andric 3950b57cec5SDimitry Andric // capacity: 396cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR size_type size() const _NOEXCEPT { return 0; } 397cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR size_type max_size() const _NOEXCEPT { return 0; } 398*700637cbSDimitry Andric [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bool empty() const _NOEXCEPT { return true; } 3990b57cec5SDimitry Andric 4000b57cec5SDimitry Andric // element access: 401cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reference operator[](size_type) _NOEXCEPT { 40206c3fb27SDimitry Andric _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(false, "cannot call array<T, 0>::operator[] on a zero-sized array"); 40381ad6265SDimitry Andric __libcpp_unreachable(); 4040b57cec5SDimitry Andric } 4050b57cec5SDimitry Andric 406cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 const_reference operator[](size_type) const _NOEXCEPT { 40706c3fb27SDimitry Andric _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(false, "cannot call array<T, 0>::operator[] on a zero-sized array"); 40881ad6265SDimitry Andric __libcpp_unreachable(); 4090b57cec5SDimitry Andric } 4100b57cec5SDimitry Andric 411cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reference at(size_type) { 412*700637cbSDimitry Andric std::__throw_out_of_range("array<T, 0>::at"); 41381ad6265SDimitry Andric __libcpp_unreachable(); 4140b57cec5SDimitry Andric } 4150b57cec5SDimitry Andric 416cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 const_reference at(size_type) const { 417*700637cbSDimitry Andric std::__throw_out_of_range("array<T, 0>::at"); 41881ad6265SDimitry Andric __libcpp_unreachable(); 4190b57cec5SDimitry Andric } 4200b57cec5SDimitry Andric 421cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reference front() _NOEXCEPT { 42206c3fb27SDimitry Andric _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(false, "cannot call array<T, 0>::front() on a zero-sized array"); 42381ad6265SDimitry Andric __libcpp_unreachable(); 4240b57cec5SDimitry Andric } 4250b57cec5SDimitry Andric 426cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 const_reference front() const _NOEXCEPT { 42706c3fb27SDimitry Andric _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(false, "cannot call array<T, 0>::front() on a zero-sized array"); 42881ad6265SDimitry Andric __libcpp_unreachable(); 4290b57cec5SDimitry Andric } 4300b57cec5SDimitry Andric 431cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 reference back() _NOEXCEPT { 43206c3fb27SDimitry Andric _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(false, "cannot call array<T, 0>::back() on a zero-sized array"); 43381ad6265SDimitry Andric __libcpp_unreachable(); 4340b57cec5SDimitry Andric } 4350b57cec5SDimitry Andric 436cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 const_reference back() const _NOEXCEPT { 43706c3fb27SDimitry Andric _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(false, "cannot call array<T, 0>::back() on a zero-sized array"); 43881ad6265SDimitry Andric __libcpp_unreachable(); 4390b57cec5SDimitry Andric } 4400b57cec5SDimitry Andric}; 4410b57cec5SDimitry Andric 44206c3fb27SDimitry Andric# if _LIBCPP_STD_VER >= 17 443cb14a3feSDimitry Andrictemplate <class _Tp, class... _Args, class = enable_if_t<__all<_IsSame<_Tp, _Args>::value...>::value> > 444cb14a3feSDimitry Andricarray(_Tp, _Args...) -> array<_Tp, 1 + sizeof...(_Args)>; 4450b57cec5SDimitry Andric# endif 4460b57cec5SDimitry Andric 4470b57cec5SDimitry Andrictemplate <class _Tp, size_t _Size> 448cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool 449cb14a3feSDimitry Andricoperator==(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) { 4505f757f3fSDimitry Andric return std::equal(__x.begin(), __x.end(), __y.begin()); 4510b57cec5SDimitry Andric} 4520b57cec5SDimitry Andric 45306c3fb27SDimitry Andric# if _LIBCPP_STD_VER <= 17 45406c3fb27SDimitry Andric 4550b57cec5SDimitry Andrictemplate <class _Tp, size_t _Size> 45606c3fb27SDimitry Andricinline _LIBCPP_HIDE_FROM_ABI bool operator!=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) { 4570b57cec5SDimitry Andric return !(__x == __y); 4580b57cec5SDimitry Andric} 4590b57cec5SDimitry Andric 4600b57cec5SDimitry Andrictemplate <class _Tp, size_t _Size> 46106c3fb27SDimitry Andricinline _LIBCPP_HIDE_FROM_ABI bool operator<(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) { 4625f757f3fSDimitry Andric return std::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end()); 4630b57cec5SDimitry Andric} 4640b57cec5SDimitry Andric 4650b57cec5SDimitry Andrictemplate <class _Tp, size_t _Size> 46606c3fb27SDimitry Andricinline _LIBCPP_HIDE_FROM_ABI bool operator>(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) { 4670b57cec5SDimitry Andric return __y < __x; 4680b57cec5SDimitry Andric} 4690b57cec5SDimitry Andric 4700b57cec5SDimitry Andrictemplate <class _Tp, size_t _Size> 47106c3fb27SDimitry Andricinline _LIBCPP_HIDE_FROM_ABI bool operator<=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) { 4720b57cec5SDimitry Andric return !(__y < __x); 4730b57cec5SDimitry Andric} 4740b57cec5SDimitry Andric 4750b57cec5SDimitry Andrictemplate <class _Tp, size_t _Size> 47606c3fb27SDimitry Andricinline _LIBCPP_HIDE_FROM_ABI bool operator>=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) { 4770b57cec5SDimitry Andric return !(__x < __y); 4780b57cec5SDimitry Andric} 4790b57cec5SDimitry Andric 48006c3fb27SDimitry Andric# else // _LIBCPP_STD_VER <= 17 48106c3fb27SDimitry Andric 48206c3fb27SDimitry Andrictemplate <class _Tp, size_t _Size> 48306c3fb27SDimitry Andric_LIBCPP_HIDE_FROM_ABI constexpr __synth_three_way_result<_Tp> 48406c3fb27SDimitry Andricoperator<=>(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) { 485*700637cbSDimitry Andric return std::lexicographical_compare_three_way(__x.begin(), __x.end(), __y.begin(), __y.end(), std::__synth_three_way); 48606c3fb27SDimitry Andric} 48706c3fb27SDimitry Andric 48806c3fb27SDimitry Andric# endif // _LIBCPP_STD_VER <= 17 48906c3fb27SDimitry Andric 4900fca6ea1SDimitry Andrictemplate <class _Tp, size_t _Size, __enable_if_t<_Size == 0 || __is_swappable_v<_Tp>, int> = 0> 491cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void swap(array<_Tp, _Size>& __x, array<_Tp, _Size>& __y) 492cb14a3feSDimitry Andric _NOEXCEPT_(noexcept(__x.swap(__y))) { 4930b57cec5SDimitry Andric __x.swap(__y); 4940b57cec5SDimitry Andric} 4950b57cec5SDimitry Andric 4960b57cec5SDimitry Andrictemplate <class _Tp, size_t _Size> 497*700637cbSDimitry Andricstruct tuple_size<array<_Tp, _Size> > : public integral_constant<size_t, _Size> {}; 4980b57cec5SDimitry Andric 4990b57cec5SDimitry Andrictemplate <size_t _Ip, class _Tp, size_t _Size> 500*700637cbSDimitry Andricstruct tuple_element<_Ip, array<_Tp, _Size> > { 5010b57cec5SDimitry Andric static_assert(_Ip < _Size, "Index out of bounds in std::tuple_element<> (std::array)"); 502*700637cbSDimitry Andric using type _LIBCPP_NODEBUG = _Tp; 5030b57cec5SDimitry Andric}; 5040b57cec5SDimitry Andric 5050b57cec5SDimitry Andrictemplate <size_t _Ip, class _Tp, size_t _Size> 506cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 _Tp& get(array<_Tp, _Size>& __a) _NOEXCEPT { 5070b57cec5SDimitry Andric static_assert(_Ip < _Size, "Index out of bounds in std::get<> (std::array)"); 5080b57cec5SDimitry Andric return __a.__elems_[_Ip]; 5090b57cec5SDimitry Andric} 5100b57cec5SDimitry Andric 5110b57cec5SDimitry Andrictemplate <size_t _Ip, class _Tp, size_t _Size> 512cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 const _Tp& get(const array<_Tp, _Size>& __a) _NOEXCEPT { 5130b57cec5SDimitry Andric static_assert(_Ip < _Size, "Index out of bounds in std::get<> (const std::array)"); 5140b57cec5SDimitry Andric return __a.__elems_[_Ip]; 5150b57cec5SDimitry Andric} 5160b57cec5SDimitry Andric 5170b57cec5SDimitry Andrictemplate <size_t _Ip, class _Tp, size_t _Size> 518cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 _Tp&& get(array<_Tp, _Size>&& __a) _NOEXCEPT { 5190b57cec5SDimitry Andric static_assert(_Ip < _Size, "Index out of bounds in std::get<> (std::array &&)"); 5205f757f3fSDimitry Andric return std::move(__a.__elems_[_Ip]); 5210b57cec5SDimitry Andric} 5220b57cec5SDimitry Andric 5230b57cec5SDimitry Andrictemplate <size_t _Ip, class _Tp, size_t _Size> 524cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 const _Tp&& get(const array<_Tp, _Size>&& __a) _NOEXCEPT { 5250b57cec5SDimitry Andric static_assert(_Ip < _Size, "Index out of bounds in std::get<> (const std::array &&)"); 5265f757f3fSDimitry Andric return std::move(__a.__elems_[_Ip]); 5270b57cec5SDimitry Andric} 5280b57cec5SDimitry Andric 52906c3fb27SDimitry Andric# if _LIBCPP_STD_VER >= 20 5305ffd83dbSDimitry Andric 5315ffd83dbSDimitry Andrictemplate <typename _Tp, size_t _Size, size_t... _Index> 5325f757f3fSDimitry Andric_LIBCPP_HIDE_FROM_ABI constexpr array<remove_cv_t<_Tp>, _Size> 5335ffd83dbSDimitry Andric__to_array_lvalue_impl(_Tp (&__arr)[_Size], index_sequence<_Index...>) { 5345ffd83dbSDimitry Andric return {{__arr[_Index]...}}; 5355ffd83dbSDimitry Andric} 5365ffd83dbSDimitry Andric 5375ffd83dbSDimitry Andrictemplate <typename _Tp, size_t _Size, size_t... _Index> 5385f757f3fSDimitry Andric_LIBCPP_HIDE_FROM_ABI constexpr array<remove_cv_t<_Tp>, _Size> 5395ffd83dbSDimitry Andric__to_array_rvalue_impl(_Tp (&&__arr)[_Size], index_sequence<_Index...>) { 5405f757f3fSDimitry Andric return {{std::move(__arr[_Index])...}}; 5415ffd83dbSDimitry Andric} 5425ffd83dbSDimitry Andric 5435ffd83dbSDimitry Andrictemplate <typename _Tp, size_t _Size> 5445f757f3fSDimitry Andric_LIBCPP_HIDE_FROM_ABI constexpr array<remove_cv_t<_Tp>, _Size> 5455ffd83dbSDimitry Andricto_array(_Tp (&__arr)[_Size]) noexcept(is_nothrow_constructible_v<_Tp, _Tp&>) { 546cb14a3feSDimitry Andric static_assert(!is_array_v<_Tp>, "[array.creation]/1: to_array does not accept multidimensional arrays."); 547cb14a3feSDimitry Andric static_assert(is_constructible_v<_Tp, _Tp&>, "[array.creation]/1: to_array requires copy constructible elements."); 5485f757f3fSDimitry Andric return std::__to_array_lvalue_impl(__arr, make_index_sequence<_Size>()); 5495ffd83dbSDimitry Andric} 5505ffd83dbSDimitry Andric 5515ffd83dbSDimitry Andrictemplate <typename _Tp, size_t _Size> 5525f757f3fSDimitry Andric_LIBCPP_HIDE_FROM_ABI constexpr array<remove_cv_t<_Tp>, _Size> 5535ffd83dbSDimitry Andricto_array(_Tp (&&__arr)[_Size]) noexcept(is_nothrow_move_constructible_v<_Tp>) { 554cb14a3feSDimitry Andric static_assert(!is_array_v<_Tp>, "[array.creation]/4: to_array does not accept multidimensional arrays."); 555cb14a3feSDimitry Andric static_assert(is_move_constructible_v<_Tp>, "[array.creation]/4: to_array requires move constructible elements."); 556cb14a3feSDimitry Andric return std::__to_array_rvalue_impl(std::move(__arr), make_index_sequence<_Size>()); 5575ffd83dbSDimitry Andric} 5585ffd83dbSDimitry Andric 55906c3fb27SDimitry Andric# endif // _LIBCPP_STD_VER >= 20 5605ffd83dbSDimitry Andric 5610b57cec5SDimitry Andric_LIBCPP_END_NAMESPACE_STD 5620b57cec5SDimitry Andric 563b3edf446SDimitry Andric_LIBCPP_POP_MACROS 564b3edf446SDimitry Andric 565bdd1243dSDimitry Andric# if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20 566bdd1243dSDimitry Andric# include <algorithm> 567bdd1243dSDimitry Andric# include <concepts> 56806c3fb27SDimitry Andric# include <cstdlib> 569bdd1243dSDimitry Andric# include <iterator> 570*700637cbSDimitry Andric# include <new> 571*700637cbSDimitry Andric# include <optional> 57206c3fb27SDimitry Andric# include <type_traits> 573bdd1243dSDimitry Andric# include <utility> 574bdd1243dSDimitry Andric# endif 575*700637cbSDimitry Andric#endif // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS) 576bdd1243dSDimitry Andric 5770b57cec5SDimitry Andric#endif // _LIBCPP_ARRAY 578