| | #pragma once |
| |
|
| | #include <vector> |
| | #include <boost/unordered_map.hpp> |
| | #include <boost/foreach.hpp> |
| |
|
| | namespace Moses2 |
| | { |
| |
|
| | template<class KeyClass, class ValueClass> |
| | class Node |
| | { |
| | public: |
| | Node() { |
| | } |
| | Node(const ValueClass& value) : |
| | m_value(value) { |
| | } |
| | ~Node(); |
| | void setKey(const KeyClass& key); |
| | void setValue(const ValueClass& value) { |
| | m_value = value; |
| | } |
| | Node* findSub(const KeyClass& key); |
| | const Node* findSub(const KeyClass& key) const; |
| | Node *addSubnode(const KeyClass& cKey) { |
| | Node *node = findSub(cKey); |
| | if (node) { |
| | return node; |
| | } else { |
| | node = new Node(); |
| | subNodes[cKey] = node; |
| | return node; |
| | } |
| | } |
| |
|
| | std::vector<Node*> getSubnodes(); |
| | const ValueClass &getValue() const { |
| | return m_value; |
| | } |
| |
|
| | private: |
| | boost::unordered_map<KeyClass, Node*> subNodes; |
| | ValueClass m_value; |
| |
|
| | }; |
| |
|
| | template<class KeyClass, class ValueClass> |
| | Node<KeyClass, ValueClass>::~Node() |
| | { |
| | typename boost::unordered_map<KeyClass, Node*>::iterator iter; |
| | for (iter = subNodes.begin(); iter != subNodes.end(); ++iter) { |
| | Node *node = iter->second; |
| | delete node; |
| | } |
| | } |
| |
|
| | template<class KeyClass, class ValueClass> |
| | const Node<KeyClass, ValueClass>* Node<KeyClass, ValueClass>::findSub( |
| | const KeyClass& cKey) const |
| | { |
| | typename boost::unordered_map<KeyClass, Node*>::const_iterator iter; |
| | iter = subNodes.find(cKey); |
| | if (iter != subNodes.end()) { |
| | Node *node = iter->second; |
| | return node; |
| | } |
| | return NULL; |
| | } |
| |
|
| | template<class KeyClass, class ValueClass> |
| | Node<KeyClass, ValueClass>* Node<KeyClass, ValueClass>::findSub( |
| | const KeyClass& cKey) |
| | { |
| | typename boost::unordered_map<KeyClass, Node*>::iterator iter; |
| | iter = subNodes.find(cKey); |
| | if (iter != subNodes.end()) { |
| | Node *node = iter->second; |
| | return node; |
| | } |
| | return NULL; |
| | } |
| |
|
| | } |
| |
|
| |
|