Chris@16: // Distributed under the Boost Software License, Version 1.0. (See Chris@16: // accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: // (C) Copyright 2007 Anthony Williams Chris@16: // (C) Copyright 2011-2012 Vicente J. Botet Escriba Chris@16: Chris@16: #ifndef BOOST_THREAD_LOCKABLE_TRAITS_HPP Chris@16: #define BOOST_THREAD_LOCKABLE_TRAITS_HPP Chris@16: Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: Chris@16: // todo make use of integral_constant, true_type and false_type Chris@16: Chris@16: namespace boost Chris@16: { Chris@16: namespace sync Chris@16: { Chris@16: Chris@16: #if defined(BOOST_NO_SFINAE) || \ Chris@16: BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(600)) || \ Chris@16: BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x590)) Chris@16: #if ! defined BOOST_THREAD_NO_AUTO_DETECT_MUTEX_TYPES Chris@16: #define BOOST_THREAD_NO_AUTO_DETECT_MUTEX_TYPES Chris@16: #endif Chris@16: #endif Chris@16: Chris@16: #ifndef BOOST_THREAD_NO_AUTO_DETECT_MUTEX_TYPES Chris@16: namespace detail Chris@16: { Chris@16: #define BOOST_THREAD_DEFINE_HAS_MEMBER_CALLED(member_name) \ Chris@16: template::value> \ Chris@16: struct has_member_called_##member_name \ Chris@16: { \ Chris@16: BOOST_STATIC_CONSTANT(bool, value=false); \ Chris@16: }; \ Chris@16: \ Chris@16: template \ Chris@16: struct has_member_called_##member_name \ Chris@16: { \ Chris@16: typedef char true_type; \ Chris@16: struct false_type \ Chris@16: { \ Chris@16: true_type dummy[2]; \ Chris@16: }; \ Chris@16: \ Chris@16: struct fallback { int member_name; }; \ Chris@16: struct derived: \ Chris@16: T, fallback \ Chris@16: { \ Chris@16: derived(); \ Chris@16: }; \ Chris@16: \ Chris@16: template struct tester; \ Chris@16: \ Chris@16: template \ Chris@16: static false_type has_member(tester<&U::member_name>*); \ Chris@16: template \ Chris@16: static true_type has_member(...); \ Chris@16: \ Chris@16: BOOST_STATIC_CONSTANT( \ Chris@16: bool, value=sizeof(has_member(0))==sizeof(true_type)); \ Chris@16: } Chris@16: Chris@16: BOOST_THREAD_DEFINE_HAS_MEMBER_CALLED(lock) Chris@16: ; BOOST_THREAD_DEFINE_HAS_MEMBER_CALLED(unlock); Chris@16: BOOST_THREAD_DEFINE_HAS_MEMBER_CALLED(try_lock); Chris@16: Chris@16: template::value > Chris@16: struct has_member_lock Chris@16: { Chris@16: BOOST_STATIC_CONSTANT(bool, value=false); Chris@16: }; Chris@16: Chris@16: template Chris@16: struct has_member_lock Chris@16: { Chris@16: typedef char true_type; Chris@16: struct false_type Chris@16: { Chris@16: true_type dummy[2]; Chris@16: }; Chris@16: Chris@16: template Chris@16: static true_type has_member(V (U::*)()); Chris@16: template Chris@16: static false_type has_member(U); Chris@16: Chris@16: BOOST_STATIC_CONSTANT( Chris@16: bool,value=sizeof(has_member_lock::has_member(&T::lock))==sizeof(true_type)); Chris@16: }; Chris@16: Chris@16: template::value > Chris@16: struct has_member_unlock Chris@16: { Chris@16: BOOST_STATIC_CONSTANT(bool, value=false); Chris@16: }; Chris@16: Chris@16: template Chris@16: struct has_member_unlock Chris@16: { Chris@16: typedef char true_type; Chris@16: struct false_type Chris@16: { Chris@16: true_type dummy[2]; Chris@16: }; Chris@16: Chris@16: template Chris@16: static true_type has_member(V (U::*)()); Chris@16: template Chris@16: static false_type has_member(U); Chris@16: Chris@16: BOOST_STATIC_CONSTANT( Chris@16: bool,value=sizeof(has_member_unlock::has_member(&T::unlock))==sizeof(true_type)); Chris@16: }; Chris@16: Chris@16: template::value > Chris@16: struct has_member_try_lock Chris@16: { Chris@16: BOOST_STATIC_CONSTANT(bool, value=false); Chris@16: }; Chris@16: Chris@16: template Chris@16: struct has_member_try_lock Chris@16: { Chris@16: typedef char true_type; Chris@16: struct false_type Chris@16: { Chris@16: true_type dummy[2]; Chris@16: }; Chris@16: Chris@16: template Chris@16: static true_type has_member(bool (U::*)()); Chris@16: template Chris@16: static false_type has_member(U); Chris@16: Chris@16: BOOST_STATIC_CONSTANT( Chris@16: bool,value=sizeof(has_member_try_lock::has_member(&T::try_lock))==sizeof(true_type)); Chris@16: }; Chris@16: Chris@16: } Chris@16: Chris@16: template Chris@16: struct is_basic_lockable Chris@16: { Chris@16: BOOST_STATIC_CONSTANT(bool, value = detail::has_member_lock::value && Chris@16: detail::has_member_unlock::value); Chris@16: }; Chris@16: template Chris@16: struct is_lockable Chris@16: { Chris@16: BOOST_STATIC_CONSTANT(bool, value = Chris@16: is_basic_lockable::value && Chris@16: detail::has_member_try_lock::value); Chris@16: }; Chris@16: Chris@16: #else Chris@16: template Chris@16: struct is_basic_lockable Chris@16: { Chris@16: BOOST_STATIC_CONSTANT(bool, value = false); Chris@16: }; Chris@16: template Chris@16: struct is_lockable Chris@16: { Chris@16: BOOST_STATIC_CONSTANT(bool, value = false); Chris@16: }; Chris@16: #endif Chris@16: Chris@16: template Chris@16: struct is_recursive_mutex_sur_parole Chris@16: { Chris@16: BOOST_STATIC_CONSTANT(bool, value = false); Chris@16: }; Chris@16: template Chris@16: struct is_recursive_mutex_sur_parolle : is_recursive_mutex_sur_parole Chris@16: { Chris@16: }; Chris@16: Chris@16: template Chris@16: struct is_recursive_basic_lockable Chris@16: { Chris@16: BOOST_STATIC_CONSTANT(bool, value = is_basic_lockable::value && Chris@16: is_recursive_mutex_sur_parolle::value); Chris@16: }; Chris@16: template Chris@16: struct is_recursive_lockable Chris@16: { Chris@16: BOOST_STATIC_CONSTANT(bool, value = is_lockable::value && Chris@16: is_recursive_mutex_sur_parolle::value); Chris@16: }; Chris@16: } Chris@16: template Chris@16: struct is_mutex_type Chris@16: { Chris@16: BOOST_STATIC_CONSTANT(bool, value = sync::is_lockable::value); Chris@16: }; Chris@16: Chris@16: } Chris@16: #include Chris@16: Chris@16: #endif