Vaucanson  1.4.1
series_base.hh
1 // series_base.hh: this file is part of the Vaucanson project.
2 //
3 // Vaucanson, a generic library for finite state machines.
4 //
5 // Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 The Vaucanson Group.
6 //
7 // This program is free software; you can redistribute it and/or
8 // modify it under the terms of the GNU General Public License
9 // as published by the Free Software Foundation; either version 2
10 // of the License, or (at your option) any later version.
11 //
12 // The complete GNU General Public Licence Notice can be found as the
13 // `COPYING' file in the root directory.
14 //
15 // The Vaucanson Group consists of people listed in the `AUTHORS' file.
16 //
17 #ifndef VCSN_ALGEBRA_CONCEPT_SERIES_BASE_HH
18 # define VCSN_ALGEBRA_CONCEPT_SERIES_BASE_HH
19 
20 # include <vaucanson/algebra/concept/semiring_base.hh>
21 # include <vaucanson/algebra/concept/freemonoid_base.hh>
22 
23 namespace vcsn {
24 
25  namespace algebra {
26 
30  /*-----------------.
31  | SeriesBase<Self> |
32  `-----------------*/
33 
36  template<class Self>
37  struct SeriesBase
38  : SemiringBase<Self>
39  {
41  typedef typename virtual_types<Self>::monoid_t monoid_t;
42 
44  typedef typename virtual_types<Self>::semiring_t semiring_t;
45 
47  const monoid_t& monoid() const;
48 
50  const semiring_t& semiring() const;
51 
53  monoid_t& monoid();
54 
57 
58  protected:
60  SeriesBase();
61 
63  SeriesBase(const SeriesBase& other);
64  };
65 
67  template<typename T>
69  {
70  typedef undefined_type monoid_elt_value_t;
71  typedef undefined_type semiring_elt_value_t;
72  };
73 
74  template <typename T, typename W, typename M>
75  struct mute_series_impl
76  {
77  typedef undefined_type ret;
78  };
79 
80  template <typename T, typename W, typename M>
81  struct mute_series_traits
82  {
83  typedef undefined_type ret;
84  };
85 
89  } // algebra
90 
94  /*----------------------------------.
95  | dynamic_traits<SeriesBase<Self> > |
96  `----------------------------------*/
97 
98  template<typename Self>
99  struct dynamic_traits<algebra::SeriesBase<Self> >
100  : dynamic_traits<algebra::SemiringBase<Self> >
101  {};
102 
103  template<typename Self>
104  struct virtual_types<algebra::SeriesBase<Self> >
105  : virtual_types<algebra::SemiringBase<Self> >
106  {
107  typedef undefined_type monoid_t;
108  typedef undefined_type semiring_t;
109  };
110 
111  /*---------------------------------.
112  | MetaElement<SeriesBase<Self>, T> |
113  `---------------------------------*/
114 
116  template<class Self, typename T>
117  class MetaElement<algebra::SeriesBase<Self>, T>
118  : public MetaElement<algebra::SemiringBase<Self>, T>
119  {
120  public:
122  typedef typename algebra::series_traits<T>::semiring_elt_value_t semiring_elt_value_t;
123 
125  typedef typename algebra::series_traits<T>::monoid_elt_value_t monoid_elt_value_t;
126 
129 
132 
134  typedef typename Self::monoid_t monoid_t;
135 
137  typedef typename Self::semiring_t semiring_t;
138 
140  typedef Self series_set_t;
141 
144 
147 
149  semiring_elt_value_t get(const monoid_elt_value_t& m) const;
150 
152  semiring_elt_t get(const monoid_elt_t& m) const;
153 
157  void assoc(const monoid_elt_value_t& m, const semiring_elt_value_t& w);
158 
162  void assoc(const monoid_elt_t& m, const semiring_elt_t& w);
163 
165  bool is_finite_app() const;
166 
168  monoid_elt_t choose_from_supp() const;
169 
171  void transpose();
172 
180  support_t supp() const;
181 
182  series_set_t series() const;
183 
184  protected:
186  MetaElement();
187 
189  MetaElement(const MetaElement& other);
190  };
191 
193  template <typename S, typename T>
195  transpose(const algebra::SeriesBase<S>& s, const T& t);
196 
198  template <typename S, typename T>
199  bool
201 
203  template <typename S1, typename S2, typename T1, typename T2>
204  void
206 
208  template <class S, class T>
210  const Element<S, T>& rhs);
211 
216  /*------.
217  | Ops. |
218  `------*/
219 
220  namespace algebra {
221 
222  template <typename S, typename T>
223  bool
224  op_is_finite_app(const algebra::SeriesBase<S>& s, const T& t);
225 
226  template <typename S, typename T>
227  typename MetaElement<algebra::SeriesBase<S>, T>::monoid_elt_t
228  op_choose_from_supp(const algebra::SeriesBase<S>& s, const T& t);
229 
230  template <class S, class T>
232  op_series_choose(const algebra::SeriesBase<S>& s, SELECTOR(T));
233 
234  template <typename S, typename T, typename M, typename W>
235  void
236  op_series_set(const algebra::SeriesBase<S>& s, const T& t, const W& w);
237 
238  template <class S, class T>
240  op_support(const algebra::SeriesBase<S>&, const T& v);
241 
242  // This conversion is needed when assigning a monoid element to a series.
243  template <class S, class M>
244  S
245  op_convert(const algebra::SeriesBase<S>&,
247 
248  template <class S, class T>
249  T
250  op_convert(const algebra::SeriesBase<S>& s, SELECTOR(T), const T& src_);
251 
252  template <class S, class T, class U>
253  T
254  op_convert(const algebra::SeriesBase<S>&, SELECTOR(T), U& src_);
255 
257  template<typename S, typename St, typename T>
258  St& op_rout(const algebra::SeriesBase<S>& s, St& st, const T& se);
259 
260  } // algebra
261 
262 } // vcsn
263 
264 # if !defined VCSN_USE_INTERFACE_ONLY || defined VCSN_USE_LIB
265 # include <vaucanson/algebra/concept/series_base.hxx>
266 # endif // VCSN_USE_INTERFACE_ONLY
267 
268 #endif // ! VCSN_ALGEBRA_CONCEPT_SERIES_BASE_HH