// Explicit conversion operators
#define CDS_CXX11_EXPLICIT_CONVERSION_OPERATOR_SUPPORT
-// C++11 template alias
-#define CDS_CXX11_TEMPLATE_ALIAS_SUPPORT
-
// C++11 inline namespace
#define CDS_CXX11_INLINE_NAMESPACE_SUPPORT
#ifndef __CDS_ARH_COMPILER_DEFS_H
#define __CDS_ARH_COMPILER_DEFS_H
+/*
+ Required C++11 features:
+ - template alias [CDS_CXX11_TEMPLATE_ALIAS_SUPPORT]
+*/
+
#if CDS_COMPILER == CDS_COMPILER_MSVC
# include <cds/compiler/vc/defs.h>
#elif CDS_COMPILER == CDS_COMPILER_GCC
#define CDS_NOEXCEPT_SUPPORT_(expr) noexcept(expr)
#define CDS_CONSTEXPR_CONST constexpr const
-// C++11 template alias
-#define CDS_CXX11_TEMPLATE_ALIAS_SUPPORT
-
// C++11 thread_local keyword
#define CDS_CXX11_THREAD_LOCAL_SUPPORT
// Full SFINAE support
-#if CDS_COMPILER_VERSION >= 40700
-# define CDS_CXX11_SFINAE
-#endif
+#define CDS_CXX11_SFINAE
// *************************************************
// Alignment macro
// Variadic template support (ICL 12.1+)
#define CDS_CXX11_VARIADIC_TEMPLATE_SUPPORT 1
-// C++11 template alias
-#define CDS_CXX11_TEMPLATE_ALIAS_SUPPORT
-
// C++11 inline namespace
#define CDS_CXX11_INLINE_NAMESPACE_SUPPORT
// Variadic template support (VC12+)
#define CDS_CXX11_VARIADIC_TEMPLATE_SUPPORT 1
-// C++11 template alias
-#define CDS_CXX11_TEMPLATE_ALIAS_SUPPORT
-
// C++11 inline namespace
//#define CDS_CXX11_INLINE_NAMESPACE_SUPPORT
}
};
-#ifdef CDS_CXX11_TEMPLATE_ALIAS_SUPPORT
template <typename Pred, typename ReturnValue>
using predicate_wrapper = cds::details::binary_functor_wrapper< ReturnValue, Pred, node_type, value_accessor >;
-#else
- template <typename Pred, typename ReturnValue>
- struct predicate_wrapper: public cds::details::binary_functor_wrapper< ReturnValue, Pred, node_type, value_accessor >
- {};
-#endif
struct intrusive_traits: public original_type_traits
{
}
};
-#ifdef CDS_CXX11_TEMPLATE_ALIAS_SUPPORT
template <typename ArgType, typename Predicate, typename Accessor>
using predicate_wrapper = binary_functor_wrapper< bool, Predicate, ArgType, Accessor>;
template <typename ArgType, typename Compare, typename Accessor>
using compare_wrapper = binary_functor_wrapper< int, Compare, ArgType, Accessor>;
-#else
- template <typename ArgType, typename Predicate, typename Accessor>
- struct predicate_wrapper: public binary_functor_wrapper< bool, Predicate, ArgType, Accessor>
- {};
-
- template <typename ArgType, typename Compare, typename Accessor>
- struct compare_wrapper: public binary_functor_wrapper< int, Compare, ArgType, Accessor >
- {};
-#endif
}} // namespace cds::details
/// Native guarded pointer type
typedef gc::hzp::hazard_pointer guarded_pointer;
-#ifdef CDS_CXX11_TEMPLATE_ALIAS_SUPPORT
/// Atomic reference
/**
@headerfile cds/gc/hp.h
@headerfile cds/gc/hp.h
*/
template <typename T> using atomic_type = atomics::atomic<T>;
-#else
- template <typename T>
- class atomic_ref: public atomics::atomic<T *>
- {
- typedef atomics::atomic<T *> base_class;
- public:
-# ifdef CDS_CXX11_EXPLICITLY_DEFAULTED_FUNCTION_SUPPORT
- atomic_ref() = default;
-# else
- atomic_ref()
- : base_class()
- {}
-# endif
- explicit CDS_CONSTEXPR atomic_ref(T * p) CDS_NOEXCEPT
- : base_class( p )
- {}
- };
-
- template <typename T>
- class atomic_type: public atomics::atomic<T>
- {
- typedef atomics::atomic<T> base_class;
- public:
-# ifdef CDS_CXX11_EXPLICITLY_DEFAULTED_FUNCTION_SUPPORT
- atomic_type() = default;
-# else
- atomic_type() CDS_NOEXCEPT
- : base_class()
- {}
-# endif
- explicit CDS_CONSTEXPR atomic_type(T const & v) CDS_NOEXCEPT
- : base_class( v )
- {}
- };
-
- template <typename MarkedPtr>
- class atomic_marked_ptr: public atomics::atomic<MarkedPtr>
- {
- typedef atomics::atomic<MarkedPtr> base_class;
- public:
-# ifdef CDS_CXX11_EXPLICITLY_DEFAULTED_FUNCTION_SUPPORT
- atomic_marked_ptr() CDS_NOEXCEPT_DEFAULTED_( noexcept(base_class()) ) = default;
-# else
- atomic_marked_ptr() CDS_NOEXCEPT_( noexcept(base_class()) )
- : base_class()
- {}
-# endif
- explicit CDS_CONSTEXPR atomic_marked_ptr(MarkedPtr val) CDS_NOEXCEPT_( noexcept(base_class( val )) )
- : base_class( val )
- {}
- explicit CDS_CONSTEXPR atomic_marked_ptr(typename MarkedPtr::value_type * p) CDS_NOEXCEPT_( noexcept(base_class( p )) )
- : base_class( p )
- {}
- };
-#endif
/// Thread GC implementation for internal usage
typedef hzp::ThreadGC thread_gc_impl;
/**
This is wrapper for cds::gc::hzp::details::HPArray class
*/
-#ifdef CDS_CXX11_TEMPLATE_ALIAS_SUPPORT
template <size_t Count> using HPArray = gc::hzp::details::HPArrayT<ContainerNode *, Count >;
-#else
- template <size_t Count>
- class HPArray: public gc::hzp::details::HPArrayT<ContainerNode *, Count>
- {};
-#endif
/// HP record of the thread
/**
};
/// Specialization of HPArrayT class for hazard_pointer type
-#ifdef CDS_CXX11_TEMPLATE_ALIAS_SUPPORT
template <size_t Count> using HPArray = HPArrayT<hazard_pointer, Count >;
-#else
- template <size_t Count>
- class HPArray: public HPArrayT<hazard_pointer, Count>
- {};
-#endif
/// Allocator of hazard pointers for the thread
/**
/// Native guarded pointer type
typedef void * guarded_pointer;
-#ifdef CDS_CXX11_TEMPLATE_ALIAS_SUPPORT
/// Atomic reference
/**
@headerfile cds/gc/ptb.h
@headerfile cds/gc/ptb.h
*/
template <typename MarkedPtr> using atomic_marked_ptr = atomics::atomic<MarkedPtr>;
-#else
- template <typename T>
- class atomic_ref: public atomics::atomic<T *>
- {
- typedef atomics::atomic<T *> base_class;
- public:
-# ifdef CDS_CXX11_EXPLICITLY_DEFAULTED_FUNCTION_SUPPORT
- atomic_ref() = default;
-# else
- atomic_ref()
- : base_class()
- {}
-# endif
- explicit CDS_CONSTEXPR atomic_ref(T * p) CDS_NOEXCEPT
- : base_class( p )
- {}
- };
-
- template <typename T>
- class atomic_type: public atomics::atomic<T>
- {
- typedef atomics::atomic<T> base_class;
- public:
-# ifdef CDS_CXX11_EXPLICITLY_DEFAULTED_FUNCTION_SUPPORT
- atomic_type() = default;
-# else
- atomic_type() CDS_NOEXCEPT
- : base_class()
- {}
-# endif
- explicit CDS_CONSTEXPR atomic_type(T const & v) CDS_NOEXCEPT
- : base_class( v )
- {}
- };
-
- template <typename MarkedPtr>
- class atomic_marked_ptr: public atomics::atomic<MarkedPtr>
- {
- typedef atomics::atomic<MarkedPtr> base_class;
- public:
-# ifdef CDS_CXX11_EXPLICITLY_DEFAULTED_FUNCTION_SUPPORT
- atomic_marked_ptr() = default;
-# else
- atomic_marked_ptr()
- : base_class()
- {}
-# endif
- explicit CDS_CONSTEXPR atomic_marked_ptr(MarkedPtr val) CDS_NOEXCEPT
- : base_class( val )
- {}
- explicit CDS_CONSTEXPR atomic_marked_ptr(typename MarkedPtr::value_type * p) CDS_NOEXCEPT
- : base_class( p )
- {}
- };
-#endif
/// Thread GC implementation for internal usage
typedef ptb::ThreadGC thread_gc_impl;
//@endcond
};
-
-#if defined(CDS_CXX11_TEMPLATE_ALIAS_SUPPORT) && !defined(CDS_DOXYGEN_INVOKED)
- template < typename Node, opt::link_check_type LinkType > using get_link_checker = single_link::get_link_checker< Node, LinkType >;
-#else
/// Metafunction for selecting appropriate link checking policy
- template < typename Node, opt::link_check_type LinkType >
- struct get_link_checker: public single_link::get_link_checker< Node, LinkType >
- {};
-
-#endif
+ template < typename Node, opt::link_check_type LinkType > using get_link_checker = single_link::get_link_checker< Node, LinkType >;
/// Basket queue internal statistics. May be used for debugging or profiling
/**
class gc_common
{
public:
-# ifdef CDS_CXX11_TEMPLATE_ALIAS_SUPPORT
template <typename MarkedPtr> using atomic_marked_ptr = atomics::atomic<MarkedPtr>;
-# else
- template <typename MarkedPtr>
- class atomic_marked_ptr: public atomics::atomic<MarkedPtr>
- {
- typedef atomics::atomic<MarkedPtr> base_class;
- public:
-# ifdef CDS_CXX11_EXPLICITLY_DEFAULTED_FUNCTION_SUPPORT
- atomic_marked_ptr() CDS_NOEXCEPT_DEFAULTED_( noexcept(base_class()) ) = default;
-# else
- atomic_marked_ptr() CDS_NOEXCEPT_( noexcept(base_class()) )
- : base_class()
- {}
-# endif
- explicit CDS_CONSTEXPR atomic_marked_ptr(MarkedPtr val) CDS_NOEXCEPT_( noexcept(base_class( val )) )
- : base_class( val )
- {}
- explicit CDS_CONSTEXPR atomic_marked_ptr(typename MarkedPtr::value_type * p) CDS_NOEXCEPT_( noexcept(base_class( p )) )
- : base_class( p )
- {}
- };
-# endif
};
//@endcond