diff options
Diffstat (limited to 'contrib/moses2/MorphoTrie/MorphTrie.h')
-rw-r--r-- | contrib/moses2/MorphoTrie/MorphTrie.h | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/contrib/moses2/MorphoTrie/MorphTrie.h b/contrib/moses2/MorphoTrie/MorphTrie.h new file mode 100644 index 000000000..0b013b5bb --- /dev/null +++ b/contrib/moses2/MorphoTrie/MorphTrie.h @@ -0,0 +1,100 @@ +#ifndef MORPHTRIE_H_ +#define MORPHTRIE_H_ + +#include <vector> +#include "Node.h" + +namespace Moses2 +{ + +template<class KeyClass, class ValueClass> +class MorphTrie +{ +public: + MorphTrie() + { + } + 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>* MorphTrie<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>* MorphTrie<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> &MorphTrie<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>*> MorphTrie<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; +} + +} + +#endif /* end of include guard: MORPHTRIE_H_ */ |