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