+/*
+# ---------------------------------------------------------------------
+#
+# Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image
+# pour la SantÈ)
+# Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
+# Previous Authors : Laurent Guigues, Jean-Pierre Roux
+# CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
+#
+# This software is governed by the CeCILL-B license under French law and
+# abiding by the rules of distribution of free software. You can use,
+# modify and/ or redistribute the software under the terms of the CeCILL-B
+# license as circulated by CEA, CNRS and INRIA at the following URL
+# http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+# or in the file LICENSE.txt.
+#
+# As a counterpart to the access to the source code and rights to copy,
+# modify and redistribute granted by the license, users are provided only
+# with a limited warranty and the software's author, the holder of the
+# economic rights, and the successive licensors have only limited
+# liability.
+#
+# The fact that you are presently reading this means that you have had
+# knowledge of the CeCILL-B license and that you accept its terms.
+# ------------------------------------------------------------------------ */
+
+
/*=========================================================================
-
Program: bbtk
Module: $RCSfile: bbtkAny.h,v $
Language: C++
- Date: $Date: 2008/01/22 15:02:00 $
- Version: $Revision: 1.1 $
-
- Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
- l'Image). All rights reserved. See doc/license.txt or
- http://www.creatis.insa-lyon.fr/Public/bbtk/License.html for details.
-
- This software is distributed WITHOUT ANY WARRANTY; without even
- the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- PURPOSE. See the above copyright notices for more information.
-
+ Date: $Date: 2012/11/16 08:49:01 $
+ Version: $Revision: 1.9 $
=========================================================================*/
+
+
+
/**
*\file
*\brief Defines the class any which can store any type of data (adapted from boost::any).
#include "bbtkMessageManager.h"
#include "bbtkException.h"
-#ifdef _USE_BOOST_
#include <boost/type_traits/is_pointer.hpp>
-#endif
namespace bbtk
{
class anyholder<ValueType*> : public anyplaceholder
{
public: // structors
-
+
anyholder(ValueType* const & value)
: held(value)
{ }
-
+
public: // queries
-
+
virtual const std::type_info & type() const
{
return typeid(ValueType*);
}
-
+
virtual bool is_pointer() const { return true; }
virtual const std::type_info & pointed_type() const { return typeid(ValueType); }
virtual void* get_pointer() const {
}
virtual anyplaceholder * clone() const { return new anyholder(held); }
-
+
public: // representation
-
+
ValueType* held;
-
+
};
//=========================================================
public:
typedef any< TypeTraits > self;
// structors
-
+
/// Default constructor
any()
: content(0)
{
}
-
+
/// Constructor with a value of template type
template<typename ValueType>
any(const ValueType & value)
{
delete content;
}
-
+
/// Swaps the content of this with another any
any & swap(any & rhs)
/// Returns true iff the contained type is a pointer
inline bool contains_pointer()
{
- return content->is_pointer() ;
+ return content ? content->is_pointer() : false;
}
/// Returns true iff the contained type is t
inline bool contains(TypeInfo t)
{
- return ( type() == t );
+ return ( (bool)((type() == t)!=0) );
}
/// Returns true iff any of type ValueType can be held
-/*
-
-// 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