00001 00002 #ifndef _INSTIGATE_OPEN_SOURCE_INTERNAL_HEADER_IN_CONCEPT 00003 #error This is an internal header file used to implement Instigate Algebra.\ 00004 It should never be included directly by a program. 00005 #endif 00006 00007 #ifndef INSTIGATE_ALGEBRA_ADDITIVE_MONOID_HPP 00008 #define INSTIGATE_ALGEBRA_ADDITIVE_MONOID_HPP 00009 00034 // headers from this project 00035 #include "_additive_semi_group.hpp" 00036 00037 // headers from other project 00038 #include <generic/base.hpp> 00039 00040 // headers from standart project 00041 00042 // forward declarations 00043 00044 namespace instigate { 00045 00046 namespace algebra { 00047 00061 namespace additive_monoid { 00062 struct tag; 00063 template<typename T> struct interface; 00064 template<typename T> struct requirements; 00065 00066 } // namespace instigate::algebra::additive_monoid 00067 00068 } // namespace instigate::algebra 00069 00070 } // namespace instigate 00071 00078 struct instigate::algebra::additive_monoid::tag: 00079 instigate::algebra::additive_semi_group::tag {}; 00080 00085 template<typename T> 00086 struct instigate::algebra::additive_monoid::interface: 00087 instigate::algebra::additive_semi_group::interface<T> 00088 { 00094 static T get_zero() 00095 { 00096 return instigate::algebra::interface<T>::get_zero(); 00097 } 00098 }; 00099 00107 template<typename T> 00108 struct instigate::algebra::additive_monoid::requirements: 00109 instigate::algebra::additive_semi_group::requirements<T> 00110 { 00115 static void require_get_zero() 00116 { 00117 instigate::algebra::additive_monoid::interface<T>::get_zero(); 00118 } 00119 00124 static void require_get_zero_return_type(const T& a) 00125 { 00126 REQUIRE_SAME_TYPE(a, interface<T>::get_zero()); 00127 } 00128 00136 requirements() 00137 { 00138 (void)&require_get_zero; 00139 (void)&require_get_zero_return_type; 00140 } 00141 }; 00142 00143 // vim:et:tabstop=8:shiftwidth=8:cindent:fo=croq: 00144 00145 #endif // INSTIGATE_ALGEBRA_ADDITIVE_MONOID_HPP