00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef moses_FactorCollection_h
00023 #define moses_FactorCollection_h
00024
00025
00026 #ifndef moses_MaxNumNonterminals
00027 #define moses_MaxNumNonterminals 10000
00028 #endif
00029
00030 #ifdef WITH_THREADS
00031 #include <boost/thread/shared_mutex.hpp>
00032 #endif
00033
00034 #include "util/murmur_hash.hh"
00035 #include <boost/unordered_set.hpp>
00036
00037 #include <functional>
00038 #include <string>
00039
00040 #include "util/string_piece.hh"
00041 #include "util/pool.hh"
00042 #include "Factor.h"
00043
00044 class System;
00045
00046 namespace Moses
00047 {
00048
00056 struct FactorFriend {
00057 Factor in;
00058 };
00059
00068 class FactorCollection
00069 {
00070 friend std::ostream& operator<<(std::ostream&, const FactorCollection&);
00071 friend class ::System;
00072
00073 struct HashFactor : public std::unary_function<const FactorFriend &, std::size_t> {
00074 std::size_t operator()(const FactorFriend &factor) const {
00075 return util::MurmurHashNative(factor.in.m_string.data(), factor.in.m_string.size());
00076 }
00077 };
00078 struct EqualsFactor : public std::binary_function<const FactorFriend &, const FactorFriend &, bool> {
00079 bool operator()(const FactorFriend &left, const FactorFriend &right) const {
00080 return left.in.GetString() == right.in.GetString();
00081 }
00082 };
00083 typedef boost::unordered_set<FactorFriend, HashFactor, EqualsFactor> Set;
00084 Set m_set;
00085 Set m_setNonTerminal;
00086
00087 util::Pool m_string_backing;
00088
00089 static FactorCollection s_instance;
00090 #ifdef WITH_THREADS
00091
00092 mutable boost::shared_mutex m_accessLock;
00093 #endif
00094
00095 size_t m_factorIdNonTerminal;
00096 size_t m_factorId;
00098
00099 FactorCollection()
00100 : m_factorIdNonTerminal(0)
00101 , m_factorId(moses_MaxNumNonterminals) {
00102 }
00103
00104 public:
00105 static FactorCollection& Instance() {
00106 return s_instance;
00107 }
00108
00109 ~FactorCollection();
00110
00114 const Factor *AddFactor(const StringPiece &factorString, bool isNonTerminal = false);
00115
00116 size_t GetNumNonTerminals() {
00117 return m_factorIdNonTerminal;
00118 }
00119
00120 const Factor *GetFactor(const StringPiece &factorString, bool isNonTerminal = false);
00121
00122
00123 const Factor *AddFactor(FactorDirection , FactorType , const StringPiece &factorString, bool isNonTerminal = false) {
00124 return AddFactor(factorString, isNonTerminal);
00125 }
00126
00127 TO_STRING();
00128
00129 };
00130
00131 }
00132 #endif