os/ossrv/ossrv_pub/boost_apis/boost/lambda/detail/actions.hpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
// -- Boost Lambda Library - actions.hpp ----------------------------------
sl@0
     2
sl@0
     3
// Copyright (C) 1999, 2000 Jaakko Järvi (jaakko.jarvi@cs.utu.fi)
sl@0
     4
//
sl@0
     5
// Distributed under the Boost Software License, Version 1.0. (See
sl@0
     6
// accompanying file LICENSE_1_0.txt or copy at
sl@0
     7
// http://www.boost.org/LICENSE_1_0.txt)
sl@0
     8
sl@0
     9
// For more information, see www.boost.org
sl@0
    10
sl@0
    11
// ----------------------------------------------------------------
sl@0
    12
sl@0
    13
#ifndef BOOST_LAMBDA_ACTIONS_HPP
sl@0
    14
#define BOOST_LAMBDA_ACTIONS_HPP
sl@0
    15
sl@0
    16
namespace boost { 
sl@0
    17
namespace lambda {
sl@0
    18
sl@0
    19
sl@0
    20
sl@0
    21
template<int Arity, class Act> class action;
sl@0
    22
sl@0
    23
// these need to be defined here, since the corresponding lambda 
sl@0
    24
// functions are members of lambda_functor classes
sl@0
    25
sl@0
    26
class assignment_action {};
sl@0
    27
class subscript_action {};
sl@0
    28
sl@0
    29
template <class Action> class other_action;
sl@0
    30
sl@0
    31
// action for specifying the explicit return type
sl@0
    32
template <class RET> class explicit_return_type_action {};
sl@0
    33
sl@0
    34
// action for preventing the expansion of a lambda expression
sl@0
    35
struct protect_action {};
sl@0
    36
sl@0
    37
  // must be defined here, comma is a special case
sl@0
    38
struct comma_action {};
sl@0
    39
sl@0
    40
sl@0
    41
  // actions, for which the existence of protect is checked in return type 
sl@0
    42
  // deduction.
sl@0
    43
sl@0
    44
template <class Action> struct is_protectable {
sl@0
    45
  BOOST_STATIC_CONSTANT(bool, value = false);
sl@0
    46
};
sl@0
    47
sl@0
    48
// NOTE: comma action is protectable. Other protectable actions
sl@0
    49
// are listed in operator_actions.hpp
sl@0
    50
sl@0
    51
template<> struct is_protectable<other_action<comma_action> > {
sl@0
    52
  BOOST_STATIC_CONSTANT(bool, value = true);
sl@0
    53
};
sl@0
    54
sl@0
    55
sl@0
    56
namespace detail {
sl@0
    57
sl@0
    58
  // this type is used in return type deductions to signal that deduction 
sl@0
    59
  // did not find a result. It does not necessarily mean an error, it commonly
sl@0
    60
  // means that something else should be tried.
sl@0
    61
  class unspecified {};
sl@0
    62
}
sl@0
    63
sl@0
    64
  // function action is a special case: bind functions can be called with 
sl@0
    65
  // the return type specialized explicitly e.g. bind<int>(foo);
sl@0
    66
  // If this call syntax is used, the return type is stored in the latter
sl@0
    67
  // argument of function_action template. Otherwise the argument gets the type
sl@0
    68
  // 'unspecified'.
sl@0
    69
  // This argument is only relevant in the return type deduction code
sl@0
    70
template <int I, class Result_type = detail::unspecified> 
sl@0
    71
class function_action {};
sl@0
    72
   
sl@0
    73
template<class T> class function_action<1, T> {
sl@0
    74
public:
sl@0
    75
  template<class RET, class A1>
sl@0
    76
  static RET apply(A1& a1) {
sl@0
    77
    return function_adaptor<typename boost::remove_cv<A1>::type>::
sl@0
    78
      template apply<RET>(a1);
sl@0
    79
  }
sl@0
    80
};
sl@0
    81
sl@0
    82
template<class T> class function_action<2, T> {
sl@0
    83
public:
sl@0
    84
  template<class RET, class A1, class A2>
sl@0
    85
  static RET apply(A1& a1, A2& a2) {
sl@0
    86
    return function_adaptor<typename boost::remove_cv<A1>::type>::
sl@0
    87
      template apply<RET>(a1, a2);
sl@0
    88
  }
sl@0
    89
};
sl@0
    90
sl@0
    91
template<class T> class function_action<3, T> {
sl@0
    92
public:
sl@0
    93
  template<class RET, class A1, class A2, class A3>
sl@0
    94
  static RET apply(A1& a1, A2& a2, A3& a3) {
sl@0
    95
    return function_adaptor<typename boost::remove_cv<A1>::type>::
sl@0
    96
      template apply<RET>(a1, a2, a3);
sl@0
    97
  }
sl@0
    98
};
sl@0
    99
sl@0
   100
template<class T> class function_action<4, T> {
sl@0
   101
public:
sl@0
   102
  template<class RET, class A1, class A2, class A3, class A4>
sl@0
   103
  static RET apply(A1& a1, A2& a2, A3& a3, A4& a4) {
sl@0
   104
    return function_adaptor<typename boost::remove_cv<A1>::type>::
sl@0
   105
      template apply<RET>(a1, a2, a3, a4);
sl@0
   106
  }
sl@0
   107
};
sl@0
   108
sl@0
   109
template<class T> class function_action<5, T> {
sl@0
   110
public:
sl@0
   111
  template<class RET, class A1, class A2, class A3, class A4, class A5>
sl@0
   112
  static RET apply(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5) {
sl@0
   113
    return function_adaptor<typename boost::remove_cv<A1>::type>::
sl@0
   114
      template apply<RET>(a1, a2, a3, a4, a5);
sl@0
   115
  }
sl@0
   116
};
sl@0
   117
sl@0
   118
template<class T> class function_action<6, T> {
sl@0
   119
public:
sl@0
   120
  template<class RET, class A1, class A2, class A3, class A4, class A5, 
sl@0
   121
           class A6>
sl@0
   122
  static RET apply(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6) {
sl@0
   123
    return function_adaptor<typename boost::remove_cv<A1>::type>::
sl@0
   124
      template apply<RET>(a1, a2, a3, a4, a5, a6);
sl@0
   125
  }
sl@0
   126
};
sl@0
   127
sl@0
   128
template<class T> class function_action<7, T> {
sl@0
   129
public:
sl@0
   130
  template<class RET, class A1, class A2, class A3, class A4, class A5,  
sl@0
   131
           class A6, class A7>
sl@0
   132
  static RET apply(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7) {
sl@0
   133
    return function_adaptor<typename boost::remove_cv<A1>::type>::
sl@0
   134
      template apply<RET>(a1, a2, a3, a4, a5, a6, a7);
sl@0
   135
  }
sl@0
   136
};
sl@0
   137
sl@0
   138
template<class T> class function_action<8, T> {
sl@0
   139
public:
sl@0
   140
  template<class RET, class A1, class A2, class A3, class A4, class A5, 
sl@0
   141
           class A6, class A7, class A8>
sl@0
   142
  static RET apply(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, 
sl@0
   143
                   A8& a8) {
sl@0
   144
    return function_adaptor<typename boost::remove_cv<A1>::type>::
sl@0
   145
      template apply<RET>(a1, a2, a3, a4, a5, a6, a7, a8);
sl@0
   146
  }
sl@0
   147
};
sl@0
   148
sl@0
   149
template<class T> class function_action<9, T> {
sl@0
   150
public:
sl@0
   151
  template<class RET, class A1, class A2, class A3, class A4, class A5, 
sl@0
   152
           class A6, class A7, class A8, class A9>
sl@0
   153
  static RET apply(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, 
sl@0
   154
                   A8& a8, A9& a9) {
sl@0
   155
    return function_adaptor<typename boost::remove_cv<A1>::type>::
sl@0
   156
      template apply<RET>(a1, a2, a3, a4, a5, a6, a7, a8, a9);
sl@0
   157
  }
sl@0
   158
};
sl@0
   159
sl@0
   160
template<class T> class function_action<10, T> {
sl@0
   161
public:
sl@0
   162
  template<class RET, class A1, class A2, class A3, class A4, class A5, 
sl@0
   163
           class A6, class A7, class A8, class A9, class A10>
sl@0
   164
  static RET apply(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, 
sl@0
   165
                   A8& a8, A9& a9, A10& a10) {
sl@0
   166
    return function_adaptor<typename boost::remove_cv<A1>::type>::
sl@0
   167
      template apply<RET>(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
sl@0
   168
  }
sl@0
   169
};
sl@0
   170
sl@0
   171
} // namespace lambda
sl@0
   172
} // namespace boost
sl@0
   173
sl@0
   174
#endif