00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef MTL_VEC_VEC_ASGN_EXPR_INCLUDE
00016 #define MTL_VEC_VEC_ASGN_EXPR_INCLUDE
00017
00018
00019 namespace mtl { namespace vector {
00020
00021
00022 template <class E1, class E2>
00023 class vec_vec_asgn_expr
00024 {
00025 public:
00026
00027 typedef typename E1::value_type value_type;
00028
00029
00030
00031 typedef typename E1::size_type size_type;
00032
00033
00034 typedef value_type const_dereference_type ;
00035
00036 typedef E1 first_argument_type ;
00037 typedef E2 second_argument_type ;
00038
00039
00040 vec_vec_asgn_expr( first_argument_type& v1, second_argument_type const& v2 )
00041 : first( v1 ), second( v2 ), delayed_assign( false )
00042 {}
00043
00044 ~vec_vec_asgn_expr()
00045 {
00046 if (!delayed_assign)
00047 for (size_type i= 0; i < first.size(); ++i)
00048 first( i )= second( i );
00049 }
00050
00051 void delay_assign() { delayed_assign= true; }
00052
00053 size_type size() const {
00054 assert( first.size() == second_.size() ) ;
00055 return first.size() ;
00056 }
00057
00058 const_dereference_type operator() ( size_type i ) const {
00059 assert( delayed_assign );
00060 return first( i )= second( i ) ;
00061 }
00062
00063 const_dereference_type operator[] ( size_type i ) const {
00064 assert( delayed_assign );
00065 return first( i )= second( i ) ;
00066 }
00067
00068 private:
00069 first_argument_type& first ;
00070 second_argument_type const& second ;
00071 bool delayed_assign;
00072 } ;
00073
00074 } }
00075
00076
00077 namespace mtl { namespace traits {
00078
00079 template <class E1, class E2>
00080 struct category< vector::vec_vec_asgn_expr<E1,E2> >
00081 {
00082 typedef vector type ;
00083 } ;
00084
00085 }}
00086
00087 #endif
00088