| #pragma once |
|
|
| #include <vector> |
|
|
| #include <boost/unordered_map.hpp> |
|
|
| #include "moses/FactorCollection.h" |
| #include "moses/Word.h" |
|
|
| #include "SymbolEqualityPred.h" |
| #include "SymbolHasher.h" |
|
|
| namespace Moses |
| { |
| namespace Syntax |
| { |
|
|
| |
| |
| |
| |
| |
| template<typename T> |
| class NonTerminalMap |
| { |
| private: |
| typedef boost::unordered_map<Word, T, SymbolHasher, SymbolEqualityPred> Map; |
| typedef std::vector<T*> Vec; |
|
|
| public: |
| typedef typename Map::iterator Iterator; |
| typedef typename Map::const_iterator ConstIterator; |
|
|
| NonTerminalMap() |
| : m_vec(FactorCollection::Instance().GetNumNonTerminals(), NULL) {} |
|
|
| Iterator Begin() { |
| return m_map.begin(); |
| } |
| Iterator End() { |
| return m_map.end(); |
| } |
|
|
| ConstIterator Begin() const { |
| return m_map.begin(); |
| } |
| ConstIterator End() const { |
| return m_map.end(); |
| } |
|
|
| std::size_t Size() const { |
| return m_map.size(); |
| } |
|
|
| bool IsEmpty() const { |
| return m_map.empty(); |
| } |
|
|
| std::pair<Iterator, bool> Insert(const Word &, const T &); |
|
|
| T *Find(const Word &w) const { |
| return m_vec[w[0]->GetId()]; |
| } |
|
|
| private: |
| Map m_map; |
| Vec m_vec; |
| }; |
|
|
| template<typename T> |
| std::pair<typename NonTerminalMap<T>::Iterator, bool> NonTerminalMap<T>::Insert( |
| const Word &key, const T &value) |
| { |
| std::pair<typename Map::iterator, bool> result = |
| m_map.insert(typename Map::value_type(key, value)); |
| if (result.second) { |
| T *p = &(result.first->second); |
| std::size_t i = key[0]->GetId(); |
| m_vec[i] = p; |
| } |
| return result; |
| } |
|
|
| } |
| } |
|
|