17 #ifndef VCSN_ALGEBRA_CONCEPT_FREEMONOID_PRODUCT_HH 
   18 # define VCSN_ALGEBRA_CONCEPT_FREEMONOID_PRODUCT_HH 
   20 # include <vaucanson/algebra/concept/freemonoid_product_base.hh> 
   21 # include <vaucanson/algebra/implementation/monoid/monoid_rep.hh> 
   22 # include <vaucanson/algebra/implementation/series/series_rep.hh> 
   36     template <
class F, 
class S>
 
   37     struct FreeMonoidProduct;
 
   43     template <
typename F, 
typename S>
 
   44     struct MonoidRep<FreeMonoidProduct<F, S> > :
 
   45            MonoidRepBase<MonoidRep, FreeMonoidProduct<F, S> >
 
   54       std::string close_par;
 
   63     template <
typename Semiring, 
typename F, 
typename S>
 
   64     struct SeriesRep<Semiring, FreeMonoidProduct<F, S> > :
 
   65            SeriesRepBase<SeriesRep, Semiring, FreeMonoidProduct<F, S> >
 
   68       typedef Semiring                          semiring_t;
 
   71       typedef FreeMonoidProduct<F, S>           monoid_t;
 
   74       typedef SeriesRep<semiring_t, monoid_t>   self_t;
 
   77       typedef boost::shared_ptr<self_t>         pointer_t;
 
   80       typedef SeriesRep<Semiring, F> first_rep_t;
 
   81       typedef SeriesRep<Semiring, S> second_rep_t;
 
   84       first_rep_t& first_representation();
 
   85       second_rep_t& second_representation();
 
   86       const first_rep_t& first_representation() 
const;
 
   87       const second_rep_t& second_representation() 
const;
 
   89       void disambiguate(
const monoid_t&, pointer_t&);
 
   94       first_rep_t first_representation_;
 
   97       second_rep_t second_representation_;
 
  100     template <
typename F, 
typename S>
 
  101     bool operator==(boost::shared_ptr<MonoidRep<FreeMonoidProduct<F, S> > >,
 
  102                     boost::shared_ptr<MonoidRep<FreeMonoidProduct<F, S> > >);
 
  104     template <
typename Semiring, 
typename F, 
typename S>
 
  105     bool operator==(boost::shared_ptr<SeriesRep<Semiring,
 
  106                                                 FreeMonoidProduct<F, S> > >,
 
  107                     boost::shared_ptr<SeriesRep<Semiring,
 
  108                                                 FreeMonoidProduct<F, S> > >);
 
  115     template<
class F, 
class S>
 
  122       typedef MonoidRep<FreeMonoidProduct<F, S> > monoid_rep_t;
 
  123       typedef boost::shared_ptr<monoid_rep_t> shared_monoid_rep_t;
 
  155       shared_monoid_rep_t       rep_;
 
  158     template<
class F, 
class S>
 
  174   template<
class F, 
class S>
 
  175   struct dynamic_traits<algebra::FreeMonoidProduct<F, S> >
 
  176     : dynamic_traits<algebra::FreeMonoidProductBase<algebra::FreeMonoidProduct<F, S> > >
 
  180     ret = dynamic_traits<F>::ret or dynamic_traits<S>::ret;
 
  188   template<
class F, 
class S, 
typename T>
 
  190     : 
MetaElement<algebra::FreeMonoidProductBase<algebra::FreeMonoidProduct<F, S> >, T>
 
  192     typedef F   first_monoid_t;
 
  193     typedef S   second_monoid_t;
 
  200   template <
class F, 
class S>
 
  201   struct virtual_types<algebra::FreeMonoidProduct<F, S> >
 
  202     : virtual_types<algebra::FreeMonoidProductBase<algebra::FreeMonoidProduct<F, S> > >
 
  204     typedef F           first_monoid_t;
 
  205     typedef S           second_monoid_t;
 
  210 # if !defined VCSN_USE_INTERFACE_ONLY || defined VCSN_USE_LIB 
  211 #  include <vaucanson/algebra/concept/freemonoid_product.hxx> 
  212 # endif // VCSN_USE_INTERFACE_ONLY 
  215 #endif // ! VCSN_ALGEBRA_CONCEPT_FREEMONOID_PRODUCT_HH