00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef VCSN_DESIGN_PATTERN_SYNTACTIC_DECORATOR_HXX
00018 # define VCSN_DESIGN_PATTERN_SYNTACTIC_DECORATOR_HXX
00019
00020 # include <vaucanson/misc/selectors.hh>
00021 # include <vaucanson/design_pattern/syntactic_decorator.hh>
00022 # include <vaucanson/misc/contract.hh>
00023
00024 namespace vcsn {
00025 template <typename S, typename T>
00026 Element<S, T>&
00027 SyntacticDecorator<S, T>::self()
00028 {
00029 return *static_cast<Element<S, T>*>(this);
00030 }
00031
00032 template <typename S, typename T>
00033 const Element<S, T>&
00034 SyntacticDecorator<S, T>::self() const
00035 {
00036 return *static_cast<const Element<S, T>*>(this);
00037 }
00038
00039
00040 template <typename S, typename T>
00041 const S&
00042 SyntacticDecorator<S, T>::structure() const
00043 {
00044 return self().structure();
00045 }
00046
00047 template <typename S, typename T>
00048 T&
00049 SyntacticDecorator<S, T>::value()
00050 {
00051 return self().value();
00052 }
00053
00054 template <typename S, typename T>
00055 const T&
00056 SyntacticDecorator<S, T>::value() const
00057 {
00058 return self().value();
00059 }
00060
00061 #define ELEMENT_IN_OPERATOR(Op, HookName) \
00062 template <typename S, typename T> \
00063 template<typename OtherS, typename U> \
00064 Element<S, T>& \
00065 SyntacticDecorator<S, T>::Op (const Element<OtherS, U>& other) \
00066 { \
00067 op_in_ ## HookName (self().structure(), \
00068 other.structure(), \
00069 value(), \
00070 other.value()); \
00071 return self(); \
00072 } \
00073 \
00074 template <typename S, typename T> \
00075 template<typename U> \
00076 Element<S, T>& \
00077 SyntacticDecorator<S, T>::Op (const U& other) \
00078 { \
00079 op_in_ ## HookName (self().structure(), \
00080 value(), \
00081 op_convert(self().structure(), SELECT(T), other)); \
00082 return self(); \
00083 }
00084
00085 ELEMENT_IN_OPERATOR(operator +=, add);
00086 ELEMENT_IN_OPERATOR(operator -=, sub);
00087 ELEMENT_IN_OPERATOR(operator /=, div);
00088 ELEMENT_IN_OPERATOR(operator *=, mul);
00089 ELEMENT_IN_OPERATOR(operator %=, mod);
00090
00091 #undef ELEMENT_IN_OPERATOR
00092
00093 template <typename S, typename T>
00094 Element<S, T>&
00095 SyntacticDecorator<S, T>::operator++()
00096 {
00097 op_in_inc(self().structure(), self().value());
00098 return self();
00099 }
00100
00101 template <typename S, typename T>
00102 Element<S, T>
00103 SyntacticDecorator<S, T>::operator++(int)
00104 {
00105 Element<S, T> ret(self());
00106 op_in_inc(self().structure(), self().value());
00107 return ret;
00108 }
00109
00110 template <typename S, typename T>
00111 Element<S, T>&
00112 SyntacticDecorator<S, T>::operator--()
00113 {
00114 op_in_dec(self().structure(), self().value());
00115 return self();
00116 }
00117
00118 template <typename S, typename T>
00119 Element<S, T>
00120 SyntacticDecorator<S, T>::operator--(int)
00121 {
00122 Element<S, T> ret(self());
00123 op_in_dec(self().structure(), self().value());
00124 return ret;
00125 }
00126
00127 template <typename S, typename T>
00128 template <typename U>
00129 Element<S, T>&
00130 SyntacticDecorator<S, T>::swap(Element<S, U>& other)
00131 {
00132 precondition(&structure() == &other.structure());
00133 op_swap(structure(), value(), other.value());
00134 return self();
00135 }
00136
00137 template <typename S, typename T>
00138 SyntacticDecorator<S, T>::SyntacticDecorator()
00139 {}
00140
00141 template <typename S, typename T>
00142 SyntacticDecorator<S, T>::SyntacticDecorator(const SyntacticDecorator&)
00143 {}
00144
00145 }
00146
00147 #endif // ! VCSN_DESIGN_PATTERN_SYNTACTIC_DECORATOR_HXX