os/ossrv/ossrv_pub/boost_apis/boost/python/args.hpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
// Copyright David Abrahams 2002.
sl@0
     2
// Distributed under the Boost Software License, Version 1.0. (See
sl@0
     3
// accompanying file LICENSE_1_0.txt or copy at
sl@0
     4
// http://www.boost.org/LICENSE_1_0.txt)
sl@0
     5
#ifndef KEYWORDS_DWA2002323_HPP
sl@0
     6
# define KEYWORDS_DWA2002323_HPP
sl@0
     7
sl@0
     8
# include <boost/python/detail/prefix.hpp>
sl@0
     9
sl@0
    10
# include <boost/python/args_fwd.hpp>
sl@0
    11
# include <boost/config.hpp>
sl@0
    12
# include <boost/python/detail/preprocessor.hpp>
sl@0
    13
# include <boost/python/detail/type_list.hpp>
sl@0
    14
sl@0
    15
# include <boost/type_traits/is_reference.hpp>
sl@0
    16
# include <boost/type_traits/remove_reference.hpp>
sl@0
    17
# include <boost/type_traits/remove_cv.hpp>
sl@0
    18
sl@0
    19
# include <boost/preprocessor/enum_params.hpp>
sl@0
    20
# include <boost/preprocessor/repeat.hpp>
sl@0
    21
# include <boost/preprocessor/facilities/intercept.hpp>
sl@0
    22
# include <boost/preprocessor/iteration/local.hpp>
sl@0
    23
sl@0
    24
# include <boost/python/detail/mpl_lambda.hpp>
sl@0
    25
# include <boost/python/object_core.hpp>
sl@0
    26
sl@0
    27
# include <boost/mpl/bool.hpp>
sl@0
    28
sl@0
    29
# include <cstddef>
sl@0
    30
# include <algorithm>
sl@0
    31
sl@0
    32
namespace boost { namespace python {
sl@0
    33
sl@0
    34
typedef detail::keywords<1> arg;
sl@0
    35
typedef arg arg_; // gcc 2.96 workaround
sl@0
    36
sl@0
    37
namespace detail
sl@0
    38
{
sl@0
    39
  template <std::size_t nkeywords>
sl@0
    40
  struct keywords_base
sl@0
    41
  {
sl@0
    42
      BOOST_STATIC_CONSTANT(std::size_t, size = nkeywords);
sl@0
    43
      
sl@0
    44
      keyword_range range() const
sl@0
    45
      {
sl@0
    46
          return keyword_range(elements, elements + nkeywords);
sl@0
    47
      }
sl@0
    48
sl@0
    49
      keyword elements[nkeywords];
sl@0
    50
sl@0
    51
      keywords<nkeywords+1>
sl@0
    52
      operator,(python::arg const &k) const;
sl@0
    53
sl@0
    54
      keywords<nkeywords + 1>
sl@0
    55
      operator,(char const *name) const;
sl@0
    56
  };
sl@0
    57
  
sl@0
    58
  template <std::size_t nkeywords>
sl@0
    59
  struct keywords : keywords_base<nkeywords>
sl@0
    60
  {
sl@0
    61
  };
sl@0
    62
sl@0
    63
  template <>
sl@0
    64
  struct keywords<1> : keywords_base<1>
sl@0
    65
  {
sl@0
    66
      explicit keywords(char const *name)
sl@0
    67
      {
sl@0
    68
          elements[0].name = name;
sl@0
    69
      }
sl@0
    70
    
sl@0
    71
      template <class T>
sl@0
    72
      python::arg& operator=(T const& value)
sl@0
    73
      {
sl@0
    74
          object z(value);
sl@0
    75
          elements[0].default_value = handle<>(python::borrowed(object(value).ptr()));
sl@0
    76
          return *this;
sl@0
    77
      }
sl@0
    78
    
sl@0
    79
      operator detail::keyword const&() const
sl@0
    80
      {
sl@0
    81
          return elements[0];
sl@0
    82
      }
sl@0
    83
  };
sl@0
    84
sl@0
    85
  template <std::size_t nkeywords>
sl@0
    86
  inline
sl@0
    87
  keywords<nkeywords+1>
sl@0
    88
  keywords_base<nkeywords>::operator,(python::arg const &k) const
sl@0
    89
  {
sl@0
    90
      keywords<nkeywords> const& l = *static_cast<keywords<nkeywords> const*>(this);
sl@0
    91
      python::detail::keywords<nkeywords+1> res;
sl@0
    92
      std::copy(l.elements, l.elements+nkeywords, res.elements);
sl@0
    93
      res.elements[nkeywords] = k.elements[0];
sl@0
    94
      return res;
sl@0
    95
  }
sl@0
    96
sl@0
    97
  template <std::size_t nkeywords>
sl@0
    98
  inline
sl@0
    99
  keywords<nkeywords + 1>
sl@0
   100
  keywords_base<nkeywords>::operator,(char const *name) const
sl@0
   101
  {
sl@0
   102
      return this->operator,(python::arg(name));
sl@0
   103
  }
sl@0
   104
sl@0
   105
# ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
sl@0
   106
  template<typename T>
sl@0
   107
  struct is_keywords
sl@0
   108
  {
sl@0
   109
      BOOST_STATIC_CONSTANT(bool, value = false); 
sl@0
   110
  };
sl@0
   111
sl@0
   112
  template<std::size_t nkeywords>
sl@0
   113
  struct is_keywords<keywords<nkeywords> >
sl@0
   114
  {
sl@0
   115
      BOOST_STATIC_CONSTANT(bool, value = true);
sl@0
   116
  };
sl@0
   117
  template <class T>
sl@0
   118
  struct is_reference_to_keywords
sl@0
   119
  {
sl@0
   120
      BOOST_STATIC_CONSTANT(bool, is_ref = is_reference<T>::value);
sl@0
   121
      typedef typename remove_reference<T>::type deref;
sl@0
   122
      typedef typename remove_cv<deref>::type key_t;
sl@0
   123
      BOOST_STATIC_CONSTANT(bool, is_key = is_keywords<key_t>::value);
sl@0
   124
      BOOST_STATIC_CONSTANT(bool, value = (is_ref & is_key));
sl@0
   125
      
sl@0
   126
      typedef mpl::bool_<value> type;
sl@0
   127
      BOOST_PYTHON_MPL_LAMBDA_SUPPORT(1,is_reference_to_keywords,(T))
sl@0
   128
  };
sl@0
   129
# else 
sl@0
   130
  typedef char (&yes_keywords_t)[1];
sl@0
   131
  typedef char (&no_keywords_t)[2];
sl@0
   132
      
sl@0
   133
  no_keywords_t is_keywords_test(...);
sl@0
   134
sl@0
   135
  template<std::size_t nkeywords>
sl@0
   136
  yes_keywords_t is_keywords_test(void (*)(keywords<nkeywords>&));
sl@0
   137
sl@0
   138
  template<std::size_t nkeywords>
sl@0
   139
  yes_keywords_t is_keywords_test(void (*)(keywords<nkeywords> const&));
sl@0
   140
sl@0
   141
  template<typename T>
sl@0
   142
  class is_reference_to_keywords
sl@0
   143
  {
sl@0
   144
   public:
sl@0
   145
      BOOST_STATIC_CONSTANT(
sl@0
   146
          bool, value = (
sl@0
   147
              sizeof(detail::is_keywords_test( (void (*)(T))0 ))
sl@0
   148
              == sizeof(detail::yes_keywords_t)));
sl@0
   149
sl@0
   150
      typedef mpl::bool_<value> type;
sl@0
   151
      BOOST_PYTHON_MPL_LAMBDA_SUPPORT(1,is_reference_to_keywords,(T))
sl@0
   152
  };
sl@0
   153
# endif 
sl@0
   154
}
sl@0
   155
sl@0
   156
inline detail::keywords<1> args(char const* name)
sl@0
   157
{ 
sl@0
   158
    return detail::keywords<1>(name);
sl@0
   159
}
sl@0
   160
sl@0
   161
#  define BOOST_PYTHON_ASSIGN_NAME(z, n, _) result.elements[n].name = name##n;
sl@0
   162
#  define BOOST_PP_LOCAL_MACRO(n)                                               \
sl@0
   163
inline detail::keywords<n> args(BOOST_PP_ENUM_PARAMS_Z(1, n, char const* name)) \
sl@0
   164
{                                                                               \
sl@0
   165
    detail::keywords<n> result;                                                 \
sl@0
   166
    BOOST_PP_REPEAT_1(n, BOOST_PYTHON_ASSIGN_NAME, _)                           \
sl@0
   167
    return result;                                                              \
sl@0
   168
}
sl@0
   169
#  define BOOST_PP_LOCAL_LIMITS (2, BOOST_PYTHON_MAX_ARITY)
sl@0
   170
#  include BOOST_PP_LOCAL_ITERATE()
sl@0
   171
sl@0
   172
}} // namespace boost::python
sl@0
   173
sl@0
   174
sl@0
   175
# endif // KEYWORDS_DWA2002323_HPP