00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef Tanl_POS_State_H
00025 #define Tanl_POS_State_H
00026
00027 #include "Tag.h"
00028
00029
00030 #include <vector>
00031 #include <tr1/unordered_map>
00032
00033 namespace Tanl { namespace POS {
00034
00039 struct State : public std::vector<TagID>
00040 {
00041 State(TagID tag = 0) : std::vector<TagID>(tag_order + 1, tag) { }
00042
00043
00044 State add(TagID n) {
00045 State res(size());
00046 res[0] = n;
00047 for (int i = 1; i < size(); ++i)
00048 res[i+1] = (*this)[i];
00049 return res;
00050 }
00051
00052 int compareTo(State const& other) const {
00053 int i = 0;
00054 for (; i <= tag_order && i < size() && i < other.size(); i++) {
00055 TagID t1 = (*this)[i];
00056 TagID t2 = other[i];
00057 if (t1 < t2)
00058 return -1;
00059 else if (t1 > t2)
00060 return 1;
00061 }
00062 if (i > tag_order || i == size() && i == other.size())
00063 return 0;
00064 return (i == size()) ? -1 : 1;
00065 }
00066
00067 static int tag_order;
00068
00069 };
00070
00071 inline bool operator ==(State const& s1, State const& s2) {
00072 return s1.compareTo(s2) == 0;
00073 }
00074
00075 }
00076 }
00077
00078 namespace std { namespace tr1 {
00079
00080 template<>
00081 struct hash<Tanl::POS::State const&> : public std::unary_function<Tanl::POS::State const&, std::size_t>
00082 {
00083 std::size_t operator()(Tanl::POS::State const& __s) const
00084 {
00085 unsigned long __h = 0;
00086 for (int i = 0; i < __s.size() ; ++i)
00087 __h = 131 * __h + (unsigned int)__s[i];
00088 return size_t(__h);
00089 }
00090 };
00091 }}
00092
00093 #endif // Tanl_POS_State_H