1 #ifndef color_generic_operation_addition_123 2 #define color_generic_operation_addition_123 3 4 // ::color::operation::addition( result, right ) 5 // ::color::operation::addition( result, left, right ) 6 7 8 9 10 #include "../model.hpp" 11 12 13 14 15 16 17 18 namespace color 19 { 20 namespace operation 21 { 22 namespace _internal 23 { 24 25 template< typename category_name> 26 struct addition 27 { 28 public: 29 typedef category_name category_type; 30 31 typedef ::color::trait::index< category_type > index_trait_type; 32 typedef ::color::trait::container< category_type > container_trait_type; 33 34 35 36 typedef ::color::model<category_type> model_type; 37 38 typedef model_type & model_output_type; 39 typedef model_type const& model_const_input_type; 40 41 typedef model_type result_type; 42 typedef model_type left_type, first_argument_type; 43 typedef model_type right_type, second_argument_type; 44 45 typedef typename index_trait_type::instance_type index_type; 46 47 typedef ::color::operation::_internal::addition<category_type> this_type; 48 operator ()color::operation::_internal::addition49 model_type operator()( model_type const& left, model_type const& right ) const 50 { 51 return this_type::function( left, right ); 52 } 53 operator ()color::operation::_internal::addition54 model_type& operator()( model_output_type result, model_const_input_type left, model_const_input_type right ) const 55 { 56 return this_type::procedure( result, left, right ); 57 } 58 59 public: accumulatecolor::operation::_internal::addition60 static model_type & accumulate( model_output_type result, model_const_input_type right ) 61 { 62 for( index_type index = 0; index < container_trait_type::size(); index ++ ) 63 { 64 result.set( index, result.get( index ) + right.get( index ) ); 65 } 66 return result; 67 } 68 functioncolor::operation::_internal::addition69 static model_type function( model_const_input_type left, model_const_input_type right ) 70 { 71 model_type result; 72 for( index_type index = 0; index < container_trait_type::size(); index ++ ) 73 { 74 result.set( index, left.get( index ) + right.get( index ) ); 75 } 76 return result; 77 } 78 procedurecolor::operation::_internal::addition79 static model_type & procedure( model_output_type result, model_const_input_type left, model_const_input_type right ) 80 { 81 for( index_type index = 0; index < container_trait_type::size(); index ++ ) 82 { 83 result.set( index, left.get( index ) + right.get( index ) ); 84 } 85 return result; 86 } 87 }; 88 89 } 90 91 template< typename category_name > 92 ::color::model<category_name> & addition(::color::model<category_name> & result,::color::model<category_name> const & right)93 addition 94 ( 95 ::color::model<category_name> & result 96 ,::color::model<category_name> const& right 97 ) 98 { 99 return ::color::operation::_internal::addition<category_name>::accumulate( result, right ); 100 } 101 102 template< typename category_name > 103 ::color::model<category_name> & addition(::color::model<category_name> & result,::color::model<category_name> const & left,::color::model<category_name> const & right)104 addition 105 ( 106 ::color::model<category_name> & result 107 ,::color::model<category_name> const& left 108 ,::color::model<category_name> const& right 109 ) 110 { 111 return ::color::operation::_internal::addition<category_name>::procedure( result, left, right ); 112 } 113 114 } 115 } 116 117 #endif 118