LocARNA-1.9.2
|
00001 #ifndef LOCARNA_ALPHABET_HH 00002 #define LOCARNA_ALPHABET_HH 00003 00004 #ifdef HAVE_CONFIG_H 00005 #include <config.h> 00006 #endif 00007 00008 #include <vector> 00009 #include <map> 00010 #include <iosfwd> 00011 #include <assert.h> 00012 00013 namespace LocARNA { 00014 00022 template <class T> 00023 class Alphabet { 00024 typedef std::vector<T> vec_t; 00025 00026 public: 00027 typedef typename vec_t::size_type size_type; 00028 private: 00029 typedef std::map<T, size_type> hash_t; 00030 00031 vec_t alph_vec; 00032 hash_t alph_hash; 00033 00034 public: 00035 typedef size_type index_type; 00036 typedef T elem_type; 00037 typedef std::vector<T> elem_vector_type; 00038 00040 typedef typename elem_vector_type::iterator iterator; 00041 00043 typedef typename elem_vector_type::const_iterator const_iterator; 00044 00046 Alphabet(); 00047 00049 explicit Alphabet(const elem_vector_type &a); 00050 00052 Alphabet(const elem_type *s, int len); 00053 00055 size_type 00056 size() const; 00057 00059 size_type 00060 idx(const elem_type &elem) const; 00061 00067 const elem_type & 00068 elem(size_type idx) const; 00069 00071 bool 00072 in(const elem_type &elem) const; 00073 00075 const_iterator 00076 begin() const { 00077 return alph_vec.begin(); 00078 } 00079 00081 const_iterator 00082 end() const { 00083 return alph_vec.end(); 00084 } 00085 00087 iterator 00088 begin() { 00089 return alph_vec.begin(); 00090 } 00091 00093 iterator 00094 end() { 00095 return alph_vec.end(); 00096 } 00097 00098 private: 00100 void 00101 init(const vec_t &a); 00102 }; 00103 00112 template <class T> 00113 std::ostream & 00114 operator<<(std::ostream &out, const Alphabet<T> &a); 00115 } 00116 00117 #include "alphabet.icc" 00118 00119 #endif // LOCARNA_ALPHABET_HH