Commit 4c19e027 authored by Roman Donchenko's avatar Roman Donchenko

Cherry-picked mariusmuja/flann@b615f2694723fe402b8bbe50d77e622beff7f171.

Original author: Alex Wilson.
parent 78c4ffec
...@@ -44,6 +44,7 @@ struct base_any_policy ...@@ -44,6 +44,7 @@ struct base_any_policy
virtual void clone(void* const* src, void** dest) = 0; virtual void clone(void* const* src, void** dest) = 0;
virtual void move(void* const* src, void** dest) = 0; virtual void move(void* const* src, void** dest) = 0;
virtual void* get_value(void** src) = 0; virtual void* get_value(void** src) = 0;
virtual void* get_value(void* const * src) = 0;
virtual ::size_t get_size() = 0; virtual ::size_t get_size() = 0;
virtual const std::type_info& type() = 0; virtual const std::type_info& type() = 0;
virtual void print(std::ostream& out, void* const* src) = 0; virtual void print(std::ostream& out, void* const* src) = 0;
...@@ -69,6 +70,7 @@ struct small_any_policy : typed_base_any_policy<T> ...@@ -69,6 +70,7 @@ struct small_any_policy : typed_base_any_policy<T>
virtual void clone(void* const* src, void** dest) { *dest = *src; } virtual void clone(void* const* src, void** dest) { *dest = *src; }
virtual void move(void* const* src, void** dest) { *dest = *src; } virtual void move(void* const* src, void** dest) { *dest = *src; }
virtual void* get_value(void** src) { return reinterpret_cast<void*>(src); } virtual void* get_value(void** src) { return reinterpret_cast<void*>(src); }
virtual void* get_value(void* const * src) { return const_cast<void *>( reinterpret_cast<const void*>(src) ); }
virtual void print(std::ostream& out, void* const* src) { out << *reinterpret_cast<T const*>(src); } virtual void print(std::ostream& out, void* const* src) { out << *reinterpret_cast<T const*>(src); }
}; };
...@@ -93,6 +95,7 @@ struct big_any_policy : typed_base_any_policy<T> ...@@ -93,6 +95,7 @@ struct big_any_policy : typed_base_any_policy<T>
**reinterpret_cast<T**>(dest) = **reinterpret_cast<T* const*>(src); **reinterpret_cast<T**>(dest) = **reinterpret_cast<T* const*>(src);
} }
virtual void* get_value(void** src) { return *src; } virtual void* get_value(void** src) { return *src; }
virtual void* get_value(void* const * src) { return const_cast<void*>(*src); }
virtual void print(std::ostream& out, void* const* src) { out << *reinterpret_cast<T const*>(*src); } virtual void print(std::ostream& out, void* const* src) { out << *reinterpret_cast<T const*>(*src); }
}; };
...@@ -257,8 +260,7 @@ public: ...@@ -257,8 +260,7 @@ public:
const T& cast() const const T& cast() const
{ {
if (policy->type() != typeid(T)) throw anyimpl::bad_any_cast(); if (policy->type() != typeid(T)) throw anyimpl::bad_any_cast();
void* obj = const_cast<void*>(object); T* r = reinterpret_cast<T*>(policy->get_value(&object));
T* r = reinterpret_cast<T*>(policy->get_value(&obj));
return *r; return *r;
} }
......
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