#ifndef ALGO_BITS_IMPL_LAMBDA_H #define ALGO_BITS_IMPL_LAMBDA_H #define ALGO_OP_BINARY( NAME, OP ) \ template \ struct _op_##NAME { \ \ template \ struct _ { \ typedef typename tmpl_if::REF && !traits::CONST, \ Arg0, typename traits::b_ref_t>::result Type; \ \ typedef typeof(_makeT()(_makeT()) OP \ _makeT()(_makeT())) return_t; \ }; \ \ _op_##NAME(Ftor1 ftor1, Ftor2 ftor2) : m_ftor1(ftor1), m_ftor2(ftor2) {} \ \ template \ typename _::return_t operator () (Arg0& arg0) { \ return m_ftor1(arg0) OP m_ftor2(arg0); \ } \ \ template \ typename _::return_t operator () (const Arg0& arg0) { \ return m_ftor1(arg0) OP m_ftor2(arg0); \ } \ \ Ftor1 m_ftor1; \ Ftor2 m_ftor2; \ }; #define ALGO_MK_BINARY( NAME, OP ) \ template \ inline _wrapper<_op_##NAME > \ operator OP (_wrapper w1, _wrapper w2) { \ return make_wrapper(_op_##NAME(w1.m_ftor, w2.m_ftor)); \ } #define ALGO_OP_UNARY( NAME, OP ) \ template \ struct _op_##NAME { \ \ template \ struct _ { \ typedef typename tmpl_if::REF && !traits::CONST, \ Arg0, typename traits::b_ref_t>::result Type; \ \ typedef typeof( OP _makeT()(_makeT()) ) return_t; \ }; \ \ _op_##NAME(Ftor1 ftor1) : m_ftor1(ftor1) {} \ \ template \ typename _::return_t operator () (Arg0& arg0) { \ return OP m_ftor1(arg0); \ } \ \ template \ typename _::return_t operator () (const Arg0& arg0) { \ return OP m_ftor1(arg0); \ } \ \ Ftor1 m_ftor1; \ }; \ \ template \ inline _wrapper<_op_##NAME > \ operator OP (_wrapper w1) { \ return make_wrapper(_op_##NAME(w1.m_ftor)); \ } namespace algo { template struct op_cast { template struct _ { typedef Ret return_t; }; op_cast(Ftor ftor) : m_ftor(ftor) {} template typename _::return_t operator () (Arg0& arg0) { return m_ftor(arg0); } template typename _::return_t operator () (const Arg0& arg0) { return m_ftor(arg0); } Ftor m_ftor; }; } #endif