// -*- c++ -*- /* Do not edit! -- generated file */ #ifndef _SIGC_LAMBDA_BASE_HPP_ #define _SIGC_LAMBDA_BASE_HPP_ #include #include namespace sigc { /** @defgroup lambdas Lambdas * libsigc++ ships with basic lambda functionality and the sigc::group adaptor that uses lambdas to transform a functor's parameter list. * * The lambda selectors sigc::_1, sigc::_2, ..., sigc::_9 are used to select the * first, second, ..., nineth argument from a list. * * @par Examples: * @code * std::cout << sigc::_1(10,20,30); // returns 10 * std::cout << sigc::_2(10,20,30); // returns 20 * ... * @endcode * * Operators are defined so that lambda selectors can be used e.g. as placeholders in * arithmetic expressions. * * @par Examples: * @code * std::cout << (sigc::_1 + 5)(3); // returns (3 + 5) * std::cout << (sigc::_1 * sigc::_2)(7,10); // returns (7 * 10) * @endcode */ /** A hint to the compiler. * All lambda types publically inherit from this hint. * * @ingroup lambdas */ struct lambda_base : public adaptor_base {}; // Forward declaration of lambda. template struct lambda; namespace internal { /** Abstracts lambda functionality. * Objects of this type store a value that may be of type lambda itself. * In this case, operator()() executes the lambda (a lambda is always a functor at the same time). * Otherwise, operator()() simply returns the stored value. */ template ::value> struct lambda_core; /// Abstracts lambda functionality (template specialization for lambda values). template struct lambda_core : public lambda_base { template struct deduce_result_type { typedef typename T_type::template deduce_result_type::pass, typename type_trait::pass, typename type_trait::pass, typename type_trait::pass, typename type_trait::pass, typename type_trait::pass, typename type_trait::pass>::type type; }; typedef typename T_type::result_type result_type; typedef T_type lambda_type; result_type operator()() const; template typename deduce_result_type::type operator ()(T_arg1 _A_1) const { return value_.SIGC_WORKAROUND_OPERATOR_PARENTHESES::pass> (_A_1); } #ifndef SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD template typename deduce_result_type::type sun_forte_workaround(T_arg1 _A_1) const { return value_.SIGC_WORKAROUND_OPERATOR_PARENTHESES::pass> (_A_1); } #endif //SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD template typename deduce_result_type::type operator ()(T_arg1 _A_1, T_arg2 _A_2) const { return value_.SIGC_WORKAROUND_OPERATOR_PARENTHESES::pass, typename type_trait::pass> (_A_1, _A_2); } #ifndef SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD template typename deduce_result_type::type sun_forte_workaround(T_arg1 _A_1, T_arg2 _A_2) const { return value_.SIGC_WORKAROUND_OPERATOR_PARENTHESES::pass, typename type_trait::pass> (_A_1, _A_2); } #endif //SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD template typename deduce_result_type::type operator ()(T_arg1 _A_1, T_arg2 _A_2, T_arg3 _A_3) const { return value_.SIGC_WORKAROUND_OPERATOR_PARENTHESES::pass, typename type_trait::pass, typename type_trait::pass> (_A_1, _A_2, _A_3); } #ifndef SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD template typename deduce_result_type::type sun_forte_workaround(T_arg1 _A_1, T_arg2 _A_2, T_arg3 _A_3) const { return value_.SIGC_WORKAROUND_OPERATOR_PARENTHESES::pass, typename type_trait::pass, typename type_trait::pass> (_A_1, _A_2, _A_3); } #endif //SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD template typename deduce_result_type::type operator ()(T_arg1 _A_1, T_arg2 _A_2, T_arg3 _A_3, T_arg4 _A_4) const { return value_.SIGC_WORKAROUND_OPERATOR_PARENTHESES::pass, typename type_trait::pass, typename type_trait::pass, typename type_trait::pass> (_A_1, _A_2, _A_3, _A_4); } #ifndef SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD template typename deduce_result_type::type sun_forte_workaround(T_arg1 _A_1, T_arg2 _A_2, T_arg3 _A_3, T_arg4 _A_4) const { return value_.SIGC_WORKAROUND_OPERATOR_PARENTHESES::pass, typename type_trait::pass, typename type_trait::pass, typename type_trait::pass> (_A_1, _A_2, _A_3, _A_4); } #endif //SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD template typename deduce_result_type::type operator ()(T_arg1 _A_1, T_arg2 _A_2, T_arg3 _A_3, T_arg4 _A_4, T_arg5 _A_5) const { return value_.SIGC_WORKAROUND_OPERATOR_PARENTHESES::pass, typename type_trait::pass, typename type_trait::pass, typename type_trait::pass, typename type_trait::pass> (_A_1, _A_2, _A_3, _A_4, _A_5); } #ifndef SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD template typename deduce_result_type::type sun_forte_workaround(T_arg1 _A_1, T_arg2 _A_2, T_arg3 _A_3, T_arg4 _A_4, T_arg5 _A_5) const { return value_.SIGC_WORKAROUND_OPERATOR_PARENTHESES::pass, typename type_trait::pass, typename type_trait::pass, typename type_trait::pass, typename type_trait::pass> (_A_1, _A_2, _A_3, _A_4, _A_5); } #endif //SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD template typename deduce_result_type::type operator ()(T_arg1 _A_1, T_arg2 _A_2, T_arg3 _A_3, T_arg4 _A_4, T_arg5 _A_5, T_arg6 _A_6) const { return value_.SIGC_WORKAROUND_OPERATOR_PARENTHESES::pass, typename type_trait::pass, typename type_trait::pass, typename type_trait::pass, typename type_trait::pass, typename type_trait::pass> (_A_1, _A_2, _A_3, _A_4, _A_5, _A_6); } #ifndef SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD template typename deduce_result_type::type sun_forte_workaround(T_arg1 _A_1, T_arg2 _A_2, T_arg3 _A_3, T_arg4 _A_4, T_arg5 _A_5, T_arg6 _A_6) const { return value_.SIGC_WORKAROUND_OPERATOR_PARENTHESES::pass, typename type_trait::pass, typename type_trait::pass, typename type_trait::pass, typename type_trait::pass, typename type_trait::pass> (_A_1, _A_2, _A_3, _A_4, _A_5, _A_6); } #endif //SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD template typename deduce_result_type::type operator ()(T_arg1 _A_1, T_arg2 _A_2, T_arg3 _A_3, T_arg4 _A_4, T_arg5 _A_5, T_arg6 _A_6, T_arg7 _A_7) const { return value_.SIGC_WORKAROUND_OPERATOR_PARENTHESES::pass, typename type_trait::pass, typename type_trait::pass, typename type_trait::pass, typename type_trait::pass, typename type_trait::pass, typename type_trait::pass> (_A_1, _A_2, _A_3, _A_4, _A_5, _A_6, _A_7); } #ifndef SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD template typename deduce_result_type::type sun_forte_workaround(T_arg1 _A_1, T_arg2 _A_2, T_arg3 _A_3, T_arg4 _A_4, T_arg5 _A_5, T_arg6 _A_6, T_arg7 _A_7) const { return value_.SIGC_WORKAROUND_OPERATOR_PARENTHESES::pass, typename type_trait::pass, typename type_trait::pass, typename type_trait::pass, typename type_trait::pass, typename type_trait::pass, typename type_trait::pass> (_A_1, _A_2, _A_3, _A_4, _A_5, _A_6, _A_7); } #endif //SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD lambda_core() {} explicit lambda_core(const T_type& v) : value_(v) {} T_type value_; }; template typename lambda_core::result_type lambda_core::operator()() const { return value_(); } /// Abstracts lambda functionality (template specialization for other value types). template struct lambda_core : public lambda_base { template struct deduce_result_type { typedef T_type type; }; typedef T_type result_type; // all operator() overloads return T_type. typedef lambda lambda_type; result_type operator()() const; template result_type operator ()(T_arg1) const { return value_; } #ifndef SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD template result_type sun_forte_workaround(T_arg1) const { return value_; } #endif //SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD template result_type operator ()(T_arg1, T_arg2) const { return value_; } #ifndef SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD template result_type sun_forte_workaround(T_arg1, T_arg2) const { return value_; } #endif //SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD template result_type operator ()(T_arg1, T_arg2, T_arg3) const { return value_; } #ifndef SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD template result_type sun_forte_workaround(T_arg1, T_arg2, T_arg3) const { return value_; } #endif //SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD template result_type operator ()(T_arg1, T_arg2, T_arg3, T_arg4) const { return value_; } #ifndef SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD template result_type sun_forte_workaround(T_arg1, T_arg2, T_arg3, T_arg4) const { return value_; } #endif //SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD template result_type operator ()(T_arg1, T_arg2, T_arg3, T_arg4, T_arg5) const { return value_; } #ifndef SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD template result_type sun_forte_workaround(T_arg1, T_arg2, T_arg3, T_arg4, T_arg5) const { return value_; } #endif //SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD template result_type operator ()(T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6) const { return value_; } #ifndef SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD template result_type sun_forte_workaround(T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6) const { return value_; } #endif //SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD template result_type operator ()(T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6, T_arg7) const { return value_; } #ifndef SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD template result_type sun_forte_workaround(T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6, T_arg7) const { return value_; } #endif //SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD explicit lambda_core(typename type_trait::take v) : value_(v) {} T_type value_; }; template typename lambda_core::result_type lambda_core::operator()() const { return value_; } } /* namespace internal */ //template specialization of visit_each<>(action, functor): template void visit_each(const T_action& _A_action, const internal::lambda_core& _A_target) { visit_each(_A_action, _A_target.value_); } // forward declarations for lambda operators other and other template struct other; struct subscript; struct assign; template struct lambda_operator; template struct unwrap_lambda_type; /** Lambda type. * Objects of this type store a value that may be of type lambda itself. * In this case, operator()() executes the lambda (a lambda is always a functor at the same time). * Otherwise, operator()() simply returns the stored value. * The assign and subscript operators are defined to return a lambda operator. * * @ingroup lambdas */ template struct lambda : public internal::lambda_core { typedef lambda self; lambda() {} lambda(typename type_trait::take v) : internal::lambda_core(v) {} // operators for other template lambda, self, typename unwrap_lambda_type::type> > operator [] (const T_arg& a) const { typedef lambda_operator, self, typename unwrap_lambda_type::type> lambda_operator_type; return lambda(lambda_operator_type(this->value_, unwrap_lambda_value(a))); } // operators for other template lambda, self, typename unwrap_lambda_type::type> > operator = (const T_arg& a) const { typedef lambda_operator, self, typename unwrap_lambda_type::type> lambda_operator_type; return lambda(lambda_operator_type(this->value_, unwrap_lambda_value(a))); } }; //template specialization of visit_each<>(action, functor): template void visit_each(const T_action& _A_action, const lambda& _A_target) { visit_each(_A_action, _A_target.value_); } /** Converts a reference into a lambda object. * sigc::var creates a 0-ary functor, returning the value of a referenced variable. * * @par Example: * @code * int main(int argc, char* argv) * { * int data; * sigc::signal readValue; * * readValue.connect(sigc::var(data)); * * data = 3; * std::cout << readValue() << std::endl; //Prints 3. * * data = 5; * std::cout << readValue() << std::endl; //Prints 5. * } * @endcode */ template lambda var(T_type& v) { return lambda(v); } /** Converts a constant reference into a lambda object. */ template lambda var(const T_type& v) { return lambda(v); } /** Deduces the type of the object stored in an object of the passed lambda type. * If the type passed as template argument is no lambda type, * type is defined to unwrap_reference::type. */ template struct unwrap_lambda_type { typedef typename unwrap_reference::type type; }; template struct unwrap_lambda_type > { typedef T_type type; }; /** Gets the object stored inside a lambda object. * Returns the object passed as argument if it is not of type lambda. */ template T_type& unwrap_lambda_value(T_type& a) { return a; } template const T_type& unwrap_lambda_value(const T_type& a) { return a; } template const T_type& unwrap_lambda_value(const lambda& a) { return a.value_; } } /* namespace sigc */ #endif /* _SIGC_LAMBDA_BASE_HPP_ */