]> git.ipfire.org Git - thirdparty/gcc.git/blame - libstdc++-v3/include/experimental/array
Update copyright years.
[thirdparty/gcc.git] / libstdc++-v3 / include / experimental / array
CommitLineData
9638eccd
VV
1// <experimental/array> -*- C++ -*-
2
cbe34bb5 3// Copyright (C) 2015-2017 Free Software Foundation, Inc.
9638eccd
VV
4//
5// This file is part of the GNU ISO C++ Library. This library is free
6// software; you can redistribute it and/or modify it under the
7// terms of the GNU General Public License as published by the
8// Free Software Foundation; either version 3, or (at your option)
9// any later version.
10
11// This library is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14// GNU General Public License for more details.
15
16// Under Section 7 of GPL version 3, you are granted additional
17// permissions described in the GCC Runtime Library Exception, version
18// 3.1, as published by the Free Software Foundation.
19
20// You should have received a copy of the GNU General Public License and
21// a copy of the GCC Runtime Library Exception along with this program;
22// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23// <http://www.gnu.org/licenses/>.
24
25/** @file experimental/array
26 * This is a TS C++ Library header.
27 */
28
29#ifndef _GLIBCXX_EXPERIMENTAL_ARRAY
30#define _GLIBCXX_EXPERIMENTAL_ARRAY 1
31
32#pragma GCC system_header
33
34#if __cplusplus <= 201103L
35# include <bits/c++14_warning.h>
36#else
37
38#include <array>
9638eccd
VV
39#include <experimental/type_traits>
40
41namespace std _GLIBCXX_VISIBILITY(default)
42{
43namespace experimental
44{
45inline namespace fundamentals_v2
46{
47_GLIBCXX_BEGIN_NAMESPACE_VERSION
48
357c9f7e 49#define __cpp_lib_experimental_make_array 201505
9638eccd
VV
50 /**
51 * @defgroup make_array Array creation functions
52 * @ingroup experimental
53 *
54 * Array creation functions as described in N4529,
55 * Working Draft, C++ Extensions for Library Fundamentals, Version 2
56 *
57 * @{
58 */
59
60template <typename _Up>
61 struct __is_reference_wrapper : false_type
62 {};
63
64template <typename _Up>
65 struct __is_reference_wrapper<reference_wrapper<_Up>> : true_type
66 {};
67
68template <typename _Dest = void, typename... _Types>
69 constexpr auto
70 make_array(_Types&&... __t)
71 -> array<conditional_t<is_void_v<_Dest>,
72 common_type_t<_Types...>,
73 _Dest>,
74 sizeof...(_Types)>
75 {
76 static_assert(__or_<
77 __not_<is_void<_Dest>>,
78 __and_<__not_<__is_reference_wrapper<decay_t<_Types>>>...>>
79 ::value,
80 "make_array cannot be used without an explicit target type "
81 "if any of the types given is a reference_wrapper");
82 return {{forward<_Types>(__t)...}};
83 }
84
85template <typename _Tp, size_t _Nm, size_t... _Idx>
86 constexpr array<remove_cv_t<_Tp>, _Nm>
87 __to_array(_Tp (&__a)[_Nm],
88 index_sequence<_Idx...>)
89 {
90 return {{__a[_Idx]...}};
91 }
92
93template <typename _Tp, size_t _Nm>
94 constexpr array<remove_cv_t<_Tp>, _Nm>
95 to_array(_Tp (&__a)[_Nm])
96 {
97 return __to_array(__a, make_index_sequence<_Nm>{});
98 }
99
100 // @} group make_array
101 _GLIBCXX_END_NAMESPACE_VERSION
102} // namespace fundamentals_v2
103} // namespace experimental
104
105} // namespace std
106
107#endif // C++14
108
109#endif // _GLIBCXX_EXPERIMENTAL_ARRAY