1 // Copyright (C) 2018 Intel Corporation
3 // SPDX-License-Identifier: Apache-2.0
10 #include <type_traits>
16 //TODO - drop any from ADE metadata, using only typed graph
17 //and to introduce bind() instead
21 template <class T, class Source>
22 T down_cast(Source operand)
24 #if defined(__GXX_RTTI) || defined(_CPPRTTI)
25 return dynamic_cast<T>(operand);
27 #warning used static cast instead of dynamic because RTTI is disabled
28 return static_cast<T>(operand);
35 class bad_any_cast : public std::bad_cast
38 virtual const char* what() const noexcept override
40 return "Bad any cast";
44 //modeled against C++17 std::any
49 using holder_ptr = std::unique_ptr<holder>;
52 virtual holder_ptr clone() = 0;
53 virtual ~holder() = default;
56 template <typename value_t>
57 struct holder_impl : holder
60 template<typename arg_t>
61 holder_impl(arg_t&& a) : v(std::forward<arg_t>(a)) {}
62 holder_ptr clone() override { return holder_ptr(new holder_impl (v));}
67 template<class value_t>
68 any(value_t&& arg) : hldr(new holder_impl<typename std::decay<value_t>::type>( std::forward<value_t>(arg))) {}
70 any(any const& src) : hldr( src.hldr ? src.hldr->clone() : nullptr) {}
71 //simple hack in order not to write enable_if<not any> for the template constructor
72 any(any & src) : any (const_cast<any const&>(src)) {}
75 any(any&& ) = default;
77 any& operator=(any&&) = default;
79 any& operator=(any const& src)
86 template<class value_t>
87 friend value_t* any_cast(any* operand);
89 template<class value_t>
90 friend const value_t* any_cast(const any* operand);
92 friend void swap(any & lhs, any& rhs)
94 swap(lhs.hldr, rhs.hldr);
99 template<class value_t>
100 value_t* any_cast(any* operand)
102 auto casted = internal::down_cast<any::holder_impl<typename std::decay<value_t>::type> *>(operand->hldr.get());
104 return & (casted->v);
109 template<class value_t>
110 const value_t* any_cast(const any* operand)
112 auto casted = internal::down_cast<any::holder_impl<typename std::decay<value_t>::type> *>(operand->hldr.get());
114 return & (casted->v);
119 template<class value_t>
120 value_t& any_cast(any& operand)
122 auto ptr = any_cast<value_t>(&operand);
128 throw_error(bad_any_cast());
132 template<class value_t>
133 const value_t& any_cast(const any& operand)
135 auto ptr = any_cast<value_t>(&operand);
141 throw_error(bad_any_cast());
145 #endif // UTIL_ANY_HPP