|
#pragma once |
|
|
|
#include <vector> |
|
#include "Node.h" |
|
|
|
namespace Moses2 |
|
{ |
|
|
|
template<class KeyClass, class ValueClass> |
|
class InMemoryTrie |
|
{ |
|
public: |
|
InMemoryTrie() { |
|
} |
|
Node<KeyClass, ValueClass>* insert(const std::vector<KeyClass>& word, |
|
const ValueClass& value); |
|
const Node<KeyClass, ValueClass>* getNode( |
|
const std::vector<KeyClass>& words) const; |
|
const Node<KeyClass, ValueClass> &getNode(const std::vector<KeyClass>& words, |
|
size_t &stoppedAtInd) const; |
|
std::vector<const Node<KeyClass, ValueClass>*> getNodes( |
|
const std::vector<KeyClass>& words, size_t &stoppedAtInd) const; |
|
private: |
|
Node<KeyClass, ValueClass> root; |
|
}; |
|
|
|
template<class KeyClass, class ValueClass> |
|
Node<KeyClass, ValueClass>* InMemoryTrie<KeyClass, ValueClass>::insert( |
|
const std::vector<KeyClass>& word, const ValueClass& value) |
|
{ |
|
Node<KeyClass, ValueClass>* cNode = &root; |
|
for (size_t i = 0; i < word.size(); ++i) { |
|
KeyClass cKey = word[i]; |
|
cNode = cNode->addSubnode(cKey); |
|
} |
|
cNode->setValue(value); |
|
return cNode; |
|
} |
|
|
|
template<class KeyClass, class ValueClass> |
|
const Node<KeyClass, ValueClass>* InMemoryTrie<KeyClass, ValueClass>::getNode( |
|
const std::vector<KeyClass>& words) const |
|
{ |
|
size_t stoppedAtInd; |
|
const Node<KeyClass, ValueClass> &ret = getNode(words, stoppedAtInd); |
|
if (stoppedAtInd < words.size()) { |
|
return NULL; |
|
} |
|
return &ret; |
|
} |
|
|
|
template<class KeyClass, class ValueClass> |
|
const Node<KeyClass, ValueClass> &InMemoryTrie<KeyClass, ValueClass>::getNode( |
|
const std::vector<KeyClass>& words, size_t &stoppedAtInd) const |
|
{ |
|
const Node<KeyClass, ValueClass> *prevNode = &root, *newNode; |
|
for (size_t i = 0; i < words.size(); ++i) { |
|
const KeyClass &cKey = words[i]; |
|
newNode = prevNode->findSub(cKey); |
|
if (newNode == NULL) { |
|
stoppedAtInd = i; |
|
return *prevNode; |
|
} |
|
prevNode = newNode; |
|
} |
|
|
|
stoppedAtInd = words.size(); |
|
return *newNode; |
|
} |
|
|
|
template<class KeyClass, class ValueClass> |
|
std::vector<const Node<KeyClass, ValueClass>*> InMemoryTrie<KeyClass, ValueClass>::getNodes( |
|
const std::vector<KeyClass>& words, size_t &stoppedAtInd) const |
|
{ |
|
std::vector<const Node<KeyClass, ValueClass>*> ret; |
|
const Node<KeyClass, ValueClass> *prevNode = &root, *newNode; |
|
ret.push_back(prevNode); |
|
|
|
for (size_t i = 0; i < words.size(); ++i) { |
|
const KeyClass &cKey = words[i]; |
|
newNode = prevNode->findSub(cKey); |
|
if (newNode == NULL) { |
|
stoppedAtInd = i; |
|
return ret; |
|
} else { |
|
ret.push_back(newNode); |
|
} |
|
prevNode = newNode; |
|
} |
|
|
|
stoppedAtInd = words.size(); |
|
return ret; |
|
} |
|
|
|
} |
|
|
|
|