15 #ifndef INCG_IRIS_IUTEST_ANY_HPP_8DB2417F_568A_4E01_95AD_21164565B975_
16 #define INCG_IRIS_IUTEST_ANY_HPP_8DB2417F_568A_4E01_95AD_21164565B975_
32 typedef internal::TypeId type_id;
34 any() : content(NULL) {}
36 any(
const T& rhs) : content(
new holder<T>(rhs)) {}
37 any(
const any& rhs) : content(rhs.content == NULL ? NULL : rhs.content->clone()) {}
38 any(
const char rhs[]) : content(
new holder< ::std::string >(::std::string(rhs)) ) {}
39 ~
any() {
delete content; }
46 ::std::swap(content, rhs.content);
55 return content == NULL;
70 return content == NULL ? internal::GetTypeId<void>() : content->type();
79 return type() == internal::GetTypeId<T>();
91 return content->to_string();
112 any& operator = (
const T& rhs) {
any(rhs).
swap(*
this);
return *
this; }
113 any& operator = (
const any& rhs) { any(rhs).swap(*
this);
return *
this; }
124 virtual ~placeholder() {}
125 virtual type_id
type()
const = 0;
126 virtual placeholder* clone()
const = 0;
127 virtual ::std::string
to_string()
const = 0;
130 class holder :
public placeholder
133 explicit holder(
const T& v) : held(v) {}
137 return internal::GetTypeId<T>();
141 return new holder<T>(held);
150 holder& operator = (
const holder&);
153 placeholder* content;
156 #if IUTEST_HAS_EXCEPTIONS
160 class bad_any_cast :
public ::std::bad_cast {};
163 inline void swap(
any& lhs,
any& rhs) { lhs.
swap(rhs); }
172 &(
static_cast< any::holder<T>*
>(p->content)->held) : NULL;
176 inline const T*
any_cast(
const any* p)
178 return any_cast<T>(
const_cast<any*
>(p));
184 #if !defined(IUTEST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
185 typedef typename type_traits::remove_reference<T>::type nonref_t;
189 nonref_t* p = any_cast<nonref_t>(&value);
190 #if IUTEST_HAS_EXCEPTIONS
196 return static_cast<nonref_t&
>(*p);
202 return any_cast<T>(
const_cast<any&
>(value));
219 return &(
static_cast< any::holder<T>*
>(p->content)->held);
225 return unsafe_any_cast<T>(
const_cast<any*
>(p));
231 #if !defined(IUTEST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
232 typedef typename type_traits::remove_reference<T>::type nonref_t;
236 nonref_t* p = unsafe_any_cast<nonref_t>(&value);
237 return static_cast<nonref_t&
>(*p);
243 return unsafe_any_cast<T>(
const_cast<any&
>(value));
246 #if !defined(IUTEST_NO_ARGUMENT_DEPENDENT_LOOKUP)
248 #if IUTEST_HAS_STRINGSTREAM || IUTEST_HAS_STRSTREAM
249 template<
typename Elem,
typename Traits>
250 inline ::std::basic_ostream<Elem, Traits>& operator << (::std::basic_ostream<Elem, Traits>& os,
const any& value)
252 return os << value.to_string();
255 inline iu_ostream& operator << (iu_ostream& os,
const any& value)
257 return os << value.to_string();
265 #endif // INCG_IRIS_IUTEST_ANY_HPP_8DB2417F_568A_4E01_95AD_21164565B975_