File size: 2,112 Bytes
fd49381 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
#pragma once
#include <string>
#include <cstdlib>
#include <vector>
#include <map>
#include <boost/thread/tss.hpp>
#include <boost/shared_ptr.hpp>
#include "moses/FF/FeatureFunction.h"
namespace Moses
{
template <class Value>
struct DefaultFactory {
typedef boost::shared_ptr<Value> ValuePtr;
ValuePtr operator()() {
return ValuePtr(new Value());
}
};
template<class Value, class Factory = DefaultFactory<Value> >
class ThreadLocalByFeatureStorage
{
public:
typedef boost::shared_ptr<Value> ValuePtr;
typedef std::map<std::string, ValuePtr> NameValueMap;
typedef boost::thread_specific_ptr<NameValueMap> TSNameValueMap;
ThreadLocalByFeatureStorage(FeatureFunction* ff,
Factory factory = Factory())
: m_ff(ff), m_factory(factory) {}
virtual ~ThreadLocalByFeatureStorage() {} // provide empty virtual dtor
virtual ValuePtr GetStored() {
if(!m_nameMap.get())
m_nameMap.reset(new NameValueMap());
typename NameValueMap::iterator it
= m_nameMap->find(m_ff->GetScoreProducerDescription());
if(it == m_nameMap->end()) {
std::pair<typename NameValueMap::iterator, bool> ret;
ret = m_nameMap->insert(
std::make_pair(m_ff->GetScoreProducerDescription(), m_factory()));
return ret.first->second;
} else {
return it->second;
}
}
virtual const ValuePtr GetStored() const {
UTIL_THROW_IF2(!m_nameMap.get(),
"No thread local storage has been created for: "
<< m_ff->GetScoreProducerDescription());
typename NameValueMap::const_iterator it
= m_nameMap->find(m_ff->GetScoreProducerDescription());
UTIL_THROW_IF2(it == m_nameMap->end(),
"No features stored for: "
<< m_ff->GetScoreProducerDescription());
return it->second;
}
private:
FeatureFunction* m_ff;
Factory m_factory;
static TSNameValueMap m_nameMap;
};
template <class Value, class Factory>
typename ThreadLocalByFeatureStorage<Value, Factory>::TSNameValueMap
ThreadLocalByFeatureStorage<Value, Factory>::m_nameMap;
}
|