00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef VCSN_ALGEBRA_CONCEPT_SEMIRING_BASE_HH
00018 # define VCSN_ALGEBRA_CONCEPT_SEMIRING_BASE_HH
00019
00020 # include <vaucanson/algebra/concept/monoid_base.hh>
00021 # include <vaucanson/misc/contract.hh>
00022 # include <string>
00023
00024 namespace vcsn {
00025
00026 namespace algebra {
00027
00031
00032
00033
00034
00036 template <class Self>
00037 struct SemiringBase : MonoidBase<Self>
00038 {
00039 public:
00046 template <class T>
00047 bool can_choose_non_starable(SELECTOR(T)) const;
00048
00050 template <class T>
00051 Element<Self, T> choose_starable(SELECTOR(T)) const;
00052
00054 template <class T>
00055 Element<Self, T> choose_non_starable(SELECTOR(T)) const;
00056 protected:
00058 SemiringBase();
00059
00061 SemiringBase(const SemiringBase& other);
00062 };
00063
00067 }
00068
00072
00073
00074
00075
00076 template<typename Self>
00077 struct dynamic_traits<algebra::SemiringBase<Self> >
00078 : dynamic_traits<algebra::MonoidBase<Self> >
00079 { };
00080
00081 template<typename S>
00082 struct virtual_types<algebra::SemiringBase<S> >
00083 : virtual_types<algebra::MonoidBase<S> >
00084 { };
00085
00086
00087
00088
00089
00091 template <typename Self, typename T>
00092 struct MetaElement<algebra::SemiringBase<Self>, T>
00093 : MetaElement<algebra::MonoidBase<Self>, T>
00094 {
00096 Element<Self, T>& star();
00097
00099 bool starable() const;
00100
00101 protected:
00103 MetaElement();
00104
00106 MetaElement(const MetaElement& other);
00107 };
00108
00110 template <typename S, typename T>
00111 struct op_star_traits
00112 {
00113 typedef Element<S, T> ret_t;
00114 };
00115
00117 template <typename S, typename T>
00118 typename op_star_traits<S, T>::ret_t
00119 star(const Element<S, T>& w);
00120
00122 template <typename S, typename T>
00123 bool
00124 parse_weight(Element<S, T>& w, const std::string&,
00125 typename std::string::const_iterator&);
00126
00128 template <typename S, typename T>
00129 bool starable(const Element<S, T>& elt);
00130
00134 namespace algebra {
00135
00136
00137
00139 template <typename S, typename T>
00140 bool
00141 op_can_choose_non_starable(const algebra::SemiringBase<S>& set,
00142 SELECTOR(T));
00143
00145 template <typename S, typename T>
00146 Element<S, T>
00147 op_choose_starable(const algebra::SemiringBase<S>& set, SELECTOR(T));
00148
00150 template <typename S, typename T>
00151 Element<S, T>
00152 op_choose_non_starable(const algebra::SemiringBase<S>& set, SELECTOR(T));
00153
00154
00155 template <typename S, typename T>
00156 bool
00157 op_parse(const algebra::SemiringBase<S>&, T& w,
00158 const std::string&,
00159 typename std::string::const_iterator&);
00160
00161 template <typename Self, typename T>
00162 bool op_starable(const algebra::SemiringBase<Self>& s, const T& v);
00163
00164 template <typename Self, typename T>
00165 void op_in_star(const algebra::SemiringBase<Self>& s, T& v);
00166
00167 template <typename Self, typename T>
00168 T op_default(SELECTOR(algebra::SemiringBase<Self>), SELECTOR(T));
00169
00170 }
00171
00172 }
00173
00174 # if !defined VCSN_USE_INTERFACE_ONLY || defined VCSN_USE_LIB
00175 # include <vaucanson/algebra/concept/semiring_base.hxx>
00176 # endif // VCSN_USE_INTERFACE_ONLY
00177
00178 #endif // ! VCSN_ALGEBRA_CONCEPT_SEMIRING_BASE_HH