mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-01-31 11:37:35 +00:00
cf93ecbbb2
The whole repository is now buildable with GNU Make Landlock sandboxing. This proves that no Makefile targets exist which touch files other than their declared prerequisites. In order to do this, we had to: 1. Stop code morphing GCC output in package.com and instead run a newly introduced FIXUPOBJ.COM command after GCC invocations. 2. Disable all the crumby Python unit tests that do things like create files in the current directory, or rename() files between folders. This ended up being a lot of tests, but most of them are still ok. 3. Introduce an .UNSANDBOXED variable to GNU Make to disable Landlock. We currently only do this for things like `make tags`. 4. This change deletes some GNU Make code that was preventing the execve() optimization from working. This means it should no longer be necessary in most cases for command invocations to be indirected through the cocmd interpreter. 5. Missing dependencies had to be declared in certain places, in cases where they couldn't be automatically determined by MKDEPS.COM 6. The libcxx header situation has finally been tamed. One of the things that makes this difficult is MKDEPS.COM only wants to consider the first 64kb of a file, in order to go fast. But libcxx likes to have #include lines buried after huge documentation. 7. An .UNVEIL variable has been introduced to GNU Make just in case we ever wish to explicitly specify additional things that need to be whitelisted which aren't strictly prerequisites. This works in a manner similar to the recently introduced .EXTRA_PREREQS feature. There's now a new build/bootstrap/make.com prebuilt binary available. It should no longer be possible to write invalid Makefile code.
482 lines
17 KiB
C++
482 lines
17 KiB
C++
// -*- C++ -*-
|
|
//===---------------------------- array -----------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef _LIBCPP_ARRAY
|
|
#define _LIBCPP_ARRAY
|
|
|
|
#include "third_party/libcxx/__config"
|
|
#include "third_party/libcxx/__tuple"
|
|
#include "third_party/libcxx/type_traits"
|
|
#include "third_party/libcxx/utility"
|
|
#include "third_party/libcxx/iterator"
|
|
#include "third_party/libcxx/algorithm"
|
|
#include "third_party/libcxx/stdexcept"
|
|
#include "third_party/libcxx/cstdlib" // for _LIBCPP_UNREACHABLE
|
|
#include "third_party/libcxx/version"
|
|
#include "third_party/libcxx/__debug"
|
|
|
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
|
#pragma GCC system_header
|
|
#endif
|
|
|
|
_LIBCPP_BEGIN_NAMESPACE_STD
|
|
|
|
/*
|
|
array synopsis
|
|
|
|
namespace std
|
|
{
|
|
template <class T, size_t N >
|
|
struct array
|
|
{
|
|
// types:
|
|
typedef T & reference;
|
|
typedef const T & const_reference;
|
|
typedef implementation defined iterator;
|
|
typedef implementation defined const_iterator;
|
|
typedef size_t size_type;
|
|
typedef ptrdiff_t difference_type;
|
|
typedef T value_type;
|
|
typedef T* pointer;
|
|
typedef const T* const_pointer;
|
|
typedef std::reverse_iterator<iterator> reverse_iterator;
|
|
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
|
|
|
|
// No explicit construct/copy/destroy for aggregate type
|
|
void fill(const T& u);
|
|
void swap(array& a) noexcept(is_nothrow_swappable_v<T>);
|
|
|
|
// iterators:
|
|
iterator begin() noexcept;
|
|
const_iterator begin() const noexcept;
|
|
iterator end() noexcept;
|
|
const_iterator end() const noexcept;
|
|
|
|
reverse_iterator rbegin() noexcept;
|
|
const_reverse_iterator rbegin() const noexcept;
|
|
reverse_iterator rend() noexcept;
|
|
const_reverse_iterator rend() const noexcept;
|
|
|
|
const_iterator cbegin() const noexcept;
|
|
const_iterator cend() const noexcept;
|
|
const_reverse_iterator crbegin() const noexcept;
|
|
const_reverse_iterator crend() const noexcept;
|
|
|
|
// capacity:
|
|
constexpr size_type size() const noexcept;
|
|
constexpr size_type max_size() const noexcept;
|
|
constexpr bool empty() const noexcept;
|
|
|
|
// element access:
|
|
reference operator[](size_type n);
|
|
const_reference operator[](size_type n) const; // constexpr in C++14
|
|
const_reference at(size_type n) const; // constexpr in C++14
|
|
reference at(size_type n);
|
|
|
|
reference front();
|
|
const_reference front() const; // constexpr in C++14
|
|
reference back();
|
|
const_reference back() const; // constexpr in C++14
|
|
|
|
T* data() noexcept;
|
|
const T* data() const noexcept;
|
|
};
|
|
|
|
template <class T, class... U>
|
|
array(T, U...) -> array<T, 1 + sizeof...(U)>;
|
|
|
|
template <class T, size_t N>
|
|
bool operator==(const array<T,N>& x, const array<T,N>& y);
|
|
template <class T, size_t N>
|
|
bool operator!=(const array<T,N>& x, const array<T,N>& y);
|
|
template <class T, size_t N>
|
|
bool operator<(const array<T,N>& x, const array<T,N>& y);
|
|
template <class T, size_t N>
|
|
bool operator>(const array<T,N>& x, const array<T,N>& y);
|
|
template <class T, size_t N>
|
|
bool operator<=(const array<T,N>& x, const array<T,N>& y);
|
|
template <class T, size_t N>
|
|
bool operator>=(const array<T,N>& x, const array<T,N>& y);
|
|
|
|
template <class T, size_t N >
|
|
void swap(array<T,N>& x, array<T,N>& y) noexcept(noexcept(x.swap(y))); // C++17
|
|
|
|
template <class T> struct tuple_size;
|
|
template <size_t I, class T> struct tuple_element;
|
|
template <class T, size_t N> struct tuple_size<array<T, N>>;
|
|
template <size_t I, class T, size_t N> struct tuple_element<I, array<T, N>>;
|
|
template <size_t I, class T, size_t N> T& get(array<T, N>&) noexcept; // constexpr in C++14
|
|
template <size_t I, class T, size_t N> const T& get(const array<T, N>&) noexcept; // constexpr in C++14
|
|
template <size_t I, class T, size_t N> T&& get(array<T, N>&&) noexcept; // constexpr in C++14
|
|
template <size_t I, class T, size_t N> const T&& get(const array<T, N>&&) noexcept; // constexpr in C++14
|
|
|
|
} // std
|
|
|
|
*/
|
|
|
|
|
|
template <class _Tp, size_t _Size>
|
|
struct _LIBCPP_TEMPLATE_VIS array
|
|
{
|
|
// types:
|
|
typedef array __self;
|
|
typedef _Tp value_type;
|
|
typedef value_type& reference;
|
|
typedef const value_type& const_reference;
|
|
typedef value_type* iterator;
|
|
typedef const value_type* const_iterator;
|
|
typedef value_type* pointer;
|
|
typedef const value_type* const_pointer;
|
|
typedef size_t size_type;
|
|
typedef ptrdiff_t difference_type;
|
|
typedef std::reverse_iterator<iterator> reverse_iterator;
|
|
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
|
|
|
|
_Tp __elems_[_Size];
|
|
|
|
// No explicit construct/copy/destroy for aggregate type
|
|
_LIBCPP_INLINE_VISIBILITY void fill(const value_type& __u) {
|
|
_VSTD::fill_n(__elems_, _Size, __u);
|
|
}
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
void swap(array& __a) _NOEXCEPT_(__is_nothrow_swappable<_Tp>::value) {
|
|
std::swap_ranges(__elems_, __elems_ + _Size, __a.__elems_);
|
|
}
|
|
|
|
// iterators:
|
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
|
iterator begin() _NOEXCEPT {return iterator(data());}
|
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
|
const_iterator begin() const _NOEXCEPT {return const_iterator(data());}
|
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
|
iterator end() _NOEXCEPT {return iterator(data() + _Size);}
|
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
|
const_iterator end() const _NOEXCEPT {return const_iterator(data() + _Size);}
|
|
|
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
|
reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());}
|
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
|
const_reverse_iterator rbegin() const _NOEXCEPT {return const_reverse_iterator(end());}
|
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
|
reverse_iterator rend() _NOEXCEPT {return reverse_iterator(begin());}
|
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
|
const_reverse_iterator rend() const _NOEXCEPT {return const_reverse_iterator(begin());}
|
|
|
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
|
const_iterator cbegin() const _NOEXCEPT {return begin();}
|
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
|
const_iterator cend() const _NOEXCEPT {return end();}
|
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
|
const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
|
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
|
const_reverse_iterator crend() const _NOEXCEPT {return rend();}
|
|
|
|
// capacity:
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
_LIBCPP_CONSTEXPR size_type size() const _NOEXCEPT {return _Size;}
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
_LIBCPP_CONSTEXPR size_type max_size() const _NOEXCEPT {return _Size;}
|
|
_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
|
|
_LIBCPP_CONSTEXPR bool empty() const _NOEXCEPT {return false; }
|
|
|
|
// element access:
|
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
|
reference operator[](size_type __n) _NOEXCEPT {return __elems_[__n];}
|
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
|
const_reference operator[](size_type __n) const _NOEXCEPT {return __elems_[__n];}
|
|
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX14 reference at(size_type __n);
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 const_reference at(size_type __n) const;
|
|
|
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reference front() _NOEXCEPT {return __elems_[0];}
|
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const_reference front() const _NOEXCEPT {return __elems_[0];}
|
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reference back() _NOEXCEPT {return __elems_[_Size - 1];}
|
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const_reference back() const _NOEXCEPT {return __elems_[_Size - 1];}
|
|
|
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
|
value_type* data() _NOEXCEPT {return __elems_;}
|
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
|
const value_type* data() const _NOEXCEPT {return __elems_;}
|
|
};
|
|
|
|
|
|
template <class _Tp, size_t _Size>
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX14
|
|
typename array<_Tp, _Size>::reference
|
|
array<_Tp, _Size>::at(size_type __n)
|
|
{
|
|
if (__n >= _Size)
|
|
__throw_out_of_range("array::at");
|
|
|
|
return __elems_[__n];
|
|
}
|
|
|
|
template <class _Tp, size_t _Size>
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX11
|
|
typename array<_Tp, _Size>::const_reference
|
|
array<_Tp, _Size>::at(size_type __n) const
|
|
{
|
|
if (__n >= _Size)
|
|
__throw_out_of_range("array::at");
|
|
return __elems_[__n];
|
|
}
|
|
|
|
template <class _Tp>
|
|
struct _LIBCPP_TEMPLATE_VIS array<_Tp, 0>
|
|
{
|
|
// types:
|
|
typedef array __self;
|
|
typedef _Tp value_type;
|
|
typedef value_type& reference;
|
|
typedef const value_type& const_reference;
|
|
typedef value_type* iterator;
|
|
typedef const value_type* const_iterator;
|
|
typedef value_type* pointer;
|
|
typedef const value_type* const_pointer;
|
|
typedef size_t size_type;
|
|
typedef ptrdiff_t difference_type;
|
|
typedef std::reverse_iterator<iterator> reverse_iterator;
|
|
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
|
|
|
|
typedef typename conditional<is_const<_Tp>::value, const char,
|
|
char>::type _CharType;
|
|
|
|
struct _ArrayInStructT { _Tp __data_[1]; };
|
|
_ALIGNAS_TYPE(_ArrayInStructT) _CharType __elems_[sizeof(_ArrayInStructT)];
|
|
|
|
// No explicit construct/copy/destroy for aggregate type
|
|
_LIBCPP_INLINE_VISIBILITY void fill(const value_type&) {
|
|
static_assert(!is_const<_Tp>::value,
|
|
"cannot fill zero-sized array of type 'const T'");
|
|
}
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
void swap(array&) _NOEXCEPT {
|
|
static_assert(!is_const<_Tp>::value,
|
|
"cannot swap zero-sized array of type 'const T'");
|
|
}
|
|
|
|
// iterators:
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
iterator begin() _NOEXCEPT {return iterator(data());}
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
const_iterator begin() const _NOEXCEPT {return const_iterator(data());}
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
iterator end() _NOEXCEPT {return iterator(data());}
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
const_iterator end() const _NOEXCEPT {return const_iterator(data());}
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());}
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
const_reverse_iterator rbegin() const _NOEXCEPT {return const_reverse_iterator(end());}
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
reverse_iterator rend() _NOEXCEPT {return reverse_iterator(begin());}
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
const_reverse_iterator rend() const _NOEXCEPT {return const_reverse_iterator(begin());}
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
const_iterator cbegin() const _NOEXCEPT {return begin();}
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
const_iterator cend() const _NOEXCEPT {return end();}
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
const_reverse_iterator crend() const _NOEXCEPT {return rend();}
|
|
|
|
// capacity:
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
_LIBCPP_CONSTEXPR size_type size() const _NOEXCEPT {return 0; }
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
_LIBCPP_CONSTEXPR size_type max_size() const _NOEXCEPT {return 0;}
|
|
_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
|
|
_LIBCPP_CONSTEXPR bool empty() const _NOEXCEPT {return true;}
|
|
|
|
// element access:
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
reference operator[](size_type) _NOEXCEPT {
|
|
_LIBCPP_ASSERT(false, "cannot call array<T, 0>::operator[] on a zero-sized array");
|
|
_LIBCPP_UNREACHABLE();
|
|
}
|
|
|
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
|
const_reference operator[](size_type) const _NOEXCEPT {
|
|
_LIBCPP_ASSERT(false, "cannot call array<T, 0>::operator[] on a zero-sized array");
|
|
_LIBCPP_UNREACHABLE();
|
|
}
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
reference at(size_type) {
|
|
__throw_out_of_range("array<T, 0>::at");
|
|
_LIBCPP_UNREACHABLE();
|
|
}
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
const_reference at(size_type) const {
|
|
__throw_out_of_range("array<T, 0>::at");
|
|
_LIBCPP_UNREACHABLE();
|
|
}
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
reference front() _NOEXCEPT {
|
|
_LIBCPP_ASSERT(false, "cannot call array<T, 0>::front() on a zero-sized array");
|
|
_LIBCPP_UNREACHABLE();
|
|
}
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
const_reference front() const _NOEXCEPT {
|
|
_LIBCPP_ASSERT(false, "cannot call array<T, 0>::front() on a zero-sized array");
|
|
_LIBCPP_UNREACHABLE();
|
|
}
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
reference back() _NOEXCEPT {
|
|
_LIBCPP_ASSERT(false, "cannot call array<T, 0>::back() on a zero-sized array");
|
|
_LIBCPP_UNREACHABLE();
|
|
}
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
const_reference back() const _NOEXCEPT {
|
|
_LIBCPP_ASSERT(false, "cannot call array<T, 0>::back() on a zero-sized array");
|
|
_LIBCPP_UNREACHABLE();
|
|
}
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
value_type* data() _NOEXCEPT {return reinterpret_cast<value_type*>(__elems_);}
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
const value_type* data() const _NOEXCEPT {return reinterpret_cast<const value_type*>(__elems_);}
|
|
};
|
|
|
|
|
|
#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
|
|
template<class _Tp, class... _Args,
|
|
class = typename enable_if<(is_same_v<_Tp, _Args> && ...), void>::type
|
|
>
|
|
array(_Tp, _Args...)
|
|
-> array<_Tp, 1 + sizeof...(_Args)>;
|
|
#endif
|
|
|
|
template <class _Tp, size_t _Size>
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
|
|
operator==(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y)
|
|
{
|
|
return _VSTD::equal(__x.begin(), __x.end(), __y.begin());
|
|
}
|
|
|
|
template <class _Tp, size_t _Size>
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
|
|
operator!=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y)
|
|
{
|
|
return !(__x == __y);
|
|
}
|
|
|
|
template <class _Tp, size_t _Size>
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
|
|
operator<(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y)
|
|
{
|
|
return _VSTD::lexicographical_compare(__x.begin(), __x.end(),
|
|
__y.begin(), __y.end());
|
|
}
|
|
|
|
template <class _Tp, size_t _Size>
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
|
|
operator>(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y)
|
|
{
|
|
return __y < __x;
|
|
}
|
|
|
|
template <class _Tp, size_t _Size>
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
|
|
operator<=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y)
|
|
{
|
|
return !(__y < __x);
|
|
}
|
|
|
|
template <class _Tp, size_t _Size>
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
|
|
operator>=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y)
|
|
{
|
|
return !(__x < __y);
|
|
}
|
|
|
|
template <class _Tp, size_t _Size>
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
typename enable_if
|
|
<
|
|
_Size == 0 ||
|
|
__is_swappable<_Tp>::value,
|
|
void
|
|
>::type
|
|
swap(array<_Tp, _Size>& __x, array<_Tp, _Size>& __y)
|
|
_NOEXCEPT_(noexcept(__x.swap(__y)))
|
|
{
|
|
__x.swap(__y);
|
|
}
|
|
|
|
template <class _Tp, size_t _Size>
|
|
struct _LIBCPP_TEMPLATE_VIS tuple_size<array<_Tp, _Size> >
|
|
: public integral_constant<size_t, _Size> {};
|
|
|
|
template <size_t _Ip, class _Tp, size_t _Size>
|
|
struct _LIBCPP_TEMPLATE_VIS tuple_element<_Ip, array<_Tp, _Size> >
|
|
{
|
|
static_assert(_Ip < _Size, "Index out of bounds in std::tuple_element<> (std::array)");
|
|
typedef _Tp type;
|
|
};
|
|
|
|
template <size_t _Ip, class _Tp, size_t _Size>
|
|
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
|
_Tp&
|
|
get(array<_Tp, _Size>& __a) _NOEXCEPT
|
|
{
|
|
static_assert(_Ip < _Size, "Index out of bounds in std::get<> (std::array)");
|
|
return __a.__elems_[_Ip];
|
|
}
|
|
|
|
template <size_t _Ip, class _Tp, size_t _Size>
|
|
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
|
const _Tp&
|
|
get(const array<_Tp, _Size>& __a) _NOEXCEPT
|
|
{
|
|
static_assert(_Ip < _Size, "Index out of bounds in std::get<> (const std::array)");
|
|
return __a.__elems_[_Ip];
|
|
}
|
|
|
|
#ifndef _LIBCPP_CXX03_LANG
|
|
|
|
template <size_t _Ip, class _Tp, size_t _Size>
|
|
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
|
_Tp&&
|
|
get(array<_Tp, _Size>&& __a) _NOEXCEPT
|
|
{
|
|
static_assert(_Ip < _Size, "Index out of bounds in std::get<> (std::array &&)");
|
|
return _VSTD::move(__a.__elems_[_Ip]);
|
|
}
|
|
|
|
template <size_t _Ip, class _Tp, size_t _Size>
|
|
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
|
const _Tp&&
|
|
get(const array<_Tp, _Size>&& __a) _NOEXCEPT
|
|
{
|
|
static_assert(_Ip < _Size, "Index out of bounds in std::get<> (const std::array &&)");
|
|
return _VSTD::move(__a.__elems_[_Ip]);
|
|
}
|
|
|
|
#endif // !_LIBCPP_CXX03_LANG
|
|
|
|
_LIBCPP_END_NAMESPACE_STD
|
|
|
|
#endif // _LIBCPP_ARRAY
|