26 #ifndef LUNCHBOX_ANY_H 
   27 #define LUNCHBOX_ANY_H 
   30 #include <lunchbox/debug.h> 
   32 #include <boost/type_traits/remove_reference.hpp> 
   33 #include <boost/shared_ptr.hpp> 
   36 #include <boost/serialization/singleton.hpp> 
   37 #include <boost/serialization/extended_type_info.hpp> 
   38 #include <boost/serialization/access.hpp> 
   39 #include <boost/serialization/assume_abstract.hpp> 
   40 #include <boost/serialization/base_object.hpp> 
   41 #include <boost/serialization/shared_ptr.hpp> 
   45 # if (defined(__GNUC__) && __GNUC__ >= 3) \ 
   47  || (   defined(__sgi) && defined(__host_mips)) \ 
   48  || (defined(__hpux) && defined(__HP_aCC)) \ 
   49  || (defined(linux) && defined(__INTEL_COMPILER) && defined(__ICC)) 
   50 #  define BOOST_AUX_ANY_TYPE_ID_NAME 
   75     template< 
typename ValueType >
 
   76     Any( 
const ValueType& value )
 
   77       : content( new holder< ValueType >( value ))
 
   82     LUNCHBOX_API 
Any( 
const Any& other );
 
   91     LUNCHBOX_API Any& 
swap( Any& rhs );
 
   94     template< 
typename ValueType >
 
   97         Any( rhs ).swap( *
this );
 
  108     LUNCHBOX_API 
bool empty() 
const;
 
  115     LUNCHBOX_API 
const std::type_info& 
type() 
const;
 
  121     LUNCHBOX_API 
bool operator == ( 
const Any& rhs ) 
const;
 
  127     bool operator != ( 
const Any& rhs )
 const { 
return !(*
this == rhs); }
 
  135         virtual ~placeholder() {}
 
  137         virtual bool operator == ( 
const placeholder& rhs ) 
const = 0;
 
  140             { 
return !(*
this == rhs); }
 
  142         virtual const std::type_info& 
type() 
const = 0;
 
  144         virtual placeholder* clone() 
const = 0;
 
  147         friend class boost::serialization::access;
 
  148         template< 
class Archive >
 
  149         void serialize( Archive&, 
const unsigned int ) {}
 
  152     BOOST_SERIALIZATION_ASSUME_ABSTRACT(placeholder)
 
  154     template< typename ValueType >
 
  155     class holder : public placeholder
 
  163         explicit holder( 
const ValueType& value )
 
  168         virtual const std::type_info& 
type()
 const 
  170             return typeid(ValueType);
 
  173         virtual bool operator == ( 
const placeholder& rhs )
 const 
  175             return held == 
static_cast< const holder& 
>( rhs ).held;
 
  178         virtual placeholder* clone()
 const 
  180             return new holder( held );
 
  188         friend class boost::serialization::access;
 
  189         template< 
class Archive >
 
  190         void serialize( Archive & ar, 
const unsigned int  )
 
  193             ar & boost::serialization::base_object< placeholder >( *this );
 
  200     template< 
typename ValueType >
 
  203     template< 
typename ValueType >
 
  206     friend class boost::serialization::access;
 
  207     template< 
class Archive >
 
  208     void serialize( Archive & ar, 
const unsigned int  )
 
  213     boost::shared_ptr< placeholder > content;
 
  220     LUNCHBOX_API 
bad_any_cast( 
const std::string& from, 
const std::string& to );
 
  222     virtual const char* what() 
const throw() { 
return data; }
 
  234 template< 
typename ValueType >
 
  238 #ifdef BOOST_AUX_ANY_TYPE_ID_NAME 
  239         std::strcmp(operand->
type().name(), 
typeid(ValueType).name()) == 0
 
  241         operand->
type() == 
typeid(ValueType)
 
  243         ? &
static_cast<Any::holder<ValueType> *
>(operand->content.get())->held
 
  253 template< 
typename ValueType >
 
  256     return any_cast<ValueType>(
const_cast<Any *
>(operand));
 
  266 template< 
typename ValueType >
 
  269     typedef typename boost::remove_reference< ValueType >::type nonref;
 
  271     nonref* result = 
any_cast< nonref >( &operand );
 
  273         boost::throw_exception(
 
  275                                     demangleTypeID( 
typeid( nonref ).name( ))));
 
  286 template< 
typename ValueType >
 
  289     typedef typename boost::remove_reference< ValueType >::type nonref;
 
  291     return any_cast< 
const nonref& >( 
const_cast< Any& 
>( operand ));
 
  300 template< 
typename ValueType >
 
  303     return &
static_cast< Any::holder< ValueType >* 
>(
 
  304                              operand->content.get( ))->held;
 
  313 template< 
typename ValueType >
 
  325 template< 
typename ValueType >
 
  328     typedef typename boost::remove_reference< ValueType >::type nonref;
 
  338 template< 
typename ValueType >
 
  341    typedef typename boost::remove_reference< ValueType >::type nonref;
 
Defines export visibility macros for Lunchbox. 
 
Any & operator=(const ValueType &rhs)
Assign a new value to this Any. 
 
LUNCHBOX_API const std::type_info & type() const 
 
friend ValueType * unsafe_any_cast(Any *)
Retrieve the value stored in an Any without type checking. 
 
Any(const ValueType &value)
Construct a new Any with the given value. 
 
LUNCHBOX_API bool empty() const 
 
LUNCHBOX_API Any & swap(Any &rhs)
Exchange the content of this and rhs. 
 
A specialization for exceptions thrown by an unsuccessful any_cast. 
 
LUNCHBOX_API Any()
Construct a new, empty Any. 
 
LUNCHBOX_API ~Any()
Destruct this Any. 
 
friend ValueType * any_cast(Any *)
Retrieve the value stored in an Any including type checking. 
 
bool operator!=(const Any &rhs) const 
 
A class which can hold instances of any type. 
 
ValueType * unsafe_any_cast(Any *operand)
Retrieve the value stored in an Any without type checking. 
 
ValueType * any_cast(Any *operand)
Retrieve the value stored in an Any including type checking. 
 
LUNCHBOX_API bool operator==(const Any &rhs) const