// TR1 functional -*- C++ -*-
// Copyright (C) 2005 Free Software Foundation, Inc.
-// Writtten by Douglas Gregor <dgregor@cs.indiana.edu>
+// Written by Douglas Gregor <doug.gregor -at- gmail.com>
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
* You should not attempt to use it directly.
*/
+template<typename _Res _GLIBCXX_COMMA _GLIBCXX_TEMPLATE_PARAMS>
+ struct _Weak_result_type_impl<_Res(_GLIBCXX_TEMPLATE_ARGS)>
+ {
+ typedef _Res result_type;
+ };
+
+template<typename _Res _GLIBCXX_COMMA _GLIBCXX_TEMPLATE_PARAMS>
+ struct _Weak_result_type_impl<_Res (&)(_GLIBCXX_TEMPLATE_ARGS)>
+ {
+ typedef _Res result_type;
+ };
+
+template<typename _Res _GLIBCXX_COMMA _GLIBCXX_TEMPLATE_PARAMS>
+ struct _Weak_result_type_impl<_Res (*)(_GLIBCXX_TEMPLATE_ARGS)>
+ {
+ typedef _Res result_type;
+ };
+
+#if _GLIBCXX_NUM_ARGS > 0
+template<typename _Res, typename _Class _GLIBCXX_COMMA_SHIFTED
+ _GLIBCXX_TEMPLATE_PARAMS_SHIFTED>
+ struct _Weak_result_type_impl<
+ _Res (_Class::*)(_GLIBCXX_TEMPLATE_ARGS_SHIFTED)>
+ {
+ typedef _Res result_type;
+ };
+
+template<typename _Res, typename _Class _GLIBCXX_COMMA_SHIFTED
+ _GLIBCXX_TEMPLATE_PARAMS_SHIFTED>
+ struct _Weak_result_type_impl<
+ _Res (_Class::*)(_GLIBCXX_TEMPLATE_ARGS_SHIFTED) const>
+ {
+ typedef _Res result_type;
+ };
+
+template<typename _Res, typename _Class _GLIBCXX_COMMA_SHIFTED
+ _GLIBCXX_TEMPLATE_PARAMS_SHIFTED>
+ struct _Weak_result_type_impl<
+ _Res (_Class::*)(_GLIBCXX_TEMPLATE_ARGS_SHIFTED) volatile>
+ {
+ typedef _Res result_type;
+ };
+
+template<typename _Res, typename _Class _GLIBCXX_COMMA_SHIFTED
+ _GLIBCXX_TEMPLATE_PARAMS_SHIFTED>
+ struct _Weak_result_type_impl<
+ _Res (_Class::*)(_GLIBCXX_TEMPLATE_ARGS_SHIFTED) const volatile>
+ {
+ typedef _Res result_type;
+ };
+#endif
+
+template<typename _Functor _GLIBCXX_COMMA _GLIBCXX_TEMPLATE_PARAMS>
+ class result_of<_Functor(_GLIBCXX_TEMPLATE_ARGS)>
+ : public _Result_of_impl<
+ _Has_result_type<_Weak_result_type<_Functor> >::value,
+ _Functor(_GLIBCXX_TEMPLATE_ARGS)>
+ { };
+
+template<typename _Functor _GLIBCXX_COMMA _GLIBCXX_TEMPLATE_PARAMS>
+ struct _Result_of_impl<true, _Functor(_GLIBCXX_TEMPLATE_ARGS)>
+ {
+ typedef typename _Weak_result_type<_Functor>::result_type type;
+ };
+
+template<typename _Functor _GLIBCXX_COMMA _GLIBCXX_TEMPLATE_PARAMS>
+ struct _Result_of_impl<false, _Functor(_GLIBCXX_TEMPLATE_ARGS)>
+ {
+#if _GLIBCXX_NUM_ARGS > 0
+ typedef typename _Functor
+ ::template result<_Functor(_GLIBCXX_TEMPLATE_ARGS)>::type type;
+#else
+ typedef void type;
+#endif
+ };
+
+/**
+ * @if maint
+ * Invoke a function object, which may be either a member pointer or a
+ * function object. The first parameter will tell which.
+ * @endif
+ */
+template<typename _Functor _GLIBCXX_COMMA _GLIBCXX_TEMPLATE_PARAMS>
+ inline
+ typename __enable_if<
+ typename result_of<_Functor(_GLIBCXX_TEMPLATE_ARGS)>::type,
+ (!is_member_pointer<_Functor>::value
+ && !is_function<_Functor>::value
+ && !is_function<typename remove_pointer<_Functor>::type>::value)
+ >::__type
+ __invoke(_Functor& __f _GLIBCXX_COMMA _GLIBCXX_REF_PARAMS)
+ {
+ return __f(_GLIBCXX_ARGS);
+ }
+
+#if _GLIBCXX_NUM_ARGS > 0
+template<typename _Functor _GLIBCXX_COMMA _GLIBCXX_TEMPLATE_PARAMS>
+ inline
+ typename __enable_if<
+ typename result_of<_Functor(_GLIBCXX_TEMPLATE_ARGS)>::type,
+ (is_member_pointer<_Functor>::value
+ && !is_function<_Functor>::value
+ && !is_function<typename remove_pointer<_Functor>::type>::value)
+ >::__type
+ __invoke(_Functor& __f _GLIBCXX_COMMA _GLIBCXX_REF_PARAMS)
+ {
+ return mem_fn(__f)(_GLIBCXX_ARGS);
+ }
+#endif
+
+// To pick up function references (that will become function pointers)
+template<typename _Functor _GLIBCXX_COMMA _GLIBCXX_TEMPLATE_PARAMS>
+ inline
+ typename __enable_if<
+ typename result_of<_Functor(_GLIBCXX_TEMPLATE_ARGS)>::type,
+ (is_pointer<_Functor>::value
+ && is_function<typename remove_pointer<_Functor>::type>::value)
+ >::__type
+ __invoke(_Functor __f _GLIBCXX_COMMA _GLIBCXX_REF_PARAMS)
+ {
+ return __f(_GLIBCXX_ARGS);
+ }
+
+/**
+ * @if maint
+ * Implementation of reference_wrapper::operator()
+ * @endif
+*/
+#if _GLIBCXX_NUM_ARGS > 0
+template<typename _Tp>
+template<_GLIBCXX_TEMPLATE_PARAMS>
+ typename result_of<
+ typename reference_wrapper<_Tp>::_M_func_type(_GLIBCXX_TEMPLATE_ARGS)>::type
+ reference_wrapper<_Tp>::operator()(_GLIBCXX_REF_PARAMS) const
+ {
+ return __invoke(get(), _GLIBCXX_ARGS);
+ }
+#endif
+
#if _GLIBCXX_NUM_ARGS > 0
template<typename _Res, typename _Class _GLIBCXX_COMMA_SHIFTED
_GLIBCXX_TEMPLATE_PARAMS_SHIFTED>
template<typename _Res, typename _Class _GLIBCXX_COMMA_SHIFTED
_GLIBCXX_TEMPLATE_PARAMS_SHIFTED>
- class _Mem_fn<_Res (_Class::*)(_GLIBCXX_TEMPLATE_ARGS_SHIFTED) const volatile>
+ class _Mem_fn<_Res(_Class::*)(_GLIBCXX_TEMPLATE_ARGS_SHIFTED) const volatile>
#if _GLIBCXX_NUM_ARGS == 1
: public unary_function<const volatile _Class*, _Res>
#elif _GLIBCXX_NUM_ARGS == 2
template<typename _Function>
void operator!=(const function<_Function>&) const;
- typedef _Res (*_Invoker_type)(const _Any_data& _GLIBCXX_COMMA _GLIBCXX_PARAMS);
+ typedef _Res (*_Invoker_type)(const _Any_data& _GLIBCXX_COMMA
+ _GLIBCXX_PARAMS);
_Invoker_type _M_invoker;
};
}
template<typename _Res _GLIBCXX_COMMA _GLIBCXX_TEMPLATE_PARAMS>
- _Res function<_Res(_GLIBCXX_TEMPLATE_ARGS)>::operator()(_GLIBCXX_PARAMS) const
+ _Res
+ function<_Res(_GLIBCXX_TEMPLATE_ARGS)>::operator()(_GLIBCXX_PARAMS) const
{
if (_M_empty())
{