00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 #ifndef VCSN_AUTOMATA_CONCEPT_AUTOMATA_KIND_HH
00018 # define VCSN_AUTOMATA_CONCEPT_AUTOMATA_KIND_HH
00019 
00020 # include <utility>
00021 
00022 namespace vcsn {
00023 
00024   struct labels_are_letters {};
00025   struct labels_are_words   {};
00026   struct labels_are_series  {};
00027   struct labels_are_couples {};
00028 
00029   template <class Kind,
00030             class WordValue,
00031             class WeightValue,
00032             class SeriesValue,
00033             class Letter>
00034   struct LabelOf;
00035 
00036   template <class WordValue,
00037             class WeightValue,
00038             class SeriesValue,
00039             class Letter>
00040   struct LabelOf<labels_are_letters, WordValue, WeightValue,
00041                  SeriesValue, Letter>
00042   {
00043     typedef Letter      ret;
00044   };
00045 
00046   template <class WordValue,
00047             class WeightValue,
00048             class SeriesValue,
00049             class Letter>
00050   struct LabelOf<labels_are_series, WordValue, WeightValue,
00051                  SeriesValue, Letter>
00052   {
00053     typedef SeriesValue ret;
00054   };
00055 
00056   template <class WordValue,
00057             class WeightValue,
00058             class SeriesValue,
00059             class Letter>
00060   struct LabelOf<labels_are_couples, WordValue, WeightValue,
00061                  SeriesValue, Letter>
00062   {
00063     typedef std::pair<WeightValue, WordValue>   ret;
00064   };
00065 
00066   template <class WordValue,
00067             class WeightValue,
00068             class SeriesValue,
00069             class Letter>
00070   struct LabelOf<labels_are_words, WordValue, WeightValue,
00071                  SeriesValue, Letter>
00072   {
00073     typedef WordValue   ret;
00074   };
00075 
00076 } 
00077 
00078 #endif // ! VCSN_AUTOMATA_CONCEPT_AUTOMATA_KIND_HH