00001 #ifndef DICTIONARY_HXX_
00002 # define DICTIONARY_HXX_
00003
00004 namespace dictionary
00005 {
00006 template<typename Content>
00007 DictionaryNode<Content>::DictionaryNode() : _content(NULL)
00008 {
00009 }
00010
00011 template<typename Content>
00012 Dictionary<Content>::Dictionary()
00013 {
00014 }
00015
00016 template<typename Content>
00017 Dictionary<Content>::~Dictionary()
00018 {
00019 clear();
00020 }
00021
00022 template<typename Content>
00023 void Dictionary<Content>::clear()
00024 {
00025 for (std::map<int, DictionaryNode<Content> *>::iterator it = _root._sub_nodes.begin();
00026 it != _root._sub_nodes.end();
00027 it++)
00028 {
00029 clear_rec(*it->second);
00030 }
00031 }
00032
00033 template<typename Content>
00034 void Dictionary<Content>::put_word(const std::string &s, Content *c)
00035 {
00036 _current_node = &_root;
00037 _current_iterator = s.begin();
00038 _end_iterator = s.end();
00039 if (_current_iterator == _end_iterator)
00040 return;
00041
00042 put_word_rec();
00043
00044 _current_node->_content = c;
00045 }
00046
00047 template<typename Content>
00048 Content *Dictionary<Content>::find(const std::string &s)
00049 {
00050 _current_node = &_root;
00051 _depth = 0;
00052 _current_iterator = s.begin();
00053 _end_iterator = s.end();
00054
00055 find_rec();
00056
00057 if (_current_node->_content == NULL || _depth != s.size())
00058 return NULL;
00059 return _current_node->_content;
00060 }
00061
00062 template<typename Content>
00063 Content *Dictionary<Content>::find_shortest(const std::string &s, std::string *res)
00064 {
00065 _current_node = &_root;
00066 _depth = 0;
00067 _current_iterator = s.begin();
00068 _end_iterator = s.end();
00069
00070 find_shortest_rec();
00071
00072 if (_current_node->_content == NULL)
00073 return NULL;
00074
00075 if (res != NULL)
00076 *res = std::string(s.begin(), s.begin() + _depth);
00077
00078 return _current_node->_content;
00079 }
00080
00081 template<typename Content>
00082 Content *Dictionary<Content>::find_longest(const std::string &s, std::string *res)
00083 {
00084 _best_node = NULL;
00085 _current_node = &_root;
00086 _depth = 0;
00087 _current_iterator = s.begin();
00088 _end_iterator = s.end();
00089
00090 find_longest_rec();
00091
00092 if (_best_node == NULL || _best_node->_content == NULL)
00093 return NULL;
00094
00095 if (res != NULL)
00096 *res = std::string(s.begin(), s.begin() + _best_depth);
00097
00098 return _best_node->_content;
00099 }
00100
00101 template<typename Content>
00102 void Dictionary<Content>::put_word_rec()
00103 {
00104 std::map<int, DictionaryNode<Content> *>::iterator it =
00105 _current_node->_sub_nodes.find(*_current_iterator);
00106 if (it == _current_node->_sub_nodes.end())
00107 _current_node = _current_node->_sub_nodes[*_current_iterator] = new DictionaryNode<Content>();
00108 else
00109 _current_node = it->second;
00110 _current_iterator++;
00111
00112 if (_current_iterator == _end_iterator)
00113 return;
00114 put_word_rec();
00115 }
00116
00117 template<typename Content>
00118 void Dictionary<Content>::find_rec()
00119 {
00120 if (_current_iterator == _end_iterator)
00121 return;
00122
00123 std::map<int, DictionaryNode<Content> *>::iterator it =
00124 _current_node->_sub_nodes.find(*_current_iterator);
00125 if (it != _current_node->_sub_nodes.end())
00126 {
00127 _depth++;
00128 _current_node = it->second;
00129 _current_iterator++;
00130 find_rec();
00131 }
00132 }
00133
00134 template<typename Content>
00135 void Dictionary<Content>::find_shortest_rec()
00136 {
00137 if (_current_node->_content != NULL)
00138 return;
00139 if (_current_iterator == _end_iterator)
00140 return;
00141
00142 std::map<int, DictionaryNode<Content> *>::iterator it =
00143 _current_node->_sub_nodes.find(*_current_iterator);
00144 if (it != _current_node->_sub_nodes.end())
00145 {
00146 _depth++;
00147 _current_node = it->second;
00148 _current_iterator++;
00149 find_shortest_rec();
00150 }
00151 }
00152
00153 template<typename Content>
00154 void Dictionary<Content>::find_longest_rec()
00155 {
00156 if (_current_node->_content != NULL)
00157 {
00158 _best_node = _current_node;
00159 _best_depth = _depth;
00160 }
00161 if (_current_iterator == _end_iterator)
00162 return;
00163
00164 std::map<int, DictionaryNode<Content> *>::iterator it =
00165 _current_node->_sub_nodes.find(*_current_iterator);
00166 if (it != _current_node->_sub_nodes.end())
00167 {
00168 _depth++;
00169 _current_node = it->second;
00170 _current_iterator++;
00171 find_longest_rec();
00172 }
00173 }
00174
00175 template<typename Content>
00176 void Dictionary<Content>::clear_rec(DictionaryNode<Content> &node)
00177 {
00178 for (std::map<int, DictionaryNode<Content> *>::iterator it = node._sub_nodes.begin();
00179 it != node._sub_nodes.end();
00180 it++)
00181 {
00182 clear_rec(*it->second);
00183 }
00184 delete &node;
00185 }
00186 }
00187
00188 #endif