00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef VCSN_ALGEBRA_IMPLEMENTATION_LETTER_RANGE_HH
00018 # define VCSN_ALGEBRA_IMPLEMENTATION_LETTER_RANGE_HH
00019
00020 # include <vaucanson/algebra/concept/letter.hh>
00021
00022 namespace vcsn {
00023
00024 namespace algebra {
00025
00026 template <class T, class Interval>
00027 class static_ranged
00028 {
00029 public:
00030 static_ranged();
00031 static_ranged(const T& v);
00032 static_ranged(const static_ranged& r);
00033 operator T() const;
00034 static_ranged randomized();
00035 T& value();
00036 const T& value() const;
00037
00038
00039
00040 private:
00041 T value_;
00042 };
00043
00044 template <char From, char To>
00045 struct static_char_interval
00046 {
00047 static bool check(char c);
00048 static char from();
00049 static char to();
00050 static char random();
00051 enum bounds
00052 {
00053 from_value = From,
00054 to_value = To
00055 };
00056 };
00057
00058 template <class T, class Interval>
00059 struct letter_traits< static_ranged<T, Interval> >
00060 {
00061 enum
00062 {
00063 cardinal = Interval::to_value - Interval::from_value + 1
00064 };
00065 };
00066
00067
00068 template <class T, class Interval>
00069 bool operator<(const static_ranged<T, Interval>& lhs,
00070 const static_ranged<T, Interval>& rhs);
00071
00072 template <class T, class Interval>
00073 bool operator==(const static_ranged<T, Interval>& lhs,
00074 const static_ranged<T, Interval>& rhs);
00075
00076 template <class Stream, class T, class Interval>
00077 Stream& operator<<(Stream& s, static_ranged<T, Interval>& sr)
00078 {
00079 s << sr.value ();
00080 return s;
00081 }
00082
00083 }
00084
00085 }
00086
00087
00088 # ifndef VCSN_USE_INTERFACE_ONLY
00089 # include <vaucanson/algebra/implementation/letter/range.hxx>
00090 # endif // VCSN_USE_INTERFACE_ONLY
00091
00092
00093 #endif // ! VCSN_ALGEBRA_IMPLEMENTATION_LETTER_RANGE_HH