123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737 |
- // Boost Lambda Library -- member_ptr.hpp ---------------------
- // Copyright (C) 1999, 2000 Jaakko Jarvi (jaakko.jarvi@cs.utu.fi)
- // Copyright (C) 2000 Gary Powell (gary.powell@sierra.com)
- //
- // 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)
- //
- // For more information, see www.boost.org
- // --------------------------------------------------------------------------
- #if !defined(BOOST_LAMBDA_MEMBER_PTR_HPP)
- #define BOOST_LAMBDA_MEMBER_PTR_HPP
- namespace boost {
- namespace lambda {
- class member_pointer_action {};
- namespace detail {
- // the boost type_traits member_pointer traits are not enough,
- // need to know more details.
- template<class T>
- struct member_pointer {
- typedef typename boost::add_reference<T>::type type;
- typedef detail::unspecified class_type;
- typedef detail::unspecified qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = false);
- BOOST_STATIC_CONSTANT(bool, is_function_member = false);
- };
- template<class T, class U>
- struct member_pointer<T U::*> {
- typedef typename boost::add_reference<T>::type type;
- typedef U class_type;
- typedef U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = true);
- BOOST_STATIC_CONSTANT(bool, is_function_member = false);
- };
- template<class T, class U>
- struct member_pointer<const T U::*> {
- typedef typename boost::add_reference<const T>::type type;
- typedef U class_type;
- typedef const U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = true);
- BOOST_STATIC_CONSTANT(bool, is_function_member = false);
- };
- template<class T, class U>
- struct member_pointer<volatile T U::*> {
- typedef typename boost::add_reference<volatile T>::type type;
- typedef U class_type;
- typedef volatile U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = true);
- BOOST_STATIC_CONSTANT(bool, is_function_member = false);
- };
- template<class T, class U>
- struct member_pointer<const volatile T U::*> {
- typedef typename boost::add_reference<const volatile T>::type type;
- typedef U class_type;
- typedef const volatile U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = true);
- BOOST_STATIC_CONSTANT(bool, is_function_member = false);
- };
- // -- nonconst member functions --
- template<class T, class U>
- struct member_pointer<T (U::*)()> {
- typedef T type;
- typedef U class_type;
- typedef U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = false);
- BOOST_STATIC_CONSTANT(bool, is_function_member = true);
- };
- template<class T, class U, class A1>
- struct member_pointer<T (U::*)(A1)> {
- typedef T type;
- typedef U class_type;
- typedef U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = false);
- BOOST_STATIC_CONSTANT(bool, is_function_member = true);
- };
- template<class T, class U, class A1, class A2>
- struct member_pointer<T (U::*)(A1, A2)> {
- typedef T type;
- typedef U class_type;
- typedef U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = false);
- BOOST_STATIC_CONSTANT(bool, is_function_member = true);
- };
- template<class T, class U, class A1, class A2, class A3>
- struct member_pointer<T (U::*)(A1, A2, A3)> {
- typedef T type;
- typedef U class_type;
- typedef U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = false);
- BOOST_STATIC_CONSTANT(bool, is_function_member = true);
- };
- template<class T, class U, class A1, class A2, class A3, class A4>
- struct member_pointer<T (U::*)(A1, A2, A3, A4)> {
- typedef T type;
- typedef U class_type;
- typedef U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = false);
- BOOST_STATIC_CONSTANT(bool, is_function_member = true);
- };
- template<class T, class U, class A1, class A2, class A3, class A4, class A5>
- struct member_pointer<T (U::*)(A1, A2, A3, A4, A5)> {
- typedef T type;
- typedef U class_type;
- typedef U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = false);
- BOOST_STATIC_CONSTANT(bool, is_function_member = true);
- };
- template<class T, class U, class A1, class A2, class A3, class A4, class A5,
- class A6>
- struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6)> {
- typedef T type;
- typedef U class_type;
- typedef U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = false);
- BOOST_STATIC_CONSTANT(bool, is_function_member = true);
- };
- template<class T, class U, class A1, class A2, class A3, class A4, class A5,
- class A6, class A7>
- struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6, A7)> {
- typedef T type;
- typedef U class_type;
- typedef U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = false);
- BOOST_STATIC_CONSTANT(bool, is_function_member = true);
- };
- template<class T, class U, class A1, class A2, class A3, class A4, class A5,
- class A6, class A7, class A8>
- struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6, A7, A8)> {
- typedef T type;
- typedef U class_type;
- typedef U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = false);
- BOOST_STATIC_CONSTANT(bool, is_function_member = true);
- };
- template<class T, class U, class A1, class A2, class A3, class A4, class A5,
- class A6, class A7, class A8, class A9>
- struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6, A7, A8, A9)> {
- typedef T type;
- typedef U class_type;
- typedef U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = false);
- BOOST_STATIC_CONSTANT(bool, is_function_member = true);
- };
- // -- const member functions --
- template<class T, class U>
- struct member_pointer<T (U::*)() const> {
- typedef T type;
- typedef U class_type;
- typedef const U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = false);
- BOOST_STATIC_CONSTANT(bool, is_function_member = true);
- };
- template<class T, class U, class A1>
- struct member_pointer<T (U::*)(A1) const> {
- typedef T type;
- typedef U class_type;
- typedef const U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = false);
- BOOST_STATIC_CONSTANT(bool, is_function_member = true);
- };
- template<class T, class U, class A1, class A2>
- struct member_pointer<T (U::*)(A1, A2) const> {
- typedef T type;
- typedef U class_type;
- typedef const U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = false);
- BOOST_STATIC_CONSTANT(bool, is_function_member = true);
- };
- template<class T, class U, class A1, class A2, class A3>
- struct member_pointer<T (U::*)(A1, A2, A3) const> {
- typedef T type;
- typedef U class_type;
- typedef const U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = false);
- BOOST_STATIC_CONSTANT(bool, is_function_member = true);
- };
- template<class T, class U, class A1, class A2, class A3, class A4>
- struct member_pointer<T (U::*)(A1, A2, A3, A4) const> {
- typedef T type;
- typedef U class_type;
- typedef const U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = false);
- BOOST_STATIC_CONSTANT(bool, is_function_member = true);
- };
- template<class T, class U, class A1, class A2, class A3, class A4, class A5>
- struct member_pointer<T (U::*)(A1, A2, A3, A4, A5) const> {
- typedef T type;
- typedef U class_type;
- typedef const U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = false);
- BOOST_STATIC_CONSTANT(bool, is_function_member = true);
- };
- template<class T, class U, class A1, class A2, class A3, class A4, class A5,
- class A6>
- struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6) const> {
- typedef T type;
- typedef U class_type;
- typedef const U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = false);
- BOOST_STATIC_CONSTANT(bool, is_function_member = true);
- };
- template<class T, class U, class A1, class A2, class A3, class A4, class A5,
- class A6, class A7>
- struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6, A7) const> {
- typedef T type;
- typedef U class_type;
- typedef const U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = false);
- BOOST_STATIC_CONSTANT(bool, is_function_member = true);
- };
- template<class T, class U, class A1, class A2, class A3, class A4, class A5,
- class A6, class A7, class A8>
- struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6, A7, A8) const> {
- typedef T type;
- typedef U class_type;
- typedef const U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = false);
- BOOST_STATIC_CONSTANT(bool, is_function_member = true);
- };
- template<class T, class U, class A1, class A2, class A3, class A4, class A5,
- class A6, class A7, class A8, class A9>
- struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6, A7, A8, A9) const> {
- typedef T type;
- typedef U class_type;
- typedef const U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = false);
- BOOST_STATIC_CONSTANT(bool, is_function_member = true);
- };
- // -- volatile --
- template<class T, class U>
- struct member_pointer<T (U::*)() volatile> {
- typedef T type;
- typedef U class_type;
- typedef volatile U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = false);
- BOOST_STATIC_CONSTANT(bool, is_function_member = true);
- };
- template<class T, class U, class A1>
- struct member_pointer<T (U::*)(A1) volatile> {
- typedef T type;
- typedef U class_type;
- typedef volatile U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = false);
- BOOST_STATIC_CONSTANT(bool, is_function_member = true);
- };
- template<class T, class U, class A1, class A2>
- struct member_pointer<T (U::*)(A1, A2) volatile> {
- typedef T type;
- typedef U class_type;
- typedef volatile U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = false);
- BOOST_STATIC_CONSTANT(bool, is_function_member = true);
- };
- template<class T, class U, class A1, class A2, class A3>
- struct member_pointer<T (U::*)(A1, A2, A3) volatile> {
- typedef T type;
- typedef U class_type;
- typedef volatile U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = false);
- BOOST_STATIC_CONSTANT(bool, is_function_member = true);
- };
- template<class T, class U, class A1, class A2, class A3, class A4>
- struct member_pointer<T (U::*)(A1, A2, A3, A4) volatile> {
- typedef T type;
- typedef U class_type;
- typedef volatile U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = false);
- BOOST_STATIC_CONSTANT(bool, is_function_member = true);
- };
- template<class T, class U, class A1, class A2, class A3, class A4, class A5>
- struct member_pointer<T (U::*)(A1, A2, A3, A4, A5) volatile> {
- typedef T type;
- typedef U class_type;
- typedef volatile U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = false);
- BOOST_STATIC_CONSTANT(bool, is_function_member = true);
- };
- template<class T, class U, class A1, class A2, class A3, class A4, class A5,
- class A6>
- struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6) volatile> {
- typedef T type;
- typedef U class_type;
- typedef volatile U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = false);
- BOOST_STATIC_CONSTANT(bool, is_function_member = true);
- };
- template<class T, class U, class A1, class A2, class A3, class A4, class A5,
- class A6, class A7>
- struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6, A7) volatile> {
- typedef T type;
- typedef U class_type;
- typedef volatile U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = false);
- BOOST_STATIC_CONSTANT(bool, is_function_member = true);
- };
- template<class T, class U, class A1, class A2, class A3, class A4, class A5,
- class A6, class A7, class A8>
- struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6, A7, A8) volatile> {
- typedef T type;
- typedef U class_type;
- typedef volatile U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = false);
- BOOST_STATIC_CONSTANT(bool, is_function_member = true);
- };
- template<class T, class U, class A1, class A2, class A3, class A4, class A5,
- class A6, class A7, class A8, class A9>
- struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6, A7, A8, A9) volatile> {
- typedef T type;
- typedef U class_type;
- typedef volatile U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = false);
- BOOST_STATIC_CONSTANT(bool, is_function_member = true);
- };
- // -- const volatile
- template<class T, class U>
- struct member_pointer<T (U::*)() const volatile> {
- typedef T type;
- typedef U class_type;
- typedef const volatile U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = false);
- BOOST_STATIC_CONSTANT(bool, is_function_member = true);
- };
- template<class T, class U, class A1>
- struct member_pointer<T (U::*)(A1) const volatile> {
- typedef T type;
- typedef U class_type;
- typedef const volatile U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = false);
- BOOST_STATIC_CONSTANT(bool, is_function_member = true);
- };
- template<class T, class U, class A1, class A2>
- struct member_pointer<T (U::*)(A1, A2) const volatile> {
- typedef T type;
- typedef U class_type;
- typedef const volatile U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = false);
- BOOST_STATIC_CONSTANT(bool, is_function_member = true);
- };
- template<class T, class U, class A1, class A2, class A3>
- struct member_pointer<T (U::*)(A1, A2, A3) const volatile> {
- typedef T type;
- typedef U class_type;
- typedef const volatile U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = false);
- BOOST_STATIC_CONSTANT(bool, is_function_member = true);
- };
- template<class T, class U, class A1, class A2, class A3, class A4>
- struct member_pointer<T (U::*)(A1, A2, A3, A4) const volatile> {
- typedef T type;
- typedef U class_type;
- typedef const volatile U qualified_class_type;
- };
- template<class T, class U, class A1, class A2, class A3, class A4, class A5>
- struct member_pointer<T (U::*)(A1, A2, A3, A4, A5) const volatile> {
- typedef T type;
- typedef U class_type;
- typedef const volatile U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = false);
- BOOST_STATIC_CONSTANT(bool, is_function_member = true);
- };
- template<class T, class U, class A1, class A2, class A3, class A4, class A5,
- class A6>
- struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6) const volatile> {
- typedef T type;
- typedef U class_type;
- typedef const volatile U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = false);
- BOOST_STATIC_CONSTANT(bool, is_function_member = true);
- };
- template<class T, class U, class A1, class A2, class A3, class A4, class A5,
- class A6, class A7>
- struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6, A7) const volatile> {
- typedef T type;
- typedef U class_type;
- typedef const volatile U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = false);
- BOOST_STATIC_CONSTANT(bool, is_function_member = true);
- };
- template<class T, class U, class A1, class A2, class A3, class A4, class A5,
- class A6, class A7, class A8>
- struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6, A7, A8) const volatile> {
- typedef T type;
- typedef U class_type;
- typedef const volatile U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = false);
- BOOST_STATIC_CONSTANT(bool, is_function_member = true);
- };
- template<class T, class U, class A1, class A2, class A3, class A4, class A5,
- class A6, class A7, class A8, class A9>
- struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6, A7, A8, A9) const volatile> {
- typedef T type;
- typedef U class_type;
- typedef const volatile U qualified_class_type;
- BOOST_STATIC_CONSTANT(bool, is_data_member = false);
- BOOST_STATIC_CONSTANT(bool, is_function_member = true);
- };
- } // detail
- namespace detail {
- // this class holds a pointer to a member function and the object.
- // when called, it just calls the member function with the parameters
- // provided
- // It would have been possible to use existing lambda_functors to represent
- // a bound member function like this, but to have a separate template is
- // safer, since now this functor doesn't mix and match with lambda_functors
- // only thing you can do with this is to call it
- // note that previously instantiated classes
- // (other_action<member_pointer_action> and member_pointer_action_helper
- // guarantee, that A and B are
- // such types, that for objects a and b of corresponding types, a->*b leads
- // to the builtin ->* to be called. So types that would end in a call to
- // a user defined ->* do not create a member_pointer_caller object.
- template<class RET, class A, class B>
- class member_pointer_caller {
- A a; B b;
- public:
- member_pointer_caller(const A& aa, const B& bb) : a(aa), b(bb) {}
- RET operator()() const { return (a->*b)(); }
- template<class A1>
- RET operator()(const A1& a1) const { return (a->*b)(a1); }
- template<class A1, class A2>
- RET operator()(const A1& a1, const A2& a2) const { return (a->*b)(a1, a2); }
- template<class A1, class A2, class A3>
- RET operator()(const A1& a1, const A2& a2, const A3& a3) const {
- return (a->*b)(a1, a2, a3);
- }
- template<class A1, class A2, class A3, class A4>
- RET operator()(const A1& a1, const A2& a2, const A3& a3,
- const A4& a4) const {
- return (a->*b)(a1, a2, a3, a4);
- }
- template<class A1, class A2, class A3, class A4, class A5>
- RET operator()(const A1& a1, const A2& a2, const A3& a3, const A4& a4,
- const A5& a5) const {
- return (a->*b)(a1, a2, a3, a4, a5);
- }
- template<class A1, class A2, class A3, class A4, class A5, class A6>
- RET operator()(const A1& a1, const A2& a2, const A3& a3, const A4& a4,
- const A5& a5, const A6& a6) const {
- return (a->*b)(a1, a2, a3, a4, a5, a6);
- }
- template<class A1, class A2, class A3, class A4, class A5, class A6,
- class A7>
- RET operator()(const A1& a1, const A2& a2, const A3& a3, const A4& a4,
- const A5& a5, const A6& a6, const A7& a7) const {
- return (a->*b)(a1, a2, a3, a4, a5, a6, a7);
- }
- template<class A1, class A2, class A3, class A4, class A5, class A6,
- class A7, class A8>
- RET operator()(const A1& a1, const A2& a2, const A3& a3, const A4& a4,
- const A5& a5, const A6& a6, const A7& a7,
- const A8& a8) const {
- return (a->*b)(a1, a2, a3, a4, a5, a6, a7, a8);
- }
- template<class A1, class A2, class A3, class A4, class A5, class A6,
- class A7, class A8, class A9>
- RET operator()(const A1& a1, const A2& a2, const A3& a3, const A4& a4,
- const A5& a5, const A6& a6, const A7& a7,
- const A8& a8, const A9& a9) const {
- return (a->*b)(a1, a2, a3, a4, a5, a6, a7, a8, a9);
- }
- };
- // helper templates for return type deduction and action classes
- // different cases for data member, function member, neither
- // true-true case
- template <bool Is_data_member, bool Is_function_member>
- struct member_pointer_action_helper;
- // cannot be both, no body provided
- // data member case
- // this means, that B is a data member and A is a pointer type,
- // so either built-in ->* should be called, or there is an error
- template <>
- struct member_pointer_action_helper<true, false> {
- public:
- template<class RET, class A, class B>
- static RET apply(A& a, B& b) {
- return a->*b;
- }
- template<class A, class B>
- struct return_type {
- private:
- typedef typename detail::remove_reference_and_cv<B>::type plainB;
- typedef typename detail::member_pointer<plainB>::type type0;
- // we remove the reference now, as we may have to add cv:s
- typedef typename boost::remove_reference<type0>::type type1;
- // A is a reference to pointer
- // remove the top level cv qualifiers and reference
- typedef typename
- detail::remove_reference_and_cv<A>::type non_ref_A;
- // A is a pointer type, so take the type pointed to
- typedef typename ::boost::remove_pointer<non_ref_A>::type non_pointer_A;
- public:
- // For non-reference types, we must add const and/or volatile if
- // the pointer type has these qualifiers
- // If the member is a reference, these do not have any effect
- // (cv T == T if T is a reference type)
- typedef typename detail::IF<
- ::boost::is_const<non_pointer_A>::value,
- typename ::boost::add_const<type1>::type,
- type1
- >::RET type2;
- typedef typename detail::IF<
- ::boost::is_volatile<non_pointer_A>::value,
- typename ::boost::add_volatile<type2>::type,
- type2
- >::RET type3;
- // add reference back
- typedef typename ::boost::add_reference<type3>::type type;
- };
- };
- // neither case
- template <>
- struct member_pointer_action_helper<false, false> {
- public:
- template<class RET, class A, class B>
- static RET apply(A& a, B& b) {
- // not a built in member pointer operator, just call ->*
- return a->*b;
- }
- // an overloaded member pointer operators, user should have specified
- // the return type
- // At this point we know that there is no matching specialization for
- // return_type_2, so try return_type_2_plain
- template<class A, class B>
- struct return_type {
- typedef typename plain_return_type_2<
- other_action<member_pointer_action>, A, B
- >::type type;
- };
-
- };
- // member pointer function case
- // This is a built in ->* call for a member function,
- // the only thing that you can do with that, is to give it some arguments
- // note, it is guaranteed that A is a pointer type, and thus it cannot
- // be a call to overloaded ->*
- template <>
- struct member_pointer_action_helper<false, true> {
- public:
- template<class RET, class A, class B>
- static RET apply(A& a, B& b) {
- typedef typename ::boost::remove_cv<B>::type plainB;
- typedef typename detail::member_pointer<plainB>::type ret_t;
- typedef typename ::boost::remove_cv<A>::type plainA;
- // we always strip cv:s to
- // make the two routes (calling and type deduction)
- // to give the same results (and the const does not make any functional
- // difference)
- return detail::member_pointer_caller<ret_t, plainA, plainB>(a, b);
- }
- template<class A, class B>
- struct return_type {
- typedef typename detail::remove_reference_and_cv<B>::type plainB;
- typedef typename detail::member_pointer<plainB>::type ret_t;
- typedef typename detail::remove_reference_and_cv<A>::type plainA;
- typedef detail::member_pointer_caller<ret_t, plainA, plainB> type;
- };
- };
- } // detail
- template<> class other_action<member_pointer_action> {
- public:
- template<class RET, class A, class B>
- static RET apply(A& a, B& b) {
- typedef typename
- ::boost::remove_cv<B>::type plainB;
- return detail::member_pointer_action_helper<
- boost::is_pointer<A>::value &&
- detail::member_pointer<plainB>::is_data_member,
- boost::is_pointer<A>::value &&
- detail::member_pointer<plainB>::is_function_member
- >::template apply<RET>(a, b);
- }
- };
- // return type deduction --
- // If the right argument is a pointer to data member,
- // and the left argument is of compatible pointer to class type
- // return type is a reference to the data member type
- // if right argument is a pointer to a member function, and the left
- // argument is of a compatible type, the return type is a
- // member_pointer_caller (see above)
- // Otherwise, return type deduction fails. There is either an error,
- // or the user is trying to call an overloaded ->*
- // In such a case either ret<> must be used, or a return_type_2 user
- // defined specialization must be provided
- template<class A, class B>
- struct return_type_2<other_action<member_pointer_action>, A, B> {
- private:
- typedef typename
- detail::remove_reference_and_cv<B>::type plainB;
- public:
- typedef typename
- detail::member_pointer_action_helper<
- detail::member_pointer<plainB>::is_data_member,
- detail::member_pointer<plainB>::is_function_member
- >::template return_type<A, B>::type type;
- };
- // this is the way the generic lambda_functor_base functions instantiate
- // return type deduction. We turn it into return_type_2, so that the
- // user can provide specializations on that level.
- template<class Args>
- struct return_type_N<other_action<member_pointer_action>, Args> {
- typedef typename boost::tuples::element<0, Args>::type A;
- typedef typename boost::tuples::element<1, Args>::type B;
- typedef typename
- return_type_2<other_action<member_pointer_action>,
- typename boost::remove_reference<A>::type,
- typename boost::remove_reference<B>::type
- >::type type;
- };
- template<class Arg1, class Arg2>
- inline const
- lambda_functor<
- lambda_functor_base<
- action<2, other_action<member_pointer_action> >,
- tuple<lambda_functor<Arg1>, typename const_copy_argument<Arg2>::type>
- >
- >
- operator->*(const lambda_functor<Arg1>& a1, const Arg2& a2)
- {
- return
- lambda_functor_base<
- action<2, other_action<member_pointer_action> >,
- tuple<lambda_functor<Arg1>, typename const_copy_argument<Arg2>::type>
- >
- (tuple<lambda_functor<Arg1>,
- typename const_copy_argument<Arg2>::type>(a1, a2));
- }
- template<class Arg1, class Arg2>
- inline const
- lambda_functor<
- lambda_functor_base<
- action<2, other_action<member_pointer_action> >,
- tuple<lambda_functor<Arg1>, lambda_functor<Arg2> >
- >
- >
- operator->*(const lambda_functor<Arg1>& a1, const lambda_functor<Arg2>& a2)
- {
- return
- lambda_functor_base<
- action<2, other_action<member_pointer_action> >,
- tuple<lambda_functor<Arg1>, lambda_functor<Arg2> >
- >
- (tuple<lambda_functor<Arg1>, lambda_functor<Arg2> >(a1, a2));
- }
- template<class Arg1, class Arg2>
- inline const
- lambda_functor<
- lambda_functor_base<
- action<2, other_action<member_pointer_action> >,
- tuple<typename const_copy_argument<Arg1>::type, lambda_functor<Arg2> >
- >
- >
- operator->*(const Arg1& a1, const lambda_functor<Arg2>& a2)
- {
- return
- lambda_functor_base<
- action<2, other_action<member_pointer_action> >,
- tuple<typename const_copy_argument<Arg1>::type, lambda_functor<Arg2> >
- >
- (tuple<typename const_copy_argument<Arg1>::type,
- lambda_functor<Arg2> >(a1, a2));
- }
- } // namespace lambda
- } // namespace boost
- #endif
|