xref: /dflybsd-src/contrib/gcc-8.0/libstdc++-v3/include/profile/array (revision 38fd149817dfbff97799f62fcb70be98c4e32523)
1*38fd1498Szrj// Profile array implementation -*- C++ -*-
2*38fd1498Szrj
3*38fd1498Szrj// Copyright (C) 2012-2018 Free Software Foundation, Inc.
4*38fd1498Szrj//
5*38fd1498Szrj// This file is part of the GNU ISO C++ Library.  This library is free
6*38fd1498Szrj// software; you can redistribute it and/or modify it under the
7*38fd1498Szrj// terms of the GNU General Public License as published by the
8*38fd1498Szrj// Free Software Foundation; either version 3, or (at your option)
9*38fd1498Szrj// any later version.
10*38fd1498Szrj
11*38fd1498Szrj// This library is distributed in the hope that it will be useful,
12*38fd1498Szrj// but WITHOUT ANY WARRANTY; without even the implied warranty of
13*38fd1498Szrj// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14*38fd1498Szrj// GNU General Public License for more details.
15*38fd1498Szrj
16*38fd1498Szrj// Under Section 7 of GPL version 3, you are granted additional
17*38fd1498Szrj// permissions described in the GCC Runtime Library Exception, version
18*38fd1498Szrj// 3.1, as published by the Free Software Foundation.
19*38fd1498Szrj
20*38fd1498Szrj// You should have received a copy of the GNU General Public License and
21*38fd1498Szrj// a copy of the GCC Runtime Library Exception along with this program;
22*38fd1498Szrj// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23*38fd1498Szrj// <http://www.gnu.org/licenses/>.
24*38fd1498Szrj
25*38fd1498Szrj/** @file profile/array
26*38fd1498Szrj *  This is a Standard C++ Library header.
27*38fd1498Szrj */
28*38fd1498Szrj
29*38fd1498Szrj#ifndef _GLIBCXX_PROFILE_ARRAY
30*38fd1498Szrj#define _GLIBCXX_PROFILE_ARRAY 1
31*38fd1498Szrj
32*38fd1498Szrj#pragma GCC system_header
33*38fd1498Szrj
34*38fd1498Szrj#include <array>
35*38fd1498Szrj
36*38fd1498Szrjnamespace std _GLIBCXX_VISIBILITY(default)
37*38fd1498Szrj{
38*38fd1498Szrjnamespace __profile
39*38fd1498Szrj{
40*38fd1498Szrj  template<typename _Tp, std::size_t _Nm>
41*38fd1498Szrj    struct array
42*38fd1498Szrj    {
43*38fd1498Szrj      typedef _Tp 	    			      value_type;
44*38fd1498Szrj      typedef value_type*			      pointer;
45*38fd1498Szrj      typedef const value_type*                       const_pointer;
46*38fd1498Szrj      typedef value_type&                   	      reference;
47*38fd1498Szrj      typedef const value_type&             	      const_reference;
48*38fd1498Szrj      typedef value_type*                             iterator;
49*38fd1498Szrj      typedef const value_type*                       const_iterator;
50*38fd1498Szrj      typedef std::size_t                    	      size_type;
51*38fd1498Szrj      typedef std::ptrdiff_t                   	      difference_type;
52*38fd1498Szrj      typedef std::reverse_iterator<iterator>	      reverse_iterator;
53*38fd1498Szrj      typedef std::reverse_iterator<const_iterator>   const_reverse_iterator;
54*38fd1498Szrj
55*38fd1498Szrj      // Support for zero-sized arrays mandatory.
56*38fd1498Szrj      typedef _GLIBCXX_STD_C::__array_traits<_Tp, _Nm> _AT_Type;
57*38fd1498Szrj      typename _AT_Type::_Type                         _M_elems;
58*38fd1498Szrj
59*38fd1498Szrj      // No explicit construct/copy/destroy for aggregate type.
60*38fd1498Szrj
61*38fd1498Szrj      // DR 776.
62*38fd1498Szrj      void
63*38fd1498Szrj      fill(const value_type& __u)
64*38fd1498Szrj      { std::fill_n(begin(), size(), __u); }
65*38fd1498Szrj
66*38fd1498Szrj      void
67*38fd1498Szrj      swap(array& __other)
68*38fd1498Szrj      noexcept(_AT_Type::_Is_nothrow_swappable::value)
69*38fd1498Szrj      { std::swap_ranges(begin(), end(), __other.begin()); }
70*38fd1498Szrj
71*38fd1498Szrj      // Iterators.
72*38fd1498Szrj      _GLIBCXX17_CONSTEXPR iterator
73*38fd1498Szrj      begin() noexcept
74*38fd1498Szrj      { return iterator(data()); }
75*38fd1498Szrj
76*38fd1498Szrj      _GLIBCXX17_CONSTEXPR const_iterator
77*38fd1498Szrj      begin() const noexcept
78*38fd1498Szrj      { return const_iterator(data()); }
79*38fd1498Szrj
80*38fd1498Szrj      _GLIBCXX17_CONSTEXPR iterator
81*38fd1498Szrj      end() noexcept
82*38fd1498Szrj      { return iterator(data() + _Nm); }
83*38fd1498Szrj
84*38fd1498Szrj      _GLIBCXX17_CONSTEXPR const_iterator
85*38fd1498Szrj      end() const noexcept
86*38fd1498Szrj      { return const_iterator(data() + _Nm); }
87*38fd1498Szrj
88*38fd1498Szrj      _GLIBCXX17_CONSTEXPR reverse_iterator
89*38fd1498Szrj      rbegin() noexcept
90*38fd1498Szrj      { return reverse_iterator(end()); }
91*38fd1498Szrj
92*38fd1498Szrj      _GLIBCXX17_CONSTEXPR const_reverse_iterator
93*38fd1498Szrj      rbegin() const noexcept
94*38fd1498Szrj      { return const_reverse_iterator(end()); }
95*38fd1498Szrj
96*38fd1498Szrj      _GLIBCXX17_CONSTEXPR reverse_iterator
97*38fd1498Szrj      rend() noexcept
98*38fd1498Szrj      { return reverse_iterator(begin()); }
99*38fd1498Szrj
100*38fd1498Szrj      _GLIBCXX17_CONSTEXPR const_reverse_iterator
101*38fd1498Szrj      rend() const noexcept
102*38fd1498Szrj      { return const_reverse_iterator(begin()); }
103*38fd1498Szrj
104*38fd1498Szrj      _GLIBCXX17_CONSTEXPR const_iterator
105*38fd1498Szrj      cbegin() const noexcept
106*38fd1498Szrj      { return const_iterator(data()); }
107*38fd1498Szrj
108*38fd1498Szrj      _GLIBCXX17_CONSTEXPR const_iterator
109*38fd1498Szrj      cend() const noexcept
110*38fd1498Szrj      { return const_iterator(data() + _Nm); }
111*38fd1498Szrj
112*38fd1498Szrj      _GLIBCXX17_CONSTEXPR const_reverse_iterator
113*38fd1498Szrj      crbegin() const noexcept
114*38fd1498Szrj      { return const_reverse_iterator(end()); }
115*38fd1498Szrj
116*38fd1498Szrj      _GLIBCXX17_CONSTEXPR const_reverse_iterator
117*38fd1498Szrj      crend() const noexcept
118*38fd1498Szrj      { return const_reverse_iterator(begin()); }
119*38fd1498Szrj
120*38fd1498Szrj      // Capacity.
121*38fd1498Szrj      constexpr size_type
122*38fd1498Szrj      size() const noexcept { return _Nm; }
123*38fd1498Szrj
124*38fd1498Szrj      constexpr size_type
125*38fd1498Szrj      max_size() const noexcept { return _Nm; }
126*38fd1498Szrj
127*38fd1498Szrj      constexpr bool
128*38fd1498Szrj      empty() const noexcept { return size() == 0; }
129*38fd1498Szrj
130*38fd1498Szrj      // Element access.
131*38fd1498Szrj      reference
132*38fd1498Szrj      operator[](size_type __n) noexcept
133*38fd1498Szrj      {	return _AT_Type::_S_ref(_M_elems, __n); }
134*38fd1498Szrj
135*38fd1498Szrj      constexpr const_reference
136*38fd1498Szrj      operator[](size_type __n) const noexcept
137*38fd1498Szrj      { return _AT_Type::_S_ref(_M_elems, __n); }
138*38fd1498Szrj
139*38fd1498Szrj      _GLIBCXX17_CONSTEXPR reference
140*38fd1498Szrj      at(size_type __n)
141*38fd1498Szrj      {
142*38fd1498Szrj	if (__n >= _Nm)
143*38fd1498Szrj	  std::__throw_out_of_range_fmt(__N("array::at: __n "
144*38fd1498Szrj				            "(which is %zu) >= _Nm "
145*38fd1498Szrj					    "(which is %zu)"),
146*38fd1498Szrj					__n, _Nm);
147*38fd1498Szrj	return _AT_Type::_S_ref(_M_elems, __n);
148*38fd1498Szrj      }
149*38fd1498Szrj
150*38fd1498Szrj      constexpr const_reference
151*38fd1498Szrj      at(size_type __n) const
152*38fd1498Szrj      {
153*38fd1498Szrj	// Result of conditional expression must be an lvalue so use
154*38fd1498Szrj	// boolean ? lvalue : (throw-expr, lvalue)
155*38fd1498Szrj	return __n < _Nm ? _AT_Type::_S_ref(_M_elems, __n)
156*38fd1498Szrj	  : (std::__throw_out_of_range_fmt(__N("array::at: __n (which is %zu) "
157*38fd1498Szrj					       ">= _Nm (which is %zu)"),
158*38fd1498Szrj					   __n, _Nm),
159*38fd1498Szrj	     _AT_Type::_S_ref(_M_elems, 0));
160*38fd1498Szrj      }
161*38fd1498Szrj
162*38fd1498Szrj      _GLIBCXX17_CONSTEXPR reference
163*38fd1498Szrj      front() noexcept
164*38fd1498Szrj      { return *begin(); }
165*38fd1498Szrj
166*38fd1498Szrj      constexpr const_reference
167*38fd1498Szrj      front() const noexcept
168*38fd1498Szrj      { return _AT_Type::_S_ref(_M_elems, 0); }
169*38fd1498Szrj
170*38fd1498Szrj      _GLIBCXX17_CONSTEXPR reference
171*38fd1498Szrj      back() noexcept
172*38fd1498Szrj      { return _Nm ? *(end() - 1) : *end(); }
173*38fd1498Szrj
174*38fd1498Szrj      constexpr const_reference
175*38fd1498Szrj      back() const noexcept
176*38fd1498Szrj      {
177*38fd1498Szrj	return _Nm ? _AT_Type::_S_ref(_M_elems, _Nm - 1)
178*38fd1498Szrj		   : _AT_Type::_S_ref(_M_elems, 0);
179*38fd1498Szrj      }
180*38fd1498Szrj
181*38fd1498Szrj      _GLIBCXX17_CONSTEXPR pointer
182*38fd1498Szrj      data() noexcept
183*38fd1498Szrj      { return _AT_Type::_S_ptr(_M_elems); }
184*38fd1498Szrj
185*38fd1498Szrj      _GLIBCXX17_CONSTEXPR const_pointer
186*38fd1498Szrj      data() const noexcept
187*38fd1498Szrj      { return _AT_Type::_S_ptr(_M_elems); }
188*38fd1498Szrj    };
189*38fd1498Szrj
190*38fd1498Szrj  // Array comparisons.
191*38fd1498Szrj  template<typename _Tp, std::size_t _Nm>
192*38fd1498Szrj    inline bool
193*38fd1498Szrj    operator==(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two)
194*38fd1498Szrj    { return std::equal(__one.begin(), __one.end(), __two.begin()); }
195*38fd1498Szrj
196*38fd1498Szrj  template<typename _Tp, std::size_t _Nm>
197*38fd1498Szrj    inline bool
198*38fd1498Szrj    operator!=(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two)
199*38fd1498Szrj    { return !(__one == __two); }
200*38fd1498Szrj
201*38fd1498Szrj  template<typename _Tp, std::size_t _Nm>
202*38fd1498Szrj    inline bool
203*38fd1498Szrj    operator<(const array<_Tp, _Nm>& __a, const array<_Tp, _Nm>& __b)
204*38fd1498Szrj    {
205*38fd1498Szrj      return std::lexicographical_compare(__a.begin(), __a.end(),
206*38fd1498Szrj					  __b.begin(), __b.end());
207*38fd1498Szrj    }
208*38fd1498Szrj
209*38fd1498Szrj  template<typename _Tp, std::size_t _Nm>
210*38fd1498Szrj    inline bool
211*38fd1498Szrj    operator>(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two)
212*38fd1498Szrj    { return __two < __one; }
213*38fd1498Szrj
214*38fd1498Szrj  template<typename _Tp, std::size_t _Nm>
215*38fd1498Szrj    inline bool
216*38fd1498Szrj    operator<=(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two)
217*38fd1498Szrj    { return !(__one > __two); }
218*38fd1498Szrj
219*38fd1498Szrj  template<typename _Tp, std::size_t _Nm>
220*38fd1498Szrj    inline bool
221*38fd1498Szrj    operator>=(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two)
222*38fd1498Szrj    { return !(__one < __two); }
223*38fd1498Szrj
224*38fd1498Szrj  // Specialized algorithms.
225*38fd1498Szrj  template<typename _Tp, std::size_t _Nm>
226*38fd1498Szrj    inline void
227*38fd1498Szrj    swap(array<_Tp, _Nm>& __one, array<_Tp, _Nm>& __two)
228*38fd1498Szrj    noexcept(noexcept(__one.swap(__two)))
229*38fd1498Szrj    { __one.swap(__two); }
230*38fd1498Szrj
231*38fd1498Szrj  template<std::size_t _Int, typename _Tp, std::size_t _Nm>
232*38fd1498Szrj    constexpr _Tp&
233*38fd1498Szrj    get(array<_Tp, _Nm>& __arr) noexcept
234*38fd1498Szrj    {
235*38fd1498Szrj      static_assert(_Int < _Nm, "index is out of bounds");
236*38fd1498Szrj      return _GLIBCXX_STD_C::__array_traits<_Tp, _Nm>::
237*38fd1498Szrj	_S_ref(__arr._M_elems, _Int);
238*38fd1498Szrj    }
239*38fd1498Szrj
240*38fd1498Szrj  template<std::size_t _Int, typename _Tp, std::size_t _Nm>
241*38fd1498Szrj    constexpr _Tp&&
242*38fd1498Szrj    get(array<_Tp, _Nm>&& __arr) noexcept
243*38fd1498Szrj    {
244*38fd1498Szrj      static_assert(_Int < _Nm, "index is out of bounds");
245*38fd1498Szrj      return std::move(__profile::get<_Int>(__arr));
246*38fd1498Szrj    }
247*38fd1498Szrj
248*38fd1498Szrj  template<std::size_t _Int, typename _Tp, std::size_t _Nm>
249*38fd1498Szrj    constexpr const _Tp&
250*38fd1498Szrj    get(const array<_Tp, _Nm>& __arr) noexcept
251*38fd1498Szrj    {
252*38fd1498Szrj      static_assert(_Int < _Nm, "index is out of bounds");
253*38fd1498Szrj      return _GLIBCXX_STD_C::__array_traits<_Tp, _Nm>::
254*38fd1498Szrj	_S_ref(__arr._M_elems, _Int);
255*38fd1498Szrj    }
256*38fd1498Szrj} // namespace __profile
257*38fd1498Szrj
258*38fd1498Szrj_GLIBCXX_BEGIN_NAMESPACE_VERSION
259*38fd1498Szrj  // Tuple interface to class template array.
260*38fd1498Szrj
261*38fd1498Szrj  /// tuple_size
262*38fd1498Szrj  template<typename _Tp, std::size_t _Nm>
263*38fd1498Szrj    struct tuple_size<std::__profile::array<_Tp, _Nm>>
264*38fd1498Szrj    : public integral_constant<std::size_t, _Nm> { };
265*38fd1498Szrj
266*38fd1498Szrj  /// tuple_element
267*38fd1498Szrj  template<std::size_t _Int, typename _Tp, std::size_t _Nm>
268*38fd1498Szrj    struct tuple_element<_Int, std::__profile::array<_Tp, _Nm>>
269*38fd1498Szrj    {
270*38fd1498Szrj      static_assert(_Int < _Nm, "index is out of bounds");
271*38fd1498Szrj      typedef _Tp type;
272*38fd1498Szrj    };
273*38fd1498Szrj
274*38fd1498Szrj  template<typename _Tp, std::size_t _Nm>
275*38fd1498Szrj    struct __is_tuple_like_impl<std::__profile::array<_Tp, _Nm>> : true_type
276*38fd1498Szrj    { };
277*38fd1498Szrj
278*38fd1498Szrj_GLIBCXX_END_NAMESPACE_VERSION
279*38fd1498Szrj} // namespace std
280*38fd1498Szrj
281*38fd1498Szrj#endif // _GLIBCXX_PROFILE_ARRAY
282