1 #ifndef RHESUS_GENERIC_H_
2 #define RHESUS_GENERIC_H_
4 #include "../Defines.h"
5 #include "remove_reference.hpp"
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);
75 return m_storedValue == NULL;
79 Generic& operator=(
const T& rhs)
81 m_storedValue =
Generic(rhs).m_storedValue;
88 m_storedValue = rhs.m_storedValue;
98 const std::type_info& type()
const
100 return (m_storedValue) ? m_storedValue->type() :
typeid(void);
107 return (var &&
typeid(T) == var->type()) ? &(
static_cast<Generic::holder<T>*
>(var->Held())->val) :
112 inline const T* generic_cast(
const Generic* var)
114 return generic_cast<T>(
const_cast<Generic*
>(var));
118 T generic_cast(Generic& var)
120 typedef typename remove_reference<T>::type nonref;
122 nonref* res = generic_cast<nonref>(&var);
124 if(!res)
throw std::exception();
130 inline T generic_cast(
const Generic& var)
132 typedef typename remove_reference<T>::type nonref;
134 return generic_cast<
const nonref&>(
const_cast<Generic&
>(var));
138 inline T* unsafe_generic_cast(Generic* var)
140 return &(
static_cast<Generic::holder<T>*
>(var->m_storedValue)->val);
144 inline const T* unsafe_generic_cast(
const Generic* var)
146 return unsafe_generic_cast<T>(
const_cast<Generic*
>(var));