diff options
Diffstat (limited to '3rdParty/Boost/boost/signals/detail/signals_common.hpp')
-rw-r--r-- | 3rdParty/Boost/boost/signals/detail/signals_common.hpp | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/3rdParty/Boost/boost/signals/detail/signals_common.hpp b/3rdParty/Boost/boost/signals/detail/signals_common.hpp new file mode 100644 index 0000000..fe1a5a1 --- /dev/null +++ b/3rdParty/Boost/boost/signals/detail/signals_common.hpp @@ -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 |