| |
| |
| |
| |
| |
| |
| #pragma once |
|
|
| #ifdef WITH_THREADS |
| #include <boost/thread/shared_mutex.hpp> |
| #include <boost/thread/locks.hpp> |
| #include <boost/foreach.hpp> |
| #endif |
|
|
| |
| |
| #include "xmlrpc-c.h" |
|
|
| #include <map> |
| #include <boost/shared_ptr.hpp> |
| #include "TypeDef.h" |
| #include "Util.h" |
|
|
| namespace Moses |
| { |
| class ContextScope |
| { |
| protected: |
| typedef std::map<void const*, boost::shared_ptr<void> > scratchpad_t; |
| typedef scratchpad_t::iterator iter_t; |
| typedef scratchpad_t::value_type entry_t; |
| typedef scratchpad_t::const_iterator const_iter_t; |
| scratchpad_t m_scratchpad; |
| #ifdef WITH_THREADS |
| mutable boost::shared_mutex m_lock; |
| #endif |
| SPTR<std::map<std::string,float> const> m_context_weights; |
| public: |
| typedef boost::shared_ptr<ContextScope> ptr; |
| template<typename T> |
| boost::shared_ptr<void> const& |
| set(void const* const key, boost::shared_ptr<T> const& val) { |
| #ifdef WITH_THREADS |
| boost::unique_lock<boost::shared_mutex> lock(m_lock); |
| #endif |
| return (m_scratchpad[key] = val); |
| } |
|
|
| template<typename T> |
| boost::shared_ptr<T> const |
| get(void const* key, bool CreateNewIfNecessary=false) { |
| #ifdef WITH_THREADS |
| using boost::shared_mutex; |
| using boost::upgrade_lock; |
| |
| upgrade_lock<shared_mutex> lock(m_lock); |
| #endif |
| iter_t m = m_scratchpad.find(key); |
| boost::shared_ptr< T > ret; |
| if (m != m_scratchpad.end()) { |
| if (m->second == NULL && CreateNewIfNecessary) { |
| #ifdef WITH_THREADS |
| boost::upgrade_to_unique_lock<shared_mutex> xlock(lock); |
| #endif |
| m->second.reset(new T); |
| } |
| ret = boost::static_pointer_cast< T >(m->second); |
| return ret; |
| } |
| if (!CreateNewIfNecessary) return ret; |
| #ifdef WITH_THREADS |
| boost::upgrade_to_unique_lock<shared_mutex> xlock(lock); |
| #endif |
| ret.reset(new T); |
| m_scratchpad[key] = ret; |
| return ret; |
| } |
|
|
| ContextScope() { } |
|
|
| ContextScope(ContextScope const& other) { |
| #ifdef WITH_THREADS |
| boost::unique_lock<boost::shared_mutex> lock1(this->m_lock); |
| boost::unique_lock<boost::shared_mutex> lock2(other.m_lock); |
| #endif |
| m_scratchpad = other.m_scratchpad; |
| } |
|
|
| SPTR<std::map<std::string,float> const> |
| GetContextWeights() { |
| return m_context_weights; |
| } |
|
|
| bool |
| SetContextWeights(std::string const& spec) { |
| if (m_context_weights) return false; |
| boost::unique_lock<boost::shared_mutex> lock(m_lock); |
| SPTR<std::map<std::string,float> > M(new std::map<std::string, float>); |
|
|
| |
| |
| std::vector<std::string> tokens = Tokenize(spec,":"); |
| for (std::vector<std::string>::iterator it = tokens.begin(); |
| it != tokens.end(); it++) { |
| std::vector<std::string> key_and_value = Tokenize(*it, ","); |
| (*M)[key_and_value[0]] = atof(key_and_value[1].c_str()); |
| } |
| m_context_weights = M; |
| return true; |
| } |
|
|
| bool |
| SetContextWeights(SPTR<std::map<std::string,float> const> const& w) { |
| if (m_context_weights) return false; |
| #ifdef WITH_THREADS |
| boost::unique_lock<boost::shared_mutex> lock(m_lock); |
| #endif |
| m_context_weights = w; |
| return true; |
| } |
|
|
| }; |
|
|
| }; |
|
|