00001 #pragma once
00002
00003 #include <vector>
00004
00005 #include <boost/unordered_map.hpp>
00006
00007 #include "moses/FactorCollection.h"
00008 #include "moses/Word.h"
00009
00010 #include "SymbolEqualityPred.h"
00011 #include "SymbolHasher.h"
00012
00013 namespace Moses
00014 {
00015 namespace Syntax
00016 {
00017
00018
00019
00020
00021
00022
00023 template<typename T>
00024 class NonTerminalMap
00025 {
00026 private:
00027 typedef boost::unordered_map<Word, T, SymbolHasher, SymbolEqualityPred> Map;
00028 typedef std::vector<T*> Vec;
00029
00030 public:
00031 typedef typename Map::iterator Iterator;
00032 typedef typename Map::const_iterator ConstIterator;
00033
00034 NonTerminalMap()
00035 : m_vec(FactorCollection::Instance().GetNumNonTerminals(), NULL) {}
00036
00037 Iterator Begin() {
00038 return m_map.begin();
00039 }
00040 Iterator End() {
00041 return m_map.end();
00042 }
00043
00044 ConstIterator Begin() const {
00045 return m_map.begin();
00046 }
00047 ConstIterator End() const {
00048 return m_map.end();
00049 }
00050
00051 std::size_t Size() const {
00052 return m_map.size();
00053 }
00054
00055 bool IsEmpty() const {
00056 return m_map.empty();
00057 }
00058
00059 std::pair<Iterator, bool> Insert(const Word &, const T &);
00060
00061 T *Find(const Word &w) const {
00062 return m_vec[w[0]->GetId()];
00063 }
00064
00065 private:
00066 Map m_map;
00067 Vec m_vec;
00068 };
00069
00070 template<typename T>
00071 std::pair<typename NonTerminalMap<T>::Iterator, bool> NonTerminalMap<T>::Insert(
00072 const Word &key, const T &value)
00073 {
00074 std::pair<typename Map::iterator, bool> result =
00075 m_map.insert(typename Map::value_type(key, value));
00076 if (result.second) {
00077 T *p = &(result.first->second);
00078 std::size_t i = key[0]->GetId();
00079 m_vec[i] = p;
00080 }
00081 return result;
00082 }
00083
00084 }
00085 }