Trie.h 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. #pragma once
  2. #include "CharMap.h"
  3. namespace Framework
  4. {
  5. template<class T>
  6. class Trie;
  7. template< class T >
  8. struct TrieIteratorData
  9. {
  10. CharMap< Trie< T >, T > *map;
  11. TrieIteratorData<T> *parent;
  12. TrieIteratorData()
  13. {
  14. map = 0;
  15. parent = 0;
  16. }
  17. TrieIteratorData( CharMap< Trie< T >, T > *zMap, TrieIteratorData<T> parent )
  18. {
  19. map = zMap;
  20. this->parent = new TrieIteratorData<T>( parent );
  21. }
  22. TrieIteratorData( const TrieIteratorData &data )
  23. {
  24. map = data.map;
  25. if( data.parent )
  26. parent = new TrieIteratorData( *data.parent );
  27. else
  28. parent = 0;
  29. }
  30. ~TrieIteratorData()
  31. {
  32. delete parent;
  33. }
  34. void set( CharMap< Trie< T >, T > *zMap, TrieIteratorData parent )
  35. {
  36. map = zMap;
  37. parent = new TrieIteratorData( parent );
  38. }
  39. };
  40. template< class T >
  41. class TrieIterator
  42. {
  43. private:
  44. TrieIteratorData<T> data;
  45. public:
  46. TrieIterator( TrieIteratorData<T> data )
  47. {
  48. this->data = data;
  49. }
  50. TrieIterator next()
  51. {
  52. Trie<T> *n = 0;
  53. for( char i = 0; i < 256; i++ )
  54. {
  55. if( data.map->z( i ) )
  56. return TrieIterator( TrieIteratorData<T>( data.map->z( i )->map, data ) );
  57. }
  58. if( !data.parent )
  59. return TrieIterator( TrieIteratorData<T>( 0, TrieIteratorData<T>() ) );
  60. TrieIteratorData<T> d = data;
  61. do
  62. {
  63. for( char i = 0; i < 256; i++ )
  64. {
  65. if( d.parent->map->z( i )->map == d.map )
  66. {
  67. for( char j = i + 1; j < 256; j++ )
  68. {
  69. if( d.parent->map->z( j ) )
  70. return TrieIterator( TrieIteratorData<T>( d.parent->map->z( j )->map, *d.parent ) );
  71. }
  72. d = *d.parent;
  73. }
  74. }
  75. } while( d.parent );
  76. return TrieIterator( TrieIteratorData<T>( 0, TrieIteratorData<T>() ) );
  77. }
  78. TrieIterator< T > &operator++() // prefix
  79. {
  80. TrieIterator< T > temp( *this );
  81. *this = next();
  82. return temp;
  83. }
  84. TrieIterator< T > &operator++( int ) // postfix
  85. {
  86. *this = next();
  87. return *this;
  88. }
  89. operator bool()
  90. {
  91. return data.map != 0;
  92. }
  93. operator T*( )
  94. {
  95. return data.map->zValue();
  96. }
  97. T *operator->()
  98. {
  99. return data.map->zValue();
  100. }
  101. T *val()
  102. {
  103. return data.map->zValue();
  104. }
  105. };
  106. template<class T>
  107. class Trie
  108. {
  109. private:
  110. CharMap< Trie< T >, T > *map;
  111. int ref;
  112. public:
  113. Trie()
  114. {
  115. map = new CharMap< Trie< T >, T >();
  116. ref = 1;
  117. }
  118. ~Trie()
  119. {
  120. map->release();
  121. }
  122. void set( const char *addr, T *value )
  123. {
  124. if( !*addr )
  125. map->setValue( value );
  126. else
  127. {
  128. if( !map->z( *addr ) )
  129. map->set( *addr, new Trie< T >() );
  130. map->z( *addr )->set( addr + 1, value );
  131. }
  132. }
  133. T *get( const char *addr )
  134. {
  135. if( !*addr )
  136. return map->getValue();
  137. else
  138. {
  139. if( !map->z( *addr ) )
  140. return 0;
  141. return map->z( *addr )->get( addr + 1 );
  142. }
  143. }
  144. T *z( const char *addr )
  145. {
  146. if( !*addr )
  147. return map->zValue();
  148. else
  149. {
  150. if( !map->z( *addr ) )
  151. return 0;
  152. return map->z( *addr )->z( addr + 1 );
  153. }
  154. }
  155. void leeren()
  156. {
  157. map->release();
  158. map = new CharMap< Trie< T >, T >();
  159. }
  160. TrieIterator< T > getIterator()
  161. {
  162. return TrieIterator< T >( TrieIteratorData<T>( map, TrieIteratorData<T>() ) );
  163. }
  164. Trie *getThis()
  165. {
  166. ref++;
  167. return this;
  168. }
  169. Trie *release()
  170. {
  171. if( !--ref )
  172. delete this;
  173. return 0;
  174. }
  175. friend TrieIterator<T>;
  176. };
  177. }