| /* { dg-options "-std=gnu++0x -Wno-return-type" } */ |
| |
| typedef __SIZE_TYPE__ size_t; |
| namespace std __attribute__ ((__visibility__ ("default"))) { |
| using ::size_t; |
| void __throw_bad_function_call() __attribute__((__noreturn__)); |
| } |
| inline void* operator new(std::size_t, void* __p) throw() { |
| return __p; |
| } |
| namespace std { |
| class type_info { |
| public: |
| bool operator==(const type_info& __arg) const { } |
| }; |
| namespace tr1 { |
| template<typename _Tp, _Tp __v> struct integral_constant { }; |
| typedef integral_constant<bool, true> true_type; |
| template<typename _Res, typename... _ArgTypes> |
| struct _Maybe_unary_or_binary_function { }; |
| class _Undefined_class; |
| union _Nocopy_types { |
| void (_Undefined_class::*_M_member_pointer)(); |
| }; |
| union _Any_data { |
| void* _M_access() { |
| return &_M_pod_data[0]; |
| } |
| char _M_pod_data[sizeof(_Nocopy_types)]; |
| }; |
| enum _Manager_operation { __get_type_info, __get_functor_ptr, __clone_functor, __destroy_functor }; |
| template<typename _Tp> struct _Simple_type_wrapper { |
| _Simple_type_wrapper(_Tp __value) : __value(__value) { } |
| _Tp __value; |
| }; |
| template<typename _Signature> class function; |
| class _Function_base { |
| public: |
| static const std::size_t _M_max_size = sizeof(_Nocopy_types); |
| static const std::size_t _M_max_align = __alignof__(_Nocopy_types); |
| template<typename _Functor> class _Base_manager { |
| static const bool __stored_locally = (sizeof(_Functor) <= _M_max_size && __alignof__(_Functor) <= _M_max_align && (_M_max_align % __alignof__(_Functor) == 0)); |
| typedef integral_constant<bool, __stored_locally> _Local_storage; |
| public: |
| static bool _M_manager(_Any_data& __dest, const _Any_data& __source, _Manager_operation __op) { } |
| static void _M_init_functor(_Any_data& __functor, const _Functor& __f) { |
| _M_init_functor(__functor, __f, _Local_storage()); |
| } |
| template<typename _Class, typename _Tp> static bool _M_not_empty_function(_Tp _Class::* const& __mp) { |
| return __mp; |
| } |
| static void _M_init_functor(_Any_data& __functor, const _Functor& __f, true_type) { |
| new (__functor._M_access()) _Functor(__f); |
| } |
| }; |
| ~_Function_base() { |
| if (_M_manager) _M_manager(_M_functor, _M_functor, __destroy_functor); |
| } |
| bool _M_empty() const { |
| return !_M_manager; |
| } |
| typedef bool (*_Manager_type)(_Any_data&, const _Any_data&, _Manager_operation); |
| _Any_data _M_functor; |
| _Manager_type _M_manager; |
| }; |
| template<typename _Signature, typename _Functor> class _Function_handler; |
| template<typename _Class, typename _Member, typename _Res, typename... _ArgTypes> class _Function_handler<_Res(_ArgTypes...), _Member _Class::*> : public _Function_handler<void(_ArgTypes...), _Member _Class::*> { |
| public: |
| static _Res _M_invoke(const _Any_data& __functor, _ArgTypes... __args) { } |
| }; |
| template<typename _Class, typename _Member, typename... _ArgTypes> class _Function_handler<void(_ArgTypes...), _Member _Class::*> : public _Function_base::_Base_manager< _Simple_type_wrapper< _Member _Class::* > > { }; |
| template<typename _Res, typename... _ArgTypes> class function<_Res(_ArgTypes...)> : public _Maybe_unary_or_binary_function<_Res, _ArgTypes...>, private _Function_base { |
| typedef _Res _Signature_type(_ArgTypes...); |
| struct _Useless { }; |
| public: |
| template<typename _Functor> function(_Functor __f, _Useless = _Useless()); |
| _Res operator()(_ArgTypes... __args) const; |
| const type_info& target_type() const; |
| typedef _Res (*_Invoker_type)(const _Any_data&, _ArgTypes...); |
| _Invoker_type _M_invoker; |
| }; |
| template<typename _Res, typename... _ArgTypes> template<typename _Functor> function<_Res(_ArgTypes...)>:: function(_Functor __f, _Useless) : _Function_base() { |
| typedef _Function_handler<_Signature_type, _Functor> _My_handler; |
| if (_My_handler::_M_not_empty_function(__f)) { |
| _M_invoker = &_My_handler::_M_invoke; |
| _M_manager = &_My_handler::_M_manager; |
| _My_handler::_M_init_functor(_M_functor, __f); |
| } |
| } |
| template<typename _Res, typename... _ArgTypes> _Res function<_Res(_ArgTypes...)>:: operator()(_ArgTypes... __args) const { |
| if (_M_empty()) { |
| __throw_bad_function_call(); |
| } |
| return _M_invoker(_M_functor, __args...); |
| } |
| template<typename _Res, typename... _ArgTypes> const type_info& function<_Res(_ArgTypes...)>:: target_type() const { |
| if (_M_manager) { |
| _Any_data __typeinfo_result; |
| _M_manager(__typeinfo_result, _M_functor, __get_type_info); |
| } |
| } |
| } |
| } |
| struct X { |
| int bar; |
| }; |
| void test05() { |
| using std::tr1::function; |
| X x; |
| function<int(X&)> frm(&X::bar); |
| frm(x) == 17; |
| typeid(int X::*) == frm.target_type(); |
| } |