3 #include "DM/config.hpp"
4 #include "DM/AutoLink.hpp"
5 #include "DM/Exception.hpp"
25 Any() noexcept: content(0) {
28 template<
typename ValueType>
29 Any(
const ValueType & value) : content(
new holder<
30 typename std::remove_cv<
typename std::decay<const ValueType>::type>::type
34 Any(
const Any & other) : content(other.content ? other.content->clone() : 0) {
38 Any(
Any&& other) noexcept : content(other.content) {
43 template<
typename ValueType>
45 ,
typename std::enable_if< !std::is_same<Any&, ValueType>::value >::type* = 0
46 ,
typename std::enable_if< !std::is_const<ValueType>::value >::type* = 0)
47 : content(
new holder<
typename std::decay<ValueType>::type >(
static_cast<ValueType&&
>(value)))
56 Any & swap(
Any & rhs) noexcept {
57 std::swap(content, rhs.content);
61 Any & operator=(
const Any& rhs) {
67 Any & operator=(
Any&& rhs) noexcept
75 template <
class ValueType>
76 Any & operator=(ValueType&& rhs)
78 Any(
static_cast<ValueType&&
>(rhs)).swap(*
this);
83 bool empty()
const noexcept {
86 void clear() noexcept {
89 std::type_index type()
const noexcept {
90 return content ? content->type() : std::type_index(
typeid(
void));
98 virtual ~placeholder() { }
101 virtual std::type_index type()
const noexcept = 0;
102 virtual placeholder * clone()
const = 0;
105 template<
typename ValueType>
106 class holder :
public placeholder
109 holder(
const ValueType & value) : held(value) { }
110 holder(ValueType&& value) : held(
static_cast< ValueType&&
>(value)) { }
113 virtual std::type_index type()
const noexcept {
114 return std::type_index(
typeid(ValueType));
116 virtual placeholder * clone()
const {
117 return new holder(held);
124 holder & operator=(
const holder &);
129 template<
typename ValueType>
130 friend ValueType * any_cast(
Any *) noexcept;
131 template<
typename ValueType>
132 friend ValueType * unsafe_any_cast(
Any *) noexcept;
134 placeholder * content;
137 inline void swap(
Any & lhs,
Any & rhs) noexcept { lhs.swap(rhs); }
142 virtual const char * what()
const noexcept{
143 return "boost::bad_any_cast: failed conversion using boost::any_cast";
147 template<
typename ValueType>
148 ValueType * any_cast(
Any * operand) noexcept
150 return operand && operand->type() == std::type_index(
typeid(ValueType))
152 static_cast<Any::holder<typename std::remove_cv<ValueType>::type
> *>(operand->content)->held
157 template<
typename ValueType>
158 inline const ValueType * any_cast(
const Any * operand) noexcept
160 return any_cast<ValueType>(
const_cast<Any *
>(operand));
163 template<
typename ValueType>
164 ValueType any_cast(Any & operand)
166 typedef typename std::remove_reference<ValueType>::type nonref;
168 nonref * result = any_cast<nonref>(std::addressof(operand));
176 typedef typename std::conditional <
177 std::is_reference<ValueType>::value ,
179 typename std::add_lvalue_reference<ValueType>::type
183 # pragma warning(push)
184 # pragma warning(disable: 4172) // "returning address of local variable or temporary" but *result is not local!
186 return static_cast<ref_type
>(*result);
188 # pragma warning(pop)
192 template<
typename ValueType>
193 inline ValueType any_cast(
const Any & operand)
195 typedef typename std::remove_reference<ValueType>::type nonref;
196 return any_cast<const nonref &>(
const_cast<Any &
>(operand));