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
00044 template<class Self>
00045 struct SemigroupBase : Structure<Self>
00046 {
00047 protected:
00049 SemigroupBase();
00050
00052 SemigroupBase(const SemigroupBase& other);
00053 };
00054
00058 }
00059
00063
00064
00065
00066
00067 template<class Self>
00068 struct dynamic_traits<algebra::SemigroupBase<Self> >
00069 : dynamic_traits<Structure<Self> >
00070 { };
00071
00072 template<typename S>
00073 struct virtual_types<algebra::SemigroupBase<S> >
00074 : virtual_types<Structure<S> >
00075 {
00076 typedef undefined_type semigroup_kind;
00077 };
00078
00079
00080
00081
00082
00083
00085 template<class Self, typename T>
00086 struct MetaElement<algebra::SemigroupBase<Self>, T>
00087 : MetaElement<Structure<Self>, T>
00088 {
00089 protected:
00091 MetaElement();
00092
00094 MetaElement(const MetaElement& other);
00095 };
00096
00100 }
00101
00102 # ifndef VCSN_USE_INTERFACE_ONLY
00103 # include <vaucanson/algebra/concept/semigroup_base.hxx>
00104 # endif // VCSN_USE_INTERFACE_ONLY
00105
00106 #endif // ! VCSN_ALGEBRA_CONCEPT_SEMIGROUP_BASE_HH