annotate DEPENDENCIES/generic/include/boost/python/object/make_holder.hpp @ 133:4acb5d8d80b6 tip

Don't fail environmental check if README.md exists (but .txt and no-suffix don't)
author Chris Cannam
date Tue, 30 Jul 2019 12:25:44 +0100
parents 2665513ce2d3
children
rev   line source
Chris@16 1 #if !defined(BOOST_PP_IS_ITERATING)
Chris@16 2
Chris@16 3 // Copyright David Abrahams 2001.
Chris@16 4 // Distributed under the Boost Software License, Version 1.0. (See
Chris@16 5 // accompanying file LICENSE_1_0.txt or copy at
Chris@16 6 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 7
Chris@16 8 # ifndef MAKE_HOLDER_DWA20011215_HPP
Chris@16 9 # define MAKE_HOLDER_DWA20011215_HPP
Chris@16 10
Chris@16 11 # include <boost/python/detail/prefix.hpp>
Chris@16 12
Chris@16 13 # include <boost/python/object/instance.hpp>
Chris@16 14 # include <boost/python/converter/registry.hpp>
Chris@16 15 #if !defined( BOOST_PYTHON_NO_PY_SIGNATURES) && defined( BOOST_PYTHON_PY_SIGNATURES_PROPER_INIT_SELF_TYPE)
Chris@16 16 # include <boost/python/detail/python_type.hpp>
Chris@16 17 #endif
Chris@16 18
Chris@16 19 # include <boost/python/object/forward.hpp>
Chris@16 20 # include <boost/python/detail/preprocessor.hpp>
Chris@16 21
Chris@16 22 # include <boost/mpl/next.hpp>
Chris@16 23 # include <boost/mpl/begin_end.hpp>
Chris@16 24 # include <boost/mpl/deref.hpp>
Chris@16 25
Chris@16 26 # include <boost/preprocessor/iterate.hpp>
Chris@16 27 # include <boost/preprocessor/iteration/local.hpp>
Chris@16 28 # include <boost/preprocessor/repeat.hpp>
Chris@16 29 # include <boost/preprocessor/debug/line.hpp>
Chris@16 30 # include <boost/preprocessor/repetition/enum_trailing_binary_params.hpp>
Chris@16 31
Chris@16 32 # include <cstddef>
Chris@16 33
Chris@16 34 namespace boost { namespace python { namespace objects {
Chris@16 35
Chris@16 36 template <int nargs> struct make_holder;
Chris@16 37
Chris@16 38 # define BOOST_PYTHON_DO_FORWARD_ARG(z, index, _) , f##index(a##index)
Chris@16 39
Chris@16 40 // specializations...
Chris@16 41 # define BOOST_PP_ITERATION_PARAMS_1 (3, (0, BOOST_PYTHON_MAX_ARITY, <boost/python/object/make_holder.hpp>))
Chris@16 42 # include BOOST_PP_ITERATE()
Chris@16 43
Chris@16 44 # undef BOOST_PYTHON_DO_FORWARD_ARG
Chris@16 45
Chris@16 46 }}} // namespace boost::python::objects
Chris@16 47
Chris@16 48 # endif // MAKE_HOLDER_DWA20011215_HPP
Chris@16 49
Chris@16 50 // For gcc 4.4 compatability, we must include the
Chris@16 51 // BOOST_PP_ITERATION_DEPTH test inside an #else clause.
Chris@16 52 #else // BOOST_PP_IS_ITERATING
Chris@16 53 #if BOOST_PP_ITERATION_DEPTH() == 1
Chris@16 54 # if !(BOOST_WORKAROUND(__MWERKS__, > 0x3100) \
Chris@16 55 && BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3201)))
Chris@16 56 # line BOOST_PP_LINE(__LINE__, make_holder.hpp)
Chris@16 57 # endif
Chris@16 58
Chris@16 59 # define N BOOST_PP_ITERATION()
Chris@16 60
Chris@16 61 template <>
Chris@16 62 struct make_holder<N>
Chris@16 63 {
Chris@16 64 template <class Holder, class ArgList>
Chris@16 65 struct apply
Chris@16 66 {
Chris@16 67 # if N
Chris@16 68 // Unrolled iteration through each argument type in ArgList,
Chris@16 69 // choosing the type that will be forwarded on to the holder's
Chris@16 70 // templated constructor.
Chris@16 71 typedef typename mpl::begin<ArgList>::type iter0;
Chris@16 72
Chris@16 73 # define BOOST_PP_LOCAL_MACRO(n) \
Chris@16 74 typedef typename mpl::deref<iter##n>::type t##n; \
Chris@16 75 typedef typename forward<t##n>::type f##n; \
Chris@16 76 typedef typename mpl::next<iter##n>::type \
Chris@16 77 BOOST_PP_CAT(iter,BOOST_PP_INC(n)); // Next iterator type
Chris@16 78
Chris@16 79 # define BOOST_PP_LOCAL_LIMITS (0, N-1)
Chris@16 80 # include BOOST_PP_LOCAL_ITERATE()
Chris@16 81 # endif
Chris@16 82
Chris@16 83 static void execute(
Chris@16 84 #if !defined( BOOST_PYTHON_NO_PY_SIGNATURES) && defined( BOOST_PYTHON_PY_SIGNATURES_PROPER_INIT_SELF_TYPE)
Chris@16 85 boost::python::detail::python_class<BOOST_DEDUCED_TYPENAME Holder::value_type> *p
Chris@16 86 #else
Chris@16 87 PyObject *p
Chris@16 88 #endif
Chris@16 89 BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_Z(1, N, t, a))
Chris@16 90 {
Chris@16 91 typedef instance<Holder> instance_t;
Chris@16 92
Chris@16 93 void* memory = Holder::allocate(p, offsetof(instance_t, storage), sizeof(Holder));
Chris@16 94 try {
Chris@16 95 (new (memory) Holder(
Chris@16 96 p BOOST_PP_REPEAT_1ST(N, BOOST_PYTHON_DO_FORWARD_ARG, nil)))->install(p);
Chris@16 97 }
Chris@16 98 catch(...) {
Chris@16 99 Holder::deallocate(p, memory);
Chris@16 100 throw;
Chris@16 101 }
Chris@16 102 }
Chris@16 103 };
Chris@16 104 };
Chris@16 105
Chris@16 106 # undef N
Chris@16 107
Chris@16 108 #endif // BOOST_PP_ITERATION_DEPTH()
Chris@16 109 #endif