28 #ifndef INCLUDED_CORE_YFUNC_HPP_
29 #define INCLUDED_CORE_YFUNC_HPP_ 1
41 template<
typename _type,
typename _tArg,
typename _tRet>
42 class GHDynamicFunction
48 _tRet (*_f_ptr)(_type&, _tArg);
49 _tRet (_type::*_mf_ptr)(_tArg)
const;
55 Pointer(_tRet (&_f_)(_type&, _tArg))
62 Pointer(_tRet(_type::*_mf_ptr_)(_tArg)
const)
77 GHDynamicFunction(_tRet(&_f)(_type&, _tArg))
78 : _m_ptr(_f), _state(_func)
84 GHDynamicFunction(_tRet(_type::*_pf)(_tArg)
const)
85 : _m_ptr(_pf), _state(_mem_func)
93 operator()(_type& _r, _tArg _x)
const
96 return _m_ptr._f_ptr(_r, _x);
98 else if(_m_ptr._mf_ptr)
99 return (_r.*_m_ptr._mf_ptr)(_x);
105 template<
class _tNew>
107 operator()(
const _tNew& _r, _tArg _x)
const
109 if(_state == _mem_func && _m_ptr._mf_ptr)
113 return dynamic_cast<_type&
>(_r).*_m_ptr._mf_ptr(_x);
115 catch(std::bad_cast&)
125 template<
typename _type,
typename _tArg,
typename _tRet>
126 inline GHDynamicFunction<_type, _tArg, _tRet>
127 ConstructDynamicFunctionWith(_tRet (&_f)(_type&, _tArg))
129 return GHDynamicFunction<_type, _tArg, _tRet>(_f);
135 template<
typename _tRet,
typename _type,
typename _tArg>
136 inline GHDynamicFunction<_tRet, _type, _tArg>
137 ConstructDynamicFunctionWith(_tRet (_type::*_f)(_tArg)
const)
139 return GHDynamicFunction<_tRet, _type, _tArg>(_f);
148 template<
class _type,
typename _tRet,
typename _tPara,
class _tNew = _type>
152 _tRet(_type::*_pm)(_tPara);
170 return _pm == rhs._pm;
178 operator()(_type& o, _tPara arg)
189 operator()(_tNew& o, _tPara&& arg)
194 return (dynamic_cast<_type&>(o).*_pm)(
yforward(arg));
196 catch(std::bad_cast&)
206 template<
class _type,
typename _tRet,
typename _tPara,
class _tNew = _type>
211 _tRet(_type::*_pm)(_tPara);
220 : _po(dynamic_cast<_type*>(&obj)), _pm(p)
230 return _po == rhs._po && _pm == rhs._pm;
239 operator()(_tPara&& arg)
251 operator()(_tN&, _tPara&& arg)
261 template<
class _fCallable,
typename _tParm>
262 struct InversedCurrying
264 typedef typename _fCallable::Result Result;
265 typedef typename _fCallable::Parm1 Parm1;
272 InversedCurrying(_fCallable f_)
276 PDefHOp(
bool, ==,
const InversedCurrying& r)
const
283 operator()(_tParm, Parm1 arg1)
const
291 struct PolymorphicFunctorBase
301 template<
class _tFunctor>
302 class GFunctor :
public PolymorphicFunctorBase,
public _tFunctor
305 GFunctor(_tFunctor&& _f)
306 : PolymorphicFunctorBase(), _tFunctor(
yforward(_f))
309 template<
typename... _tArgs>
310 GFunctor(_tArgs&&... _args)
311 : PolymorphicFunctorBase(),