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_GROUP_HPP 00008 #define INSTIGATE_ALGEBRA_ADDITIVE_GROUP_HPP 00009 00034 // Headers from this project 00035 #include "_additive_monoid.hpp" 00036 00037 // Headers from other projects 00038 #include <generic/base.hpp> 00039 00040 // Headers from standard libraries 00041 00042 // Forward declarations 00043 namespace instigate { 00044 00045 namespace algebra { 00046 00066 namespace additive_group { 00067 struct tag; 00068 template <typename T> struct interface; 00069 template <typename T> struct requirements; 00070 00071 } // namespace instigate::algebra::additive_group 00072 00073 } // namespace instigate::algebra 00074 00075 } // namespace instigate 00076 00083 struct instigate::algebra::additive_group::tag : 00084 instigate::algebra::additive_monoid::tag {}; 00085 00091 template <typename T> 00092 struct instigate::algebra::additive_group::interface : 00093 instigate::algebra::additive_monoid::interface<T> 00094 { 00102 static T opposite(const T& a) 00103 { 00104 return instigate::algebra::interface<T>::opposite(a); 00105 } 00106 00115 static T minus(const T& a, const T& b) 00116 { 00117 return instigate::algebra::interface<T>::minus(a, b); 00118 } 00119 }; 00120 00128 template <typename T> 00129 struct instigate::algebra::additive_group::requirements : 00130 instigate::algebra::additive_monoid::requirements<T> 00131 { 00135 static void require_opposite(const T& a) 00136 { 00137 instigate::algebra::additive_group::interface<T>::opposite(a); 00138 } 00139 00143 static void require_opposite_return_type(const T& a) 00144 { 00145 REQUIRE_SAME_TYPE(a, interface<T>::opposite(a)); 00146 } 00147 00151 static void require_minus(const T& a, const T& b) 00152 { 00153 instigate::algebra::additive_group::interface<T>::minus(a, b); 00154 } 00155 00159 static void require_minus_return_type(const T& a, const T& b) 00160 { 00161 REQUIRE_SAME_TYPE(a, interface<T>::minus(a, b)); 00162 } 00163 00170 requirements() 00171 { 00172 (void)&require_opposite; 00173 (void)&require_opposite_return_type; 00174 (void)&require_minus; 00175 (void)&require_minus_return_type; 00176 } 00177 }; 00178 00179 // vim:et:tabstop=8:shiftwidth=8:cindent:fo=croq:textwidth=80: 00180 00181 #endif // INSTIGATE_ALGEBRA_ADDITIVE_GROUP_HPP