00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 #ifndef VCSN_ALGEBRA_CONCEPT_SEMIGROUP_BASE_HH
00018 # define VCSN_ALGEBRA_CONCEPT_SEMIGROUP_BASE_HH
00019 
00020 # include <vaucanson/design_pattern/design_pattern.hh>
00021 
00022 namespace vcsn {
00023 
00024   namespace algebra {
00025 
00029 
00030 
00031     struct mul_kind
00032     {};
00033 
00036     struct add_kind
00037     {};
00038 
00042     template<class Self>
00043     struct SemigroupBase : Structure<Self>
00044     {
00045     protected:
00047       SemigroupBase();
00048 
00050       SemigroupBase(const SemigroupBase& other);
00051     };
00052 
00056   } 
00057 
00061   
00062 
00063 
00064 
00065   template<class Self>
00066   struct dynamic_traits<algebra::SemigroupBase<Self> >
00067     : dynamic_traits<Structure<Self> >
00068   { };
00069 
00070   template<typename S>
00071   struct virtual_types<algebra::SemigroupBase<S> >
00072     : virtual_types<Structure<S> >
00073   { };
00074 
00075 
00076   
00077 
00078 
00079 
00081   template<class Self, typename T>
00082   struct MetaElement<algebra::SemigroupBase<Self>, T>
00083     : MetaElement<Structure<Self>, T>
00084   {
00085   protected:
00087     MetaElement();
00088 
00090     MetaElement(const MetaElement& other);
00091   };
00092 
00096 } 
00097 
00098 # if !defined VCSN_USE_INTERFACE_ONLY || defined VCSN_USE_LIB
00099 #  include <vaucanson/algebra/concept/semigroup_base.hxx>
00100 # endif // VCSN_USE_INTERFACE_ONLY
00101 
00102 #endif // ! VCSN_ALGEBRA_CONCEPT_SEMIGROUP_BASE_HH