// Boost.Signals library
-//
-// Copyright (C) 2001 Doug Gregor (gregod@cs.rpi.edu)
-//
-// Permission to copy, use, sell and distribute this software is granted
-// provided this copyright notice appears in all copies.
-// Permission to modify the code and to distribute modified code is granted
-// provided this copyright notice appears in all copies, and a notice
-// that the code was modified is included with the copyright notice.
-//
-// This software is provided "as is" without express or implied warranty,
-// and with no claim as to its suitability for any purpose.
-
+
+// Copyright Douglas Gregor 2001-2004. Use, modification and
+// distribution is subject to the Boost Software License, Version
+// 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
// For more information, see http://www.boost.org
#ifndef BOOST_SIGNALS_COMMON_HEADER
#include <boost/type_traits/conversion_traits.hpp>
#include <boost/ref.hpp>
+#include <boost/signals/detail/config.hpp>
+
+#ifdef BOOST_HAS_ABI_HEADERS
+# include BOOST_ABI_PREFIX
+#endif
namespace boost {
namespace BOOST_SIGNALS_NAMESPACE {
// The unusable class is a placeholder for unused function arguments
// It is also completely unusable except that it constructable from
// anything. This helps compilers without partial specialization
- // handle slots returning void.
+ // handle slots returning void.
struct unusable {
unusable() {}
};
// Determine the result type of a slot call
template<typename R>
struct slot_result_type {
- typedef R type;
+ typedef R type;
};
template<>
struct slot_result_type<void> {
- typedef unusable type;
+ typedef unusable type;
};
// Determine if the given type T is a signal
template<typename T>
struct is_signal {
- BOOST_STATIC_CONSTANT(bool,
- value = (is_convertible<T*, signal_base*>::value));
+ BOOST_STATIC_CONSTANT(bool,
+ value = (is_convertible<T*, signal_base*>::value));
};
/*
* The IF implementation is temporary code. When a Boost metaprogramming
- * library is introduced, Boost.Signals will use it instead.
+ * library is introduced, Boost.Signals will use it instead.
*/
namespace intimate {
- struct SelectThen
- {
+ struct SelectThen
+ {
template<typename Then, typename Else>
struct Result
- {
+ {
typedef Then type;
};
};
-
+
struct SelectElse
{
template<typename Then, typename Else>
struct Result
- {
+ {
typedef Else type;
};
};
-
+
template<bool Condition>
struct Selector
{
typedef SelectThen type;
};
-
+
template<>
struct Selector<false>
{
typedef SelectElse type;
};
- } // end namespace intimate
-
+ } // end namespace intimate
+
template<bool Condition, typename Then, typename Else>
struct IF
{
template<typename T>
struct is_ref
{
- BOOST_STATIC_CONSTANT(bool, value = false);
+ BOOST_STATIC_CONSTANT(bool, value = false);
};
template<typename T>
struct is_ref<reference_wrapper<T> >
{
- BOOST_STATIC_CONSTANT(bool, value = true);
+ BOOST_STATIC_CONSTANT(bool, value = true);
};
#else // no partial specialization
typedef char yes_type;
typedef double no_type;
-
+
no_type is_ref_tester(...);
template<typename T>
template<typename T>
struct is_ref
{
- static T* t;
- BOOST_STATIC_CONSTANT(bool,
- value = (sizeof(is_ref_tester(t)) == sizeof(yes_type)));
+ static T* t;
+ BOOST_STATIC_CONSTANT(bool,
+ value = (sizeof(is_ref_tester(t)) == sizeof(yes_type)));
};
#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
- // A slot can be a signal, a reference to a function object, or a
+ // A slot can be a signal, a reference to a function object, or a
// function object.
struct signal_tag {};
struct reference_tag {};
struct value_tag {};
- // Classify the given slot as a signal, a reference-to-slot, or a
+ // Classify the given slot as a signal, a reference-to-slot, or a
// standard slot
template<typename S>
class get_slot_tag {
- typedef typename IF<(is_signal<S>::value),
- signal_tag,
- value_tag>::type signal_or_value;
-
- public:
- typedef typename IF<(is_ref<S>::value),
- reference_tag,
- signal_or_value>::type type;
+ typedef typename IF<(is_signal<S>::value),
+ signal_tag,
+ value_tag>::type signal_or_value;
+
+ public:
+ typedef typename IF<(is_ref<S>::value),
+ reference_tag,
+ signal_or_value>::type type;
};
// Forward declaration needed in lots of places
} // end namespace BOOST_SIGNALS_NAMESPACE
} // end namespace boost
+#ifdef BOOST_HAS_ABI_HEADERS
+# include BOOST_ABI_SUFFIX
+#endif
+
#endif // BOOST_SIGNALS_COMMON_HEADER