Program: bbtk
Module: $RCSfile: bbtkAny.h,v $
Language: C++
- Date: $Date: 2008/02/20 16:05:38 $
- Version: $Revision: 1.2 $
+ Date: $Date: 2008/04/24 10:11:27 $
+ Version: $Revision: 1.3 $
Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
l'Image). All rights reserved. See doc/license.txt or
#include "bbtkMessageManager.h"
#include "bbtkException.h"
-#ifdef _USE_BOOST_
#include <boost/type_traits/is_pointer.hpp>
-#endif
namespace bbtk
{
-/*
-
-// TRY TO INCLUDE BOOST DIRECTLY : OK WORKS !
-#include <algorithm>
-#include <typeinfo>
-
-#include "boost/config.hpp"
-#include <boost/type_traits/remove_reference.hpp>
-#include <boost/type_traits/is_reference.hpp>
-#include <boost/throw_exception.hpp>
-#include <boost/static_assert.hpp>
-
-
-namespace bbtk
-{
-
-
- class bad_any_cast : public std::bad_cast
- {
- public:
- virtual const char * what() const throw()
- {
- return "boost::bad_any_cast: "
- "failed conversion using boost::any_cast";
- }
- };
-
- typedef any<thing> anything;
-
- template<typename ValueType>
- ValueType * any_cast(anything * operand)
- {
- return operand && operand->type() == typeid(ValueType)
- ? &static_cast<anything::holder<ValueType> *>(operand->content)->held
- : 0;
- }
-
- template<typename ValueType>
- const ValueType * any_cast(const anything * operand)
- {
- return any_cast<ValueType>(const_cast<anything *>(operand));
- }
-
- template<typename ValueType>
- ValueType any_cast(const anything & operand)
- {
- typedef BOOST_DEDUCED_TYPENAME boost::remove_reference<ValueType>::type nonref;
-
-#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
- // If 'nonref' is still reference type, it means the user has not
- // specialized 'remove_reference'.
-
- // Please use BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION macro
- // to generate specialization of remove_reference for your class
- // See type traits library documentation for details
- BOOST_STATIC_ASSERT(!boost::is_reference<nonref>::value);
-#endif
-
- const nonref * result = any_cast<nonref>(&operand);
- if(!result)
- boost::throw_exception(bad_any_cast());
- return *result;
- }
-
- template<typename ValueType>
- ValueType any_cast(anything & operand)
- {
- typedef BOOST_DEDUCED_TYPENAME boost::remove_reference<ValueType>::type nonref;
-
-#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
- // The comment in the above version of 'any_cast' explains when this
- // assert is fired and what to do.
- BOOST_STATIC_ASSERT(!is_reference<nonref>::value);
-#endif
-
- nonref * result = any_cast<nonref>(&operand);
- if(!result)
- boost::throw_exception(bad_any_cast());
- return *result;
- }
-
- // Note: The "unsafe" versions of any_cast are not part of the
- // public interface and may be removed at any time. They are
- // required where we know what type is stored in the any and can't
- // use typeid() comparison, e.g., when our types may travel across
- // different shared libraries.
- template<typename ValueType>
- inline ValueType * unsafe_any_cast(anything * operand)
- {
- return &static_cast<anything::holder<ValueType> *>(operand->content)->held;
- }
-
- template<typename ValueType>
- inline const ValueType * unsafe_any_cast(const anything * operand)
- {
- return unsafe_any_cast<ValueType>(const_cast<anything *>(operand));
- }
-}
-*/ // EO TRY TO INCLUDE BOOST
-
#endif