mirror of
https://github.com/moses-smt/mosesdecoder.git
synced 2024-10-06 00:08:52 +03:00
86 lines
1.8 KiB
C++
86 lines
1.8 KiB
C++
#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;
|
|
}
|
|
|
|
}
|
|
|