You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
162 lines
4.3 KiB
162 lines
4.3 KiB
// Boost.Signals library |
|
|
|
// 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 |
|
#define BOOST_SIGNALS_COMMON_HEADER |
|
|
|
#ifndef BOOST_SIGNALS_NAMESPACE |
|
# define BOOST_SIGNALS_NAMESPACE signals |
|
#endif |
|
|
|
#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 { |
|
namespace detail { |
|
// 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. |
|
struct unusable { |
|
unusable() {} |
|
}; |
|
|
|
// Determine the result type of a slot call |
|
template<typename R> |
|
struct slot_result_type { |
|
typedef R type; |
|
}; |
|
|
|
template<> |
|
struct slot_result_type<void> { |
|
typedef unusable type; |
|
}; |
|
|
|
// Determine if the given type T is a signal |
|
class signal_base; |
|
|
|
template<typename T> |
|
struct is_signal { |
|
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. |
|
*/ |
|
namespace intimate { |
|
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 |
|
|
|
template<bool Condition, typename Then, typename Else> |
|
struct IF |
|
{ |
|
typedef typename intimate::Selector<Condition>::type select; |
|
typedef typename select::template Result<Then,Else>::type type; |
|
}; |
|
|
|
// Determine if the incoming argument is a reference_wrapper |
|
#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION |
|
template<typename T> |
|
struct is_ref |
|
{ |
|
BOOST_STATIC_CONSTANT(bool, value = false); |
|
}; |
|
|
|
template<typename T> |
|
struct is_ref<reference_wrapper<T> > |
|
{ |
|
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> |
|
yes_type is_ref_tester(reference_wrapper<T>*); |
|
|
|
template<typename T> |
|
struct is_ref |
|
{ |
|
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 |
|
// function object. |
|
struct signal_tag {}; |
|
struct reference_tag {}; |
|
struct value_tag {}; |
|
|
|
// 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; |
|
}; |
|
|
|
// Forward declaration needed in lots of places |
|
class signal_base_impl; |
|
class bound_objects_visitor; |
|
class slot_base; |
|
} // end namespace detail |
|
} // end namespace BOOST_SIGNALS_NAMESPACE |
|
} // end namespace boost |
|
|
|
#ifdef BOOST_HAS_ABI_HEADERS |
|
# include BOOST_ABI_SUFFIX |
|
#endif |
|
|
|
#endif // BOOST_SIGNALS_COMMON_HEADER
|
|
|