MEL
Microthread & Execution library
assign.h
1 #pragma once
2 #include <mpl/TypeTraits.h>
3 #include <mpl/_If.h>
4 #include <mpl/Int2Type.h>
6 #include <mpl/equal.h>
7 
8 namespace mel
9 {
10  namespace mpl
11  {
17  template <class T,class T2,bool isFunctor>
18  class Assign
19  {
20  public:
21  Assign( T& p1, typename _if< isFunctor && !TypeTraits<T2>::isPointer ,const T2&,typename TypeTraits<T2>::ParameterType >::Result p2) :
22  mP1( p1 ),
23  mP2( p2 )
24  {
25  }
26  T& operator()( )
27  {
28  return _assign( mP1,mP2,_isfunctor );
29  }
30  template <class F2>
31  bool operator == ( const F2& ob2 ) const
32  {
33  return equality( Int2Type< Conversion<F2, Assign<T,T2,isFunctor> >::exists >(),ob2 );
34  }
35 
36  private:
37  static Int2Type<isFunctor> _isfunctor;
38  T& mP1;
39  T2 mP2; //TODO no estoy seguro de si tendr� que usar type_traits para usar o no referencia
40  T& _assign( T& p1, typename TypeTraits<T2>::ParameterType p2,Int2Type<false> )
41  {
42  return p1 = p2;
43  }
44  T& _assign( T& p1, /*typename TypeTraits<typename TypeTraits<T2>::ParameterType>::NoConst*/ T2& p2,Int2Type<true> )
45  {
46  return p1 = p2();
47  }
48 
49  template <class F>
50  bool equality( Int2Type<false>,const F&) const
51  {
52  return false;
53  }
54  bool equality( Int2Type<true>,const Assign<T,T2,isFunctor> & a2) const
55  {
56  //return ( mP1 == a2.mP1 && mP2 == a2.mP2 );
57  return mel::mpl::equal<true>(mP1,a2.mP1) &&::mel::mpl::equal<true>( mP2, a2.mP2 );
58  }
59 
60  };
61  template < bool isFunctor,class T,class T2 >
62  Assign<T,T2,isFunctor> assign( T& p1,T2 p2/*typename TypeTraits<T2>::ParameterType p2*/ )
63  {
64  return Assign<T,T2,isFunctor>(p1,p2);
65  }
66  template<class T, class T2,bool isFunctor> Int2Type<isFunctor> Assign<T,T2,isFunctor>::_isfunctor = Int2Type<isFunctor>();
67  }
68 }
Typical Traits for types.
Definition: assign.h:19
Definition: TypeTraits.h:296
Definition: Callback_Impl.h:11
Definition: _If.h:16
Definition: Conversion.h:14
Definition: Int2Type.h:12