Trie.h 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. #pragma once
  2. #include "CharMap.h"
  3. namespace Framework
  4. {
  5. template<class T, class M> struct TrieIteratorData
  6. {
  7. M* map;
  8. TrieIteratorData* parent;
  9. TrieIteratorData()
  10. {
  11. map = 0;
  12. parent = 0;
  13. }
  14. TrieIteratorData(M* zMap, TrieIteratorData parent)
  15. {
  16. map = zMap;
  17. this->parent = new TrieIteratorData(parent);
  18. }
  19. TrieIteratorData(const TrieIteratorData& data)
  20. {
  21. map = data.map;
  22. if (data.parent)
  23. parent = new TrieIteratorData(*data.parent);
  24. else
  25. parent = 0;
  26. }
  27. ~TrieIteratorData()
  28. {
  29. delete parent;
  30. }
  31. TrieIteratorData& operator=(const TrieIteratorData& data)
  32. {
  33. map = data.map;
  34. TrieIteratorData* tmp = parent;
  35. if (data.parent)
  36. parent = new TrieIteratorData(*data.parent);
  37. else
  38. parent = 0;
  39. delete tmp;
  40. return *this;
  41. }
  42. void set(M* zMap, TrieIteratorData parent)
  43. {
  44. map = zMap;
  45. parent = new TrieIteratorData(parent);
  46. }
  47. };
  48. template<class T, class M> class TrieIterator
  49. {
  50. private:
  51. TrieIteratorData<T, M> data;
  52. public:
  53. TrieIterator(TrieIteratorData<T, M> data)
  54. {
  55. this->data = data;
  56. }
  57. TrieIterator next()
  58. {
  59. for (unsigned char i = 0; true; i++)
  60. {
  61. if (data.map->z(i))
  62. return TrieIterator(
  63. TrieIteratorData<T, M>(data.map->z(i)->map, data));
  64. if (i == 255) break;
  65. }
  66. if (!data.parent || !data.parent->map)
  67. return TrieIterator(
  68. TrieIteratorData<T, M>(0, TrieIteratorData<T, M>()));
  69. TrieIteratorData<T, M> d = data;
  70. do
  71. {
  72. for (unsigned char i = 0; true; i++)
  73. {
  74. if (d.parent->map->z(i)
  75. && d.parent->map->z(i)->map == d.map)
  76. {
  77. if (i < 256)
  78. {
  79. for (unsigned char j = (unsigned char)(i + 1); true;
  80. j++)
  81. {
  82. if (d.parent->map->z(j))
  83. return TrieIterator(TrieIteratorData<T, M>(
  84. d.parent->map->z(j)->map, *d.parent));
  85. if (j == 255) break;
  86. }
  87. }
  88. d = *d.parent;
  89. break;
  90. }
  91. if (i == 255) break;
  92. }
  93. } while (d.parent && d.parent->map);
  94. return TrieIterator(
  95. TrieIteratorData<T, M>(0, TrieIteratorData<T, M>()));
  96. }
  97. TrieIterator& operator++() //! prefix
  98. {
  99. data = next().data;
  100. return *this;
  101. }
  102. TrieIterator operator++(int) //! postfix
  103. {
  104. TrieIterator temp(*this);
  105. data = next().data;
  106. return temp;
  107. }
  108. operator bool()
  109. {
  110. return data.map != 0;
  111. }
  112. operator T*()
  113. {
  114. return data.map->zValue();
  115. }
  116. T* operator->()
  117. {
  118. return data.map->zValue();
  119. }
  120. T* val()
  121. {
  122. return data.map->zValue();
  123. }
  124. };
  125. template<class T> class Trie : public virtual ReferenceCounter
  126. {
  127. private:
  128. CharMap<Trie<T>, T>* map;
  129. public:
  130. Trie()
  131. : ReferenceCounter()
  132. {
  133. map = new CharMap<Trie<T>, T>();
  134. }
  135. ~Trie()
  136. {
  137. map->release();
  138. }
  139. void set(const char* addr, int addrLen, T value)
  140. {
  141. if (!addrLen)
  142. map->setValue(value);
  143. else
  144. {
  145. if (!map->z(*addr)) map->set(*addr, new Trie<T>());
  146. map->z(*addr)->set(addr + 1, addrLen - 1, value);
  147. }
  148. }
  149. void remove(const char* addr, int addrLen)
  150. {
  151. if (!addrLen)
  152. map->setValue(0);
  153. else
  154. {
  155. if (!map->z(*addr)) return;
  156. map->z(*addr)->remove(addr + 1, addrLen - 1);
  157. }
  158. }
  159. T get(const char* addr, int addrLen) const
  160. {
  161. if (!addrLen)
  162. return map->getValue();
  163. else
  164. {
  165. if (!map->z(*addr)) return 0;
  166. return map->z(*addr)->get(addr + 1, addrLen - 1);
  167. }
  168. }
  169. T* getP(const char* addr, int addrLen)
  170. {
  171. if (!addrLen)
  172. return map->getValueP();
  173. else
  174. {
  175. if (!map->z(*addr)) return 0;
  176. return map->z(*addr)->getP(addr + 1, addrLen - 1);
  177. }
  178. }
  179. bool contains(const char* addr, int addrLen) const
  180. {
  181. if (!addrLen)
  182. return true;
  183. else
  184. {
  185. if (!map->z(*addr)) return false;
  186. return map->z(*addr)->contains(addr + 1, addrLen - 1);
  187. }
  188. }
  189. void leeren()
  190. {
  191. map->release();
  192. map = new CharMap<Trie<T>, T>();
  193. }
  194. TrieIterator<T, CharMap<Trie<T>, T>> getIterator()
  195. {
  196. return TrieIterator<T, CharMap<Trie<T>, T>>(
  197. TrieIteratorData<T, CharMap<Trie<T>, T>>(
  198. map, TrieIteratorData<T, CharMap<Trie<T>, T>>()));
  199. }
  200. friend TrieIterator<T, CharMap<Trie<T>, T>>;
  201. };
  202. template<class T> class RCTrie : public virtual ReferenceCounter
  203. {
  204. private:
  205. RCCharMap<RCTrie<T>, T>* map;
  206. public:
  207. RCTrie()
  208. : ReferenceCounter()
  209. {
  210. map = new RCCharMap<RCTrie<T>, T>();
  211. }
  212. ~RCTrie()
  213. {
  214. map->release();
  215. }
  216. void set(const char* addr, int addrLen, T* value)
  217. {
  218. if (!addrLen)
  219. map->setValue(value);
  220. else
  221. {
  222. if (!map->z(*addr)) map->set(*addr, new RCTrie<T>());
  223. map->z(*addr)->set(addr + 1, addrLen - 1, value);
  224. }
  225. }
  226. void remove(const char* addr, int addrLen)
  227. {
  228. if (!addrLen)
  229. map->setValue(0);
  230. else
  231. {
  232. if (!map->z(*addr)) return;
  233. map->z(*addr)->remove(addr + 1, addrLen - 1);
  234. }
  235. }
  236. T* get(const char* addr, int addrLen)
  237. {
  238. if (!addrLen)
  239. return map->getValue();
  240. else
  241. {
  242. if (!map->z(*addr)) return 0;
  243. return map->z(*addr)->get(addr + 1, addrLen - 1);
  244. }
  245. }
  246. T* z(const char* addr, int addrLen) const
  247. {
  248. if (!addrLen)
  249. return map->zValue();
  250. else
  251. {
  252. if (!map->z(*addr)) return 0;
  253. return map->z(*addr)->z(addr + 1, addrLen - 1);
  254. }
  255. }
  256. bool contains(const char* addr, int addrLen) const
  257. {
  258. if (!addrLen)
  259. return true;
  260. else
  261. {
  262. if (!map->z(*addr)) return false;
  263. return map->z(*addr)->contains(addr + 1, addrLen - 1);
  264. }
  265. }
  266. void leeren()
  267. {
  268. map->release();
  269. map = new RCCharMap<RCTrie<T>, T>();
  270. }
  271. TrieIterator<T, RCCharMap<RCTrie<T>, T>> getIterator() const
  272. {
  273. return TrieIterator<T, RCCharMap<RCTrie<T>, T>>(
  274. TrieIteratorData<T, RCCharMap<RCTrie<T>, T>>(
  275. map, TrieIteratorData<T, RCCharMap<RCTrie<T>, T>>()));
  276. }
  277. friend TrieIterator<T, RCCharMap<RCTrie<T>, T>>;
  278. };
  279. } // namespace Framework