Commit 4a4151ec authored by Roman Donchenko's avatar Roman Donchenko Committed by OpenCV Buildbot

Merge pull request #2474 from akarsakov:fix_getpolicy

parents 0ce8f1d5 8910508b
...@@ -155,13 +155,27 @@ SMALL_POLICY(bool); ...@@ -155,13 +155,27 @@ SMALL_POLICY(bool);
#undef SMALL_POLICY #undef SMALL_POLICY
/// This function will return a different policy for each type. template <typename T>
template<typename T> class SinglePolicy
base_any_policy* get_policy()
{ {
SinglePolicy();
SinglePolicy(const SinglePolicy& other);
SinglePolicy& operator=(const SinglePolicy& other);
public:
static base_any_policy* get_policy();
private:
static typename choose_policy<T>::type policy; static typename choose_policy<T>::type policy;
return &policy; };
}
template <typename T>
typename choose_policy<T>::type SinglePolicy<T>::policy;
/// This function will return a different policy for each type.
template <typename T>
inline base_any_policy* SinglePolicy<T>::get_policy() { return &policy; }
} // namespace anyimpl } // namespace anyimpl
struct any struct any
...@@ -175,26 +189,26 @@ public: ...@@ -175,26 +189,26 @@ public:
/// Initializing constructor. /// Initializing constructor.
template <typename T> template <typename T>
any(const T& x) any(const T& x)
: policy(anyimpl::get_policy<anyimpl::empty_any>()), object(NULL) : policy(anyimpl::SinglePolicy<anyimpl::empty_any>::get_policy()), object(NULL)
{ {
assign(x); assign(x);
} }
/// Empty constructor. /// Empty constructor.
any() any()
: policy(anyimpl::get_policy<anyimpl::empty_any>()), object(NULL) : policy(anyimpl::SinglePolicy<anyimpl::empty_any>::get_policy()), object(NULL)
{ } { }
/// Special initializing constructor for string literals. /// Special initializing constructor for string literals.
any(const char* x) any(const char* x)
: policy(anyimpl::get_policy<anyimpl::empty_any>()), object(NULL) : policy(anyimpl::SinglePolicy<anyimpl::empty_any>::get_policy()), object(NULL)
{ {
assign(x); assign(x);
} }
/// Copy constructor. /// Copy constructor.
any(const any& x) any(const any& x)
: policy(anyimpl::get_policy<anyimpl::empty_any>()), object(NULL) : policy(anyimpl::SinglePolicy<anyimpl::empty_any>::get_policy()), object(NULL)
{ {
assign(x); assign(x);
} }
...@@ -219,7 +233,7 @@ public: ...@@ -219,7 +233,7 @@ public:
any& assign(const T& x) any& assign(const T& x)
{ {
reset(); reset();
policy = anyimpl::get_policy<T>(); policy = anyimpl::SinglePolicy<T>::get_policy();
policy->copy_from_value(&x, &object); policy->copy_from_value(&x, &object);
return *this; return *this;
} }
...@@ -274,7 +288,7 @@ public: ...@@ -274,7 +288,7 @@ public:
void reset() void reset()
{ {
policy->static_delete(&object); policy->static_delete(&object);
policy = anyimpl::get_policy<anyimpl::empty_any>(); policy = anyimpl::SinglePolicy<anyimpl::empty_any>::get_policy();
} }
/// Returns true if the two types are the same. /// Returns true if the two types are the same.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment