1 #ifndef RHESUS_GENERIC_H_
2 #define RHESUS_GENERIC_H_
4 #include "../Defines.h"
5 #include "remove_reference.h"
26 virtual ~placeholder() {}
28 virtual const std::type_info& type()
const = 0;
32 struct holder :
public placeholder
41 const std::type_info& type()
const
47 placeholder* m_storedValue;
57 : m_storedValue(other.m_storedValue ? other.m_storedValue : NULL)
64 : m_storedValue(
new holder<T>(value))
70 DELETE(m_storedValue);
78 return m_storedValue == NULL;
82 Generic& operator=(
const T& rhs)
84 m_storedValue =
Generic(rhs).m_storedValue;
89 Generic& operator=(Generic rhs)
91 m_storedValue = rhs.m_storedValue;
101 const std::type_info& type()
const
103 return (m_storedValue) ? m_storedValue->type() :
typeid(void);
108 T* generic_cast(Generic* var)
110 return (var &&
typeid(T) == var->type()) ? &(
static_cast<Generic::holder<T>*
>(var->Held())->val) :
115 inline const T* generic_cast(
const Generic* var)
117 return generic_cast<T>(
const_cast<Generic*
>(var));
121 T generic_cast(Generic& var)
123 typedef typename remove_reference<T>::type nonref;
125 nonref* res = generic_cast<nonref>(&var);
127 if(!res)
throw std::exception();
133 inline T generic_cast(
const Generic& var)
135 typedef typename remove_reference<T>::type nonref;
137 return generic_cast<
const nonref&>(
const_cast<Generic&
>(var));
141 inline T* unsafe_generic_cast(Generic* var)
143 return &(
static_cast<Generic::holder<T>*
>(var->m_storedValue)->val);
147 inline const T* unsafe_generic_cast(
const Generic* var)
149 return unsafe_generic_cast<T>(
const_cast<Generic*
>(var));