File: array.hpp

package info (click to toggle)
salmon 1.10.3%2Bds1-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 35,148 kB
  • sloc: cpp: 200,707; ansic: 171,082; sh: 859; python: 792; makefile: 238
file content (39 lines) | stat: -rwxr-xr-x 987 bytes parent folder | download | duplicates (9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#ifndef CORE_ARRAY_HPP
#define CORE_ARRAY_HPP

#include <array>

#include <core/type_traits.hpp>
#include <core/functional.hpp>
#include <core/utility.hpp>
#include <core/meta.hpp>

namespace core {
inline namespace v2 {

template <class V = void, class... Args>
constexpr auto make_array (Args&&... args) -> ::std::array<
  meta::either<
    meta::all<
      ::std::is_void<V>::value,
      meta::none_of<meta::list<Args...>, is_reference_wrapper>()
    >(),
    common_type_t<Args...>,
    V
  >,
  sizeof...(Args)
> { return {{ core::forward<Args>(args)... }}; }

template <class T, ::std::size_t N, ::std::size_t... Is>
constexpr auto to_array (T (&array)[N], index_sequence<Is...>) -> ::std::array<
  remove_cv_t<T>, N
> { return {{ array[Is]... }}; }

template <class T, ::std::size_t N>
constexpr auto to_array (T (&array)[N]) -> ::std::array<remove_cv_t<T>, N> {
  return (to_array)(array, make_index_sequence<N> { });
}

}} /* namespace core::v2 */

#endif /* CORE_ARRAY_HPP */