Added boost header
This commit is contained in:
162
test/external/boost/signals/detail/signals_common.hpp
vendored
Normal file
162
test/external/boost/signals/detail/signals_common.hpp
vendored
Normal file
@@ -0,0 +1,162 @@
|
||||
// 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
|
||||
Reference in New Issue
Block a user