Blame view

3rdparty/boost_1_81_0/boost/mp11/bind.hpp 2.79 KB
63e88f80   Hu Chunming   提交三方库
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
  #ifndef BOOST_MP11_BIND_HPP_INCLUDED
  #define BOOST_MP11_BIND_HPP_INCLUDED
  
  //  Copyright 2017, 2018 Peter Dimov.
  //
  //  Distributed under the Boost Software License, Version 1.0.
  //
  //  See accompanying file LICENSE_1_0.txt or copy at
  //  http://www.boost.org/LICENSE_1_0.txt
  
  #include <boost/mp11/algorithm.hpp>
  #include <boost/mp11/utility.hpp>
  #include <cstddef>
  
  namespace boost
  {
  namespace mp11
  {
  
  // mp_bind_front
  template<template<class...> class F, class... T> struct mp_bind_front
  {
      // the indirection through mp_defer works around the language inability
      // to expand U... into a fixed parameter list of an alias template
  
      template<class... U> using fn = typename mp_defer<F, T..., U...>::type;
  };
  
  template<class Q, class... T> using mp_bind_front_q = mp_bind_front<Q::template fn, T...>;
  
  // mp_bind_back
  template<template<class...> class F, class... T> struct mp_bind_back
  {
      template<class... U> using fn = typename mp_defer<F, U..., T...>::type;
  };
  
  template<class Q, class... T> using mp_bind_back_q = mp_bind_back<Q::template fn, T...>;
  
  // mp_arg
  template<std::size_t I> struct mp_arg
  {
      template<class... T> using fn = mp_at_c<mp_list<T...>, I>;
  };
  
  using _1 = mp_arg<0>;
  using _2 = mp_arg<1>;
  using _3 = mp_arg<2>;
  using _4 = mp_arg<3>;
  using _5 = mp_arg<4>;
  using _6 = mp_arg<5>;
  using _7 = mp_arg<6>;
  using _8 = mp_arg<7>;
  using _9 = mp_arg<8>;
  
  // mp_bind
  template<template<class...> class F, class... T> struct mp_bind;
  
  namespace detail
  {
  
  template<class V, class... T> struct eval_bound_arg
  {
      using type = V;
  };
  
  template<std::size_t I, class... T> struct eval_bound_arg<mp_arg<I>, T...>
  {
      using type = typename mp_arg<I>::template fn<T...>;
  };
  
  template<template<class...> class F, class... U, class... T> struct eval_bound_arg<mp_bind<F, U...>, T...>
  {
      using type = typename mp_bind<F, U...>::template fn<T...>;
  };
  
  template<template<class...> class F, class... U, class... T> struct eval_bound_arg<mp_bind_front<F, U...>, T...>
  {
      using type = typename mp_bind_front<F, U...>::template fn<T...>;
  };
  
  template<template<class...> class F, class... U, class... T> struct eval_bound_arg<mp_bind_back<F, U...>, T...>
  {
      using type = typename mp_bind_back<F, U...>::template fn<T...>;
  };
  
  } // namespace detail
  
  template<template<class...> class F, class... T> struct mp_bind
  {
  #if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, == 1915 )
  private:
  
      template<class... U> struct _f { using type = F<typename detail::eval_bound_arg<T, U...>::type...>; };
  
  public:
  
      template<class... U> using fn = typename _f<U...>::type;
  
  #else
  
      template<class... U> using fn = F<typename detail::eval_bound_arg<T, U...>::type...>;
  
  #endif
  };
  
  template<class Q, class... T> using mp_bind_q = mp_bind<Q::template fn, T...>;
  
  } // namespace mp11
  } // namespace boost
  
  #endif // #ifndef BOOST_MP11_BIND_HPP_INCLUDED