#pragma once #include #include "Node.h" namespace Moses2 { template class InMemoryTrie { public: InMemoryTrie() { } Node* insert(const std::vector& word, const ValueClass& value); const Node* getNode( const std::vector& words) const; const Node &getNode(const std::vector& words, size_t &stoppedAtInd) const; std::vector*> getNodes( const std::vector& words, size_t &stoppedAtInd) const; private: Node root; }; template Node* InMemoryTrie::insert( const std::vector& word, const ValueClass& value) { Node* 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 const Node* InMemoryTrie::getNode( const std::vector& words) const { size_t stoppedAtInd; const Node &ret = getNode(words, stoppedAtInd); if (stoppedAtInd < words.size()) { return NULL; } return &ret; } template const Node &InMemoryTrie::getNode( const std::vector& words, size_t &stoppedAtInd) const { const Node *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 std::vector*> InMemoryTrie::getNodes( const std::vector& words, size_t &stoppedAtInd) const { std::vector*> ret; const Node *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; } }