diff options
| -rw-r--r-- | project2/Jamfile.jam | 3 | ||||
| -rw-r--r-- | project2/common/memoryCache.cpp | 2 | ||||
| -rw-r--r-- | project2/common/scriptStorage.h | 69 | ||||
| -rw-r--r-- | project2/sql/rdbmsDataSource.cpp | 2 | 
4 files changed, 44 insertions, 32 deletions
| diff --git a/project2/Jamfile.jam b/project2/Jamfile.jam index 65a0e49..fd4de5d 100644 --- a/project2/Jamfile.jam +++ b/project2/Jamfile.jam @@ -18,7 +18,8 @@ alias p2parts : : : :  project    : requirements -      <variant>debug:<cflags>"-W -Wall -Werror -Wwrite-strings" +      <variant>release:<cflags>"-std=c++0x" +      <variant>debug:<cflags>"-W -Wall -Werror -Wwrite-strings -std=c++0x"        <variant>debug:<linkflags>"-Wl,-z,defs --warn-once"  	; diff --git a/project2/common/memoryCache.cpp b/project2/common/memoryCache.cpp index ea7fb84..a24abb3 100644 --- a/project2/common/memoryCache.cpp +++ b/project2/common/memoryCache.cpp @@ -132,7 +132,7 @@ class MemoryCache : public Cache {  			Key key;  			key.push_back(n);  			key.push_back(f); -			applyKeys(boost::bind(&Key::push_back, &key, _2), ps); +			applyKeys([&key](const std::string &, const VariableType & v) { key.push_back(v); }, ps);  			return key;  		} diff --git a/project2/common/scriptStorage.h b/project2/common/scriptStorage.h index 14ebe6e..c58711b 100644 --- a/project2/common/scriptStorage.h +++ b/project2/common/scriptStorage.h @@ -9,6 +9,8 @@  #include <list>  #include <map>  #include <boost/intrusive_ptr.hpp> +#include <boost/bind.hpp> +#include <boost/function.hpp>  SimpleMessageException(StoreFailed); @@ -22,17 +24,19 @@ SimpleMessageException(StoreFailed);  	std::set<boost::intrusive_ptr<X> >  class Storer; +template <class X, class L> +class StorerBase;  typedef boost::intrusive_ptr<Storer> StorerPtr;  class Storer : public virtual IntrusivePtrBase {  	public: -		template <class L, class X> -		static StorerPtr into(SINGLE(X) * obj); -		template <class L, class X> -		static StorerPtr into(STORAGEOF(X) * map); -		template <class L, class X> -		static StorerPtr into(ANONSTORAGEOF(X) * set); -		template <class L, class X> -		static StorerPtr into(ANONORDEREDSTORAGEOF(X) * list); +		template <class L, class X, typename... C> +		static boost::intrusive_ptr<StorerBase<X, L> > into(SINGLE(X) * obj, const C & ... c); +		template <class L, class X, typename... C> +		static boost::intrusive_ptr<StorerBase<X, L> > into(STORAGEOF(X) * map, const C & ... c); +		template <class L, class X, typename... C> +		static boost::intrusive_ptr<StorerBase<X, L> > into(ANONSTORAGEOF(X) * set, const C & ... c); +		template <class L, class X, typename... C> +		static boost::intrusive_ptr<StorerBase<X, L> > into(ANONORDEREDSTORAGEOF(X) * list, const C & ... c);  		virtual boost::intrusive_ptr<IntrusivePtrBase> create(ScriptNodePtr) const = 0;  		virtual bool save(boost::intrusive_ptr<IntrusivePtrBase>, ScriptNodePtr) = 0; @@ -41,8 +45,13 @@ class Storer : public virtual IntrusivePtrBase {  template <class X, class L>  class StorerBase : public Storer {  	public: +		typedef boost::function2<boost::intrusive_ptr<IntrusivePtrBase>, L *, ScriptNodePtr> Creator; +		StorerBase(const Creator & c) : +			creator(c) +		{ +		}  		boost::intrusive_ptr<IntrusivePtrBase> create(ScriptNodePtr p) const { -			return LoaderBase::getLoader<L, NotSupported>(p->get_name())->createFrom(p); +			return creator(LoaderBase::getLoader<L, NotSupported>(p->get_name()).get(), p);  		}  		bool save(boost::intrusive_ptr<IntrusivePtrBase> o, ScriptNodePtr name) {  			boost::intrusive_ptr<X> O = boost::dynamic_pointer_cast<X>(o); @@ -54,6 +63,8 @@ class StorerBase : public Storer {  			return O;  		}  		virtual bool insert(boost::intrusive_ptr<X>) = 0; +	private: +		Creator creator;  };  template <class X, class M, class L> @@ -66,7 +77,7 @@ template <class X, class L>  class StorerImpl<X, SINGLE(X), L> : public StorerBase<X, L> {  	public:  		typedef SINGLE(X) Obj; -		StorerImpl(SINGLE(X) * o) : obj(o) +		StorerImpl(SINGLE(X) * o, const typename StorerBase<X, L>::Creator & c) : StorerBase<X, L>(c), obj(o)  		{  		}  		bool insert(boost::intrusive_ptr<X> O) @@ -80,7 +91,7 @@ template <class X, class L>  class StorerImpl<X, STORAGEOF(X), L> : public StorerBase<X, L> {  	public:  		typedef STORAGEOF(X) Map; -		StorerImpl(STORAGEOF(X) * m) : map(m) +		StorerImpl(STORAGEOF(X) * m, const typename StorerBase<X, L>::Creator & c) : StorerBase<X, L>(c), map(m)  		{  		}  		bool insert(boost::intrusive_ptr<X> O) @@ -93,7 +104,7 @@ template <class X, class L>  class StorerImpl<X, ANONSTORAGEOF(X), L> : public StorerBase<X, L> {  	public:  		typedef ANONSTORAGEOF(X) Map; -		StorerImpl(ANONSTORAGEOF(X) * m) : map(m) +		StorerImpl(ANONSTORAGEOF(X) * m, const typename StorerBase<X, L>::Creator & c) : StorerBase<X, L>(c), map(m)  		{  		}  		bool insert(boost::intrusive_ptr<X> O) @@ -107,7 +118,7 @@ template <class X, class L>  class StorerImpl<X, ANONORDEREDSTORAGEOF(X), L> : public StorerBase<X, L> {  	public:  		typedef ANONORDEREDSTORAGEOF(X) Map; -		StorerImpl(ANONORDEREDSTORAGEOF(X) * m) : map(m) +		StorerImpl(ANONORDEREDSTORAGEOF(X) * m, const typename StorerBase<X, L>::Creator & c) : StorerBase<X, L>(c), map(m)  		{  		}  		bool insert(boost::intrusive_ptr<X> O) @@ -118,28 +129,28 @@ class StorerImpl<X, ANONORDEREDSTORAGEOF(X), L> : public StorerBase<X, L> {  		Map * map;  }; -template <class L, class X> -StorerPtr -Storer::into(SINGLE(X) * obj) { -	return new StorerImpl<X, SINGLE(X), L>(obj); +template <class L, class X, typename... C> +boost::intrusive_ptr<StorerBase<X, L> > +Storer::into(SINGLE(X) * obj, const C & ... c) { +	return new StorerImpl<X, SINGLE(X), L>(obj, boost::bind(&L::createFrom, _1, _2, c...));  } -template <class L, class X> -StorerPtr -Storer::into(STORAGEOF(X) * map) { -	return new StorerImpl<X, STORAGEOF(X), L>(map); +template <class L, class X, typename... C> +boost::intrusive_ptr<StorerBase<X, L> > +Storer::into(STORAGEOF(X) * map, const C & ... c) { +	return new StorerImpl<X, STORAGEOF(X), L>(map, boost::bind(&L::createFrom, _1, _2, c...));  } -template <class L, class X> -StorerPtr -Storer::into(ANONSTORAGEOF(X) * set) { -	return new StorerImpl<X, ANONSTORAGEOF(X), L>(set); +template <class L, class X, typename... C> +boost::intrusive_ptr<StorerBase<X, L> > +Storer::into(ANONSTORAGEOF(X) * set, const C & ... c) { +	return new StorerImpl<X, ANONSTORAGEOF(X), L>(set, boost::bind(&L::createFrom, _1, _2, c...));  } -template <class L, class X> -StorerPtr -Storer::into(ANONORDEREDSTORAGEOF(X) * list) { -	return new StorerImpl<X, ANONORDEREDSTORAGEOF(X), L>(list); +template <class L, class X, typename... C> +boost::intrusive_ptr<StorerBase<X, L> > +Storer::into(ANONORDEREDSTORAGEOF(X) * list, const C & ... c) { +	return new StorerImpl<X, ANONORDEREDSTORAGEOF(X), L>(list, boost::bind(&L::createFrom, _1, _2, c...));  }  #endif diff --git a/project2/sql/rdbmsDataSource.cpp b/project2/sql/rdbmsDataSource.cpp index 305f1d7..6f3cedb 100644 --- a/project2/sql/rdbmsDataSource.cpp +++ b/project2/sql/rdbmsDataSource.cpp @@ -45,7 +45,7 @@ RdbmsDataSource::RdbmsDataSource(ScriptNodePtr p) :  	preferLocal(p->value("preferlocal", true))  {  	BOOST_FOREACH(ScriptNodePtr node, p->childrenIn("readonly")) { -		roDSNs.insert(ReadonlyDSNs::value_type(node->value("host"), node)); +		roDSNs.insert(ReadonlyDSNs::value_type(node->value("host").as<std::string>(), node));  	}  } | 
