diff -r 000000000000 -r e4d67989cc36 ossrv_pub/boost_apis/boost/lambda/detail/function_adaptors.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ossrv_pub/boost_apis/boost/lambda/detail/function_adaptors.hpp Tue Feb 02 02:01:42 2010 +0200 @@ -0,0 +1,640 @@ +// Boost Lambda Library - function_adaptors.hpp ---------------------------- + +// Copyright (C) 1999, 2000 Jaakko Järvi (jaakko.jarvi@cs.utu.fi) +// +// 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 + + +#ifndef BOOST_LAMBDA_FUNCTION_ADAPTORS_HPP +#define BOOST_LAMBDA_FUNCTION_ADAPTORS_HPP + +#include "boost/type_traits/same_traits.hpp" + +namespace boost { +namespace lambda { + +template struct function_adaptor { + + // we do not know the return type off-hand, we must ask it from Func + template class sig { + typedef typename Args::head_type F; + typedef typename detail::remove_reference_and_cv::type plainF; + public: + // To sig we pass a cons list, where the head is the function object type + // itself (potentially cv-qualified) + // and the tail contains the types of the actual arguments to be passed + // to the function object. The arguments can be cv qualified + // as well. + typedef typename plainF::template sig::type type; + }; + + template + static RET apply(A1& a1) { + return a1(); + } + template + static RET apply(A1& a1, A2& a2) { + return a1(a2); + } + template + static RET apply(A1& a1, A2& a2, A3& a3) { + return a1(a2, a3); + } + template + static RET apply(A1& a1, A2& a2, A3& a3, A4& a4) { + return a1(a2, a3, a4); + } + template + static RET apply(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5) { + return a1(a2, a3, a4, a5); + } + template + static RET apply(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6) { + return a1(a2, a3, a4, a5, a6); + } + template + static RET apply(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, + A7& a7) { + return a1(a2, a3, a4, a5, a6, a7); + } + template + static RET apply(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, + A7& a7, A8& a8) { + return a1(a2, a3, a4, a5, a6, a7, a8); + } + template + static RET apply(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, + A7& a7, A8& a8, A9& a9) { + return a1(a2, a3, a4, a5, a6, a7, a8, a9); + } + template + static RET apply(A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, + A7& a7, A8& a8, A9& a9, A10& a10) { + return a1(a2, a3, a4, a5, a6, a7, a8, a9, a10); + } +}; + +template struct function_adaptor; // error + +// -- function adaptors with data member access +template +struct function_adaptor { + + // typedef detail::unspecified type; + + // T can have qualifiers and can be a reference type + // We get the return type by adding const, if the object through which + // the data member is accessed is const, and finally adding a reference + template class sig { + typedef typename boost::tuples::element<1, Args>::type argument_type; + + typedef typename detail::IF::value, + typename boost::add_const::type, + T + >::RET properly_consted_return_type; + + typedef typename detail::IF< + boost::is_volatile::value, + typename boost::add_volatile::type, + properly_consted_return_type + >::RET properly_cvd_return_type; + + + public: + typedef typename + boost::add_reference::type type; + }; + + template + static RET apply( T Object::*data, Object& o) { + return o.*data; + } + template + static RET apply( T Object::*data, const Object& o) { + return o.*data; + } + template + static RET apply( T Object::*data, volatile Object& o) { + return o.*data; + } + template + static RET apply( T Object::*data, const volatile Object& o) { + return o.*data; + } + template + static RET apply( T Object::*data, Object* o) { + return o->*data; + } + template + static RET apply( T Object::*data, const Object* o) { + return o->*data; + } + template + static RET apply( T Object::*data, volatile Object* o) { + return o->*data; + } + template + static RET apply( T Object::*data, const volatile Object* o) { + return o->*data; + } +}; + +// -- function adaptors with 1 argument apply + +template +struct function_adaptor { + + template struct sig { typedef Result type; }; + template + static Result apply(Result (*func)()) { + return func(); + } +}; + +template +struct function_adaptor { + + template struct sig { typedef Result type; }; + template + static Result apply(Result (*func)()) { + return func(); + } +}; + + +// -- function adaptors with 2 argument apply +template +struct function_adaptor { + + template struct sig { typedef Result type; }; + template + static Result apply( Result (Object::*func)() const, const Object* o) { + return (o->*func)(); + } + template + static Result apply( Result (Object::*func)() const, const Object& o) { + return (o.*func)(); + } +}; + +template +struct function_adaptor { + + template struct sig { typedef Result type; }; + template + static Result apply( Result (Object::*func)(), Object* o) { + return (o->*func)(); + } + template + static Result apply( Result (Object::*func)(), Object& o) { + return (o.*func)(); + } +}; + +template +struct function_adaptor { + + template struct sig { typedef Result type; }; + template + static Result apply(Result (*func)(Arg1), A1& a1) { + return func(a1); + } +}; + +template +struct function_adaptor { + + template struct sig { typedef Result type; }; + template + static Result apply(Result (*func)(Arg1), A1& a1) { + return func(a1); + } +}; + + +// -- function adaptors with 3 argument apply +template +struct function_adaptor { + + template struct sig { typedef Result type; }; + template + static Result apply( Result (Object::*func)(Arg1) const, const Object* o, + A1& a1) { + return (o->*func)(a1); + } + template + static Result apply( Result (Object::*func)(Arg1) const, const Object& o, + A1& a1) { + return (o.*func)(a1); + } +}; + +template +struct function_adaptor { + + template struct sig { typedef Result type; }; + template + static Result apply( Result (Object::*func)(Arg1), Object* o, A1& a1) { + return (o->*func)(a1); + } + template + static Result apply( Result (Object::*func)(Arg1), Object& o, A1& a1) { + return (o.*func)(a1); + } +}; + +template +struct function_adaptor { + + template struct sig { typedef Result type; }; + template + static Result apply(Result (*func)(Arg1, Arg2), A1& a1, A2& a2) { + return func(a1, a2); + } +}; + +template +struct function_adaptor { + + template struct sig { typedef Result type; }; + template + static Result apply(Result (*func)(Arg1, Arg2), A1& a1, A2& a2) { + return func(a1, a2); + } +}; + + +// -- function adaptors with 4 argument apply +template +struct function_adaptor { + + template struct sig { typedef Result type; }; + template + static Result apply( Result (Object::*func)(Arg1, Arg2) const, const Object* o, A1& a1, A2& a2) { + return (o->*func)(a1, a2); + } + template + static Result apply( Result (Object::*func)(Arg1, Arg2) const, const Object& o, A1& a1, A2& a2) { + return (o.*func)(a1, a2); + } +}; + +template +struct function_adaptor { + + template struct sig { typedef Result type; }; + template + static Result apply( Result (Object::*func)(Arg1, Arg2), Object* o, A1& a1, A2& a2) { + return (o->*func)(a1, a2); + } + template + static Result apply( Result (Object::*func)(Arg1, Arg2), Object& o, A1& a1, A2& a2) { + return (o.*func)(a1, a2); + } +}; + +template +struct function_adaptor { + + template struct sig { typedef Result type; }; + template + static Result apply(Result (*func)(Arg1, Arg2, Arg3), A1& a1, A2& a2, A3& a3) { + return func(a1, a2, a3); + } +}; + +template +struct function_adaptor { + + template struct sig { typedef Result type; }; + template + static Result apply(Result (*func)(Arg1, Arg2, Arg3), A1& a1, A2& a2, A3& a3) { + return func(a1, a2, a3); + } +}; + + +// -- function adaptors with 5 argument apply +template +struct function_adaptor { + + template struct sig { typedef Result type; }; + template + static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3) const, const Object* o, A1& a1, A2& a2, A3& a3) { + return (o->*func)(a1, a2, a3); + } + template + static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3) const, const Object& o, A1& a1, A2& a2, A3& a3) { + return (o.*func)(a1, a2, a3); + } +}; + +template +struct function_adaptor { + + template struct sig { typedef Result type; }; + template + static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3), Object* o, A1& a1, A2& a2, A3& a3) { + return (o->*func)(a1, a2, a3); + } + template + static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3), Object& o, A1& a1, A2& a2, A3& a3) { + return (o.*func)(a1, a2, a3); + } +}; + +template +struct function_adaptor { + + template struct sig { typedef Result type; }; + template + static Result apply(Result (*func)(Arg1, Arg2, Arg3, Arg4), A1& a1, A2& a2, A3& a3, A4& a4) { + return func(a1, a2, a3, a4); + } +}; + +template +struct function_adaptor { + + template struct sig { typedef Result type; }; + template + static Result apply(Result (*func)(Arg1, Arg2, Arg3, Arg4), A1& a1, A2& a2, A3& a3, A4& a4) { + return func(a1, a2, a3, a4); + } +}; + + +// -- function adaptors with 6 argument apply +template +struct function_adaptor { + + template struct sig { typedef Result type; }; + template + static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4) const, const Object* o, A1& a1, A2& a2, A3& a3, A4& a4) { + return (o->*func)(a1, a2, a3, a4); + } + template + static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4) const, const Object& o, A1& a1, A2& a2, A3& a3, A4& a4) { + return (o.*func)(a1, a2, a3, a4); + } +}; + +template +struct function_adaptor { + + template struct sig { typedef Result type; }; + template + static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4), Object* o, A1& a1, A2& a2, A3& a3, A4& a4) { + return (o->*func)(a1, a2, a3, a4); + } + template + static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4), Object& o, A1& a1, A2& a2, A3& a3, A4& a4) { + return (o.*func)(a1, a2, a3, a4); + } +}; + +template +struct function_adaptor { + + template struct sig { typedef Result type; }; + template + static Result apply(Result (*func)(Arg1, Arg2, Arg3, Arg4, Arg5), A1& a1, A2& a2, A3& a3, A4& a4, A5& a5) { + return func(a1, a2, a3, a4, a5); + } +}; + +template +struct function_adaptor { + + template struct sig { typedef Result type; }; + template + static Result apply(Result (*func)(Arg1, Arg2, Arg3, Arg4, Arg5), A1& a1, A2& a2, A3& a3, A4& a4, A5& a5) { + return func(a1, a2, a3, a4, a5); + } +}; + + +// -- function adaptors with 7 argument apply +template +struct function_adaptor { + + template struct sig { typedef Result type; }; + template + static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5) const, const Object* o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5) { + return (o->*func)(a1, a2, a3, a4, a5); + } + template + static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5) const, const Object& o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5) { + return (o.*func)(a1, a2, a3, a4, a5); + } +}; + +template +struct function_adaptor { + + template struct sig { typedef Result type; }; + template + static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5), Object* o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5) { + return (o->*func)(a1, a2, a3, a4, a5); + } + template + static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5), Object& o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5) { + return (o.*func)(a1, a2, a3, a4, a5); + } +}; + +template +struct function_adaptor { + + template struct sig { typedef Result type; }; + template + static Result apply(Result (*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6), A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6) { + return func(a1, a2, a3, a4, a5, a6); + } +}; + +template +struct function_adaptor { + + template struct sig { typedef Result type; }; + template + static Result apply(Result (*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6), A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6) { + return func(a1, a2, a3, a4, a5, a6); + } +}; + + +// -- function adaptors with 8 argument apply +template +struct function_adaptor { + + template struct sig { typedef Result type; }; + template + static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6) const, const Object* o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6) { + return (o->*func)(a1, a2, a3, a4, a5, a6); + } + template + static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6) const, const Object& o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6) { + return (o.*func)(a1, a2, a3, a4, a5, a6); + } +}; + +template +struct function_adaptor { + + template struct sig { typedef Result type; }; + template + static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6), Object* o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6) { + return (o->*func)(a1, a2, a3, a4, a5, a6); + } + template + static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6), Object& o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6) { + return (o.*func)(a1, a2, a3, a4, a5, a6); + } +}; + +template +struct function_adaptor { + + template struct sig { typedef Result type; }; + template + static Result apply(Result (*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7), A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7) { + return func(a1, a2, a3, a4, a5, a6, a7); + } +}; + +template +struct function_adaptor { + + template struct sig { typedef Result type; }; + template + static Result apply(Result (*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7), A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7) { + return func(a1, a2, a3, a4, a5, a6, a7); + } +}; + + +// -- function adaptors with 9 argument apply +template +struct function_adaptor { + + template struct sig { typedef Result type; }; + template + static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7) const, const Object* o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7) { + return (o->*func)(a1, a2, a3, a4, a5, a6, a7); + } + template + static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7) const, const Object& o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7) { + return (o.*func)(a1, a2, a3, a4, a5, a6, a7); + } +}; + +template +struct function_adaptor { + + template struct sig { typedef Result type; }; + template + static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7), Object* o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7) { + return (o->*func)(a1, a2, a3, a4, a5, a6, a7); + } + template + static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7), Object& o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7) { + return (o.*func)(a1, a2, a3, a4, a5, a6, a7); + } +}; + +template +struct function_adaptor { + + template struct sig { typedef Result type; }; + template + static Result apply(Result (*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8), A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8) { + return func(a1, a2, a3, a4, a5, a6, a7, a8); + } +}; + +template +struct function_adaptor { + + template struct sig { typedef Result type; }; + template + static Result apply(Result (*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8), A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8) { + return func(a1, a2, a3, a4, a5, a6, a7, a8); + } +}; + + +// -- function adaptors with 10 argument apply +template +struct function_adaptor { + + template struct sig { typedef Result type; }; + template + static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8) const, const Object* o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8) { + return (o->*func)(a1, a2, a3, a4, a5, a6, a7, a8); + } + template + static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8) const, const Object& o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8) { + return (o.*func)(a1, a2, a3, a4, a5, a6, a7, a8); + } +}; + +template +struct function_adaptor { + + template struct sig { typedef Result type; }; + template + static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8), Object* o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8) { + return (o->*func)(a1, a2, a3, a4, a5, a6, a7, a8); + } + template + static Result apply( Result (Object::*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8), Object& o, A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8) { + return (o.*func)(a1, a2, a3, a4, a5, a6, a7, a8); + } +}; + +template +struct function_adaptor { + + template struct sig { typedef Result type; }; + template + static Result apply(Result (*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9), A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8, A9& a9) { + return func(a1, a2, a3, a4, a5, a6, a7, a8, a9); + } +}; + +template +struct function_adaptor { + + template struct sig { typedef Result type; }; + template + static Result apply(Result (*func)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9), A1& a1, A2& a2, A3& a3, A4& a4, A5& a5, A6& a6, A7& a7, A8& a8, A9& a9) { + return func(a1, a2, a3, a4, a5, a6, a7, a8, a9); + } +}; + +} // namespace lambda +} // namespace boost + +#endif + + + + + + + + + + + + +