15 #ifndef INCG_IRIS_IUTEST_ANY_HPP_8DB2417F_568A_4E01_95AD_21164565B975_
16 #define INCG_IRIS_IUTEST_ANY_HPP_8DB2417F_568A_4E01_95AD_21164565B975_
34 typedef internal::TypeId type_id;
36 any() : content(NULL) {}
38 any(
const T& rhs) : content(
new holder<T>(rhs)) {}
39 any(
const any& rhs) : content(rhs.content == NULL ? NULL : rhs.content->clone()) {}
40 any(
const char rhs[]) : content(
new holder< ::std::string >(::std::string(rhs)) ) {}
41 ~
any() {
delete content; }
48 ::std::swap(content, rhs.content);
57 return content == NULL;
72 return content == NULL ? internal::GetTypeId<void>() : content->type();
81 return type() == internal::GetTypeId<T>();
93 return content->to_string();
114 any& operator = (
const T& rhs) {
any(rhs).
swap(*
this);
return *
this; }
115 any& operator = (
const any& rhs) { any(rhs).swap(*
this);
return *
this; }
126 virtual ~placeholder() {}
127 virtual type_id
type()
const = 0;
128 virtual placeholder* clone()
const = 0;
129 virtual ::std::string
to_string()
const = 0;
135 explicit holder(
const T& v) : held(v) {}
139 return internal::GetTypeId<T>();
143 return new holder<T>(held);
152 holder& operator = (
const holder&);
155 placeholder* content;
158 #if IUTEST_HAS_EXCEPTIONS
162 class bad_any_cast :
public ::std::bad_cast {};
165 inline void swap(
any& lhs,
any& rhs) { lhs.
swap(rhs); }
174 &(
static_cast< any::holder<T>*
>(p->content)->held) : NULL;
180 return any_cast<T>(
const_cast<any*
>(p));
186 #if !defined(IUTEST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
187 typedef typename type_traits::remove_reference<T>::type nonref_t;
191 nonref_t* p = any_cast<nonref_t>(&value);
192 #if IUTEST_HAS_EXCEPTIONS
198 return static_cast<nonref_t&
>(*p);
204 return any_cast<T>(
const_cast<any&
>(value));
221 return &(
static_cast< any::holder<T>*
>(p->content)->held);
227 return unsafe_any_cast<T>(
const_cast<any*
>(p));
233 #if !defined(IUTEST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
234 typedef typename type_traits::remove_reference<T>::type nonref_t;
238 nonref_t* p = unsafe_any_cast<nonref_t>(&value);
239 return static_cast<nonref_t&
>(*p);
245 return unsafe_any_cast<T>(
const_cast<any&
>(value));
248 #if !defined(IUTEST_NO_ARGUMENT_DEPENDENT_LOOKUP)
250 #if IUTEST_HAS_STRINGSTREAM || IUTEST_HAS_STRSTREAM
251 template<
typename Elem,
typename Traits>
252 inline ::std::basic_ostream<Elem, Traits>& operator << (::std::basic_ostream<Elem, Traits>& os,
const any& value)
254 return os << value.to_string();
257 inline iu_ostream& operator << (iu_ostream& os,
const any& value)
259 return os << value.to_string();
any
Definition: iutest_any.hpp:34
bool has_value() const
要素があるかどうか
Definition: iutest_any.hpp:101
bool empty() const
空かどうか
Definition: iutest_any.hpp:56
type_id type() const
型IDの取得
Definition: iutest_any.hpp:71
any & swap(any &rhs)
swap
Definition: iutest_any.hpp:47
::std::string to_string() const
所持している値の文字列化
Definition: iutest_any.hpp:88
void reset()
要素のクリア
Definition: iutest_any.hpp:108
bool type_equal() const
型の比較
Definition: iutest_any.hpp:80
void clear()
要素のクリア
Definition: iutest_any.hpp:63
friend T * unsafe_any_cast(any *)
型を考慮せずキャスト
Definition: iutest_any.hpp:212
friend T * any_cast(any *)
型を考慮したキャスト
Definition: iutest_any.hpp:172
any_cast の失敗例外
Definition: iutest_any.hpp:163
#define IUTEST_CXX_FINAL
final definition
Definition: iutest_compiler.hpp:756
#define IUTEST_CXX_OVERRIDE
override definition
Definition: iutest_compiler.hpp:747
iutest root namespace
Definition: iutest_charcode.hpp:33
std::string PrintToString(const T &v)
文字列化
Definition: iutest_printers.hpp:767
T * any_cast(any *p)
型を考慮したキャスト
Definition: iutest_any.hpp:172
T * unsafe_any_cast(any *p)
型を考慮せずキャスト
Definition: iutest_any.hpp:212