diff options
Diffstat (limited to 'contrib/moses2/MorphoTrie/Node.h')
-rw-r--r-- | contrib/moses2/MorphoTrie/Node.h | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/contrib/moses2/MorphoTrie/Node.h b/contrib/moses2/MorphoTrie/Node.h new file mode 100644 index 000000000..ca165ef67 --- /dev/null +++ b/contrib/moses2/MorphoTrie/Node.h @@ -0,0 +1,93 @@ +#ifndef NODE_H_ +#define NODE_H_ + +#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; +} + +} + +#endif /* end of include guard: NODE_H_ */ |