00001
00002 #ifndef __ug_ttrack_position_h
00003 #define __ug_ttrack_position_h
00004
00005 #include <cassert>
00006 #include "ug_typedefs.h"
00007
00008
00009
00010
00011
00012
00013 namespace sapt
00014 {
00015 using tpt::id_type;
00016 namespace ttrack
00017 {
00020 class
00021 Position
00022 {
00023 public:
00024 id_type sid;
00025 ushort offset;
00026 Position();
00027 Position(id_type _sid, ushort _off);
00028 template<typename TTRACK_TYPE> class LESS;
00029 };
00030
00031 #if 1
00032 template<typename TTRACK_TYPE>
00033 class
00034 Position::
00035 LESS
00036 {
00037 TTRACK_TYPE const* c;
00038 public:
00039 typedef typename TTRACK_TYPE::Token Token;
00040
00041 LESS(TTRACK_TYPE const* crp) : c(crp) {};
00042
00043 bool operator()(Position const& A, Position const& B) const
00044 {
00045 Token const* a = c->getToken(A); assert(a);
00046 Token const* b = c->getToken(B); assert(b);
00047
00048 if (a == b) return false;
00049
00050 Token const* bosA = c->sntStart(A.sid);
00051 Token const* eosA = c->sntEnd(A.sid);
00052
00053 Token const* bosB = c->sntStart(B.sid);
00054 Token const* eosB = c->sntEnd(B.sid);
00055
00056 #if 0
00057 Token const* z = a;
00058 cout << "A: " << z->id();
00059 for (z = next(z); z >= bosA && z < eosA; z = next(z))
00060 cout << "-" << z->id();
00061 cout << std::endl;
00062
00063 z = b;
00064 cout << "B: " << z->id();
00065 for (z = next(z); z >= bosB && z < eosB; z = next(z))
00066 cout << "-" << z->id();
00067 cout << std::endl;
00068 #endif
00069 while (*a == *b)
00070 {
00071 a = next(a);
00072 b = next(b);
00073 if (a < bosA || a >= eosA)
00074 return (b >= bosB && b < eosB);
00075 if (b < bosB || b >= eosB)
00076 return false;
00077 }
00078 int x = a->cmp(*b);
00079
00080
00081
00082 assert (x != 0);
00083 return x < 0;
00084 }
00085 };
00086 #endif
00087 }
00088 }
00089 #endif
00090