xenium
Loading...
Searching...
No Matches
parameter.hpp
1//
2// Copyright (c) 2018-2020 Manuel Pöter.
3// Licensed under the MIT License. See LICENSE file in the project root for full license information.
4//
5
6#ifndef XENIUM_PARAMETER_HPP
7#define XENIUM_PARAMETER_HPP
8
9#include <type_traits>
10
11namespace xenium { namespace parameter {
12
13 struct nil;
14
15 template <class T> struct is_set : std::true_type {};
16 template <> struct is_set<nil> : std::false_type {};
17
18 template <class... Args>
19 struct pack;
20
21 // type_param
22
23 template<template <class> class Policy, class Pack, class Default = nil>
24 struct type_param;
25
26 template<template <class> class Policy, class Default, class Arg, class... Args>
27 struct type_param<Policy, pack<Arg, Args...>, Default> {
28 using type = typename type_param<Policy, pack<Args...>, Default>::type;
29 };
30
31 template<template <class> class Policy, class T, class Default, class... Args>
32 struct type_param<Policy, pack<Policy<T>, Args...>, Default> {
33 using type = T;
34 };
35
36 template<template <class> class Policy, class Default>
37 struct type_param<Policy, pack<>, Default> {
38 using type = Default;
39 };
40
41 template<template <class> class Policy, class Default, class... Args>
42 using type_param_t = typename type_param<Policy, pack<Args...>, Default>::type;
43
44 // value_param
45
46 template<class ValueType, template <ValueType> class Policy, class Pack, ValueType Default>
47 struct value_param;
48
49 template<class ValueType, template <ValueType> class Policy, ValueType Default, class Arg, class... Args>
50 struct value_param<ValueType, Policy, pack<Arg, Args...>, Default> {
51 static constexpr ValueType value = value_param<ValueType, Policy, pack<Args...>, Default>::value;
52 };
53
54 template<class ValueType, template <ValueType> class Policy, ValueType Value, ValueType Default, class... Args>
55 struct value_param<ValueType, Policy, pack<Policy<Value>, Args...>, Default> {
56 static constexpr ValueType value = Value;
57 };
58
59 template<class ValueType, template <ValueType> class Policy, ValueType Default>
60 struct value_param<ValueType, Policy, pack<>, Default> {
61 static constexpr ValueType value = Default;
62 };
63
64 template<class ValueType, template <ValueType> class Policy, ValueType Default, class... Args>
65 using value_param_t = value_param<ValueType, Policy, pack<Args...>, Default>;
66}}
67
68#endif