Remove pre-C++11 compat macros from concurrentqueue.

This commit is contained in:
Bartosz Taudul 2020-10-29 23:05:24 +01:00
parent 0c48956410
commit e2515c6a99

View File

@ -62,38 +62,6 @@
namespace tracy namespace tracy
{ {
#ifndef MOODYCAMEL_NOEXCEPT
#if !defined(MOODYCAMEL_EXCEPTIONS_ENABLED)
#define MOODYCAMEL_NOEXCEPT
#define MOODYCAMEL_NOEXCEPT_CTOR(type, valueType, expr) true
#define MOODYCAMEL_NOEXCEPT_ASSIGN(type, valueType, expr) true
#elif defined(_MSC_VER) && defined(_NOEXCEPT) && _MSC_VER < 1800
// VS2012's std::is_nothrow_[move_]constructible is broken and returns true when it shouldn't :-(
// We have to assume *all* non-trivial constructors may throw on VS2012!
#define MOODYCAMEL_NOEXCEPT _NOEXCEPT
#define MOODYCAMEL_NOEXCEPT_CTOR(type, valueType, expr) (std::is_rvalue_reference<valueType>::value && std::is_move_constructible<type>::value ? std::is_trivially_move_constructible<type>::value : std::is_trivially_copy_constructible<type>::value)
#define MOODYCAMEL_NOEXCEPT_ASSIGN(type, valueType, expr) ((std::is_rvalue_reference<valueType>::value && std::is_move_assignable<type>::value ? std::is_trivially_move_assignable<type>::value || std::is_nothrow_move_assignable<type>::value : std::is_trivially_copy_assignable<type>::value || std::is_nothrow_copy_assignable<type>::value) && MOODYCAMEL_NOEXCEPT_CTOR(type, valueType, expr))
#elif defined(_MSC_VER) && defined(_NOEXCEPT) && _MSC_VER < 1900
#define MOODYCAMEL_NOEXCEPT _NOEXCEPT
#define MOODYCAMEL_NOEXCEPT_CTOR(type, valueType, expr) (std::is_rvalue_reference<valueType>::value && std::is_move_constructible<type>::value ? std::is_trivially_move_constructible<type>::value || std::is_nothrow_move_constructible<type>::value : std::is_trivially_copy_constructible<type>::value || std::is_nothrow_copy_constructible<type>::value)
#define MOODYCAMEL_NOEXCEPT_ASSIGN(type, valueType, expr) ((std::is_rvalue_reference<valueType>::value && std::is_move_assignable<type>::value ? std::is_trivially_move_assignable<type>::value || std::is_nothrow_move_assignable<type>::value : std::is_trivially_copy_assignable<type>::value || std::is_nothrow_copy_assignable<type>::value) && MOODYCAMEL_NOEXCEPT_CTOR(type, valueType, expr))
#else
#define MOODYCAMEL_NOEXCEPT noexcept
#define MOODYCAMEL_NOEXCEPT_CTOR(type, valueType, expr) noexcept(expr)
#define MOODYCAMEL_NOEXCEPT_ASSIGN(type, valueType, expr) noexcept(expr)
#endif
#endif
// VS2012 doesn't support deleted functions.
// In this case, we declare the function normally but don't define it. A link error will be generated if the function is called.
#ifndef MOODYCAMEL_DELETE_FUNCTION
#if defined(_MSC_VER) && _MSC_VER < 1800
#define MOODYCAMEL_DELETE_FUNCTION
#else
#define MOODYCAMEL_DELETE_FUNCTION = delete
#endif
#endif
// Compiler-specific likely/unlikely hints // Compiler-specific likely/unlikely hints
namespace moodycamel { namespace details { namespace moodycamel { namespace details {
#if defined(__GNUC__) #if defined(__GNUC__)
@ -316,7 +284,7 @@ namespace details
}; };
template<typename It> template<typename It>
static inline auto deref_noexcept(It& it) MOODYCAMEL_NOEXCEPT -> decltype(*it) static inline auto deref_noexcept(It& it) noexcept -> decltype(*it)
{ {
return *it; return *it;
} }
@ -344,7 +312,7 @@ struct ProducerToken
template<typename T, typename Traits> template<typename T, typename Traits>
explicit ProducerToken(ConcurrentQueue<T, Traits>& queue); explicit ProducerToken(ConcurrentQueue<T, Traits>& queue);
ProducerToken(ProducerToken&& other) MOODYCAMEL_NOEXCEPT ProducerToken(ProducerToken&& other) noexcept
: producer(other.producer) : producer(other.producer)
{ {
other.producer = nullptr; other.producer = nullptr;
@ -353,13 +321,13 @@ struct ProducerToken
} }
} }
inline ProducerToken& operator=(ProducerToken&& other) MOODYCAMEL_NOEXCEPT inline ProducerToken& operator=(ProducerToken&& other) noexcept
{ {
swap(other); swap(other);
return *this; return *this;
} }
void swap(ProducerToken& other) MOODYCAMEL_NOEXCEPT void swap(ProducerToken& other) noexcept
{ {
std::swap(producer, other.producer); std::swap(producer, other.producer);
if (producer != nullptr) { if (producer != nullptr) {
@ -389,8 +357,8 @@ struct ProducerToken
} }
// Disable copying and assignment // Disable copying and assignment
ProducerToken(ProducerToken const&) MOODYCAMEL_DELETE_FUNCTION; ProducerToken(ProducerToken const&) = delete;
ProducerToken& operator=(ProducerToken const&) MOODYCAMEL_DELETE_FUNCTION; ProducerToken& operator=(ProducerToken const&) = delete;
private: private:
template<typename T, typename Traits> friend class ConcurrentQueue; template<typename T, typename Traits> friend class ConcurrentQueue;
@ -405,18 +373,18 @@ struct ConsumerToken
template<typename T, typename Traits> template<typename T, typename Traits>
explicit ConsumerToken(ConcurrentQueue<T, Traits>& q); explicit ConsumerToken(ConcurrentQueue<T, Traits>& q);
ConsumerToken(ConsumerToken&& other) MOODYCAMEL_NOEXCEPT ConsumerToken(ConsumerToken&& other) noexcept
: initialOffset(other.initialOffset), lastKnownGlobalOffset(other.lastKnownGlobalOffset), itemsConsumedFromCurrent(other.itemsConsumedFromCurrent), currentProducer(other.currentProducer), desiredProducer(other.desiredProducer) : initialOffset(other.initialOffset), lastKnownGlobalOffset(other.lastKnownGlobalOffset), itemsConsumedFromCurrent(other.itemsConsumedFromCurrent), currentProducer(other.currentProducer), desiredProducer(other.desiredProducer)
{ {
} }
inline ConsumerToken& operator=(ConsumerToken&& other) MOODYCAMEL_NOEXCEPT inline ConsumerToken& operator=(ConsumerToken&& other) noexcept
{ {
swap(other); swap(other);
return *this; return *this;
} }
void swap(ConsumerToken& other) MOODYCAMEL_NOEXCEPT void swap(ConsumerToken& other) noexcept
{ {
std::swap(initialOffset, other.initialOffset); std::swap(initialOffset, other.initialOffset);
std::swap(lastKnownGlobalOffset, other.lastKnownGlobalOffset); std::swap(lastKnownGlobalOffset, other.lastKnownGlobalOffset);
@ -426,8 +394,8 @@ struct ConsumerToken
} }
// Disable copying and assignment // Disable copying and assignment
ConsumerToken(ConsumerToken const&) MOODYCAMEL_DELETE_FUNCTION; ConsumerToken(ConsumerToken const&) = delete;
ConsumerToken& operator=(ConsumerToken const&) MOODYCAMEL_DELETE_FUNCTION; ConsumerToken& operator=(ConsumerToken const&) = delete;
private: private:
template<typename T, typename Traits> friend class ConcurrentQueue; template<typename T, typename Traits> friend class ConcurrentQueue;
@ -540,10 +508,10 @@ public:
} }
// Disable copying and copy assignment // Disable copying and copy assignment
ConcurrentQueue(ConcurrentQueue const&) MOODYCAMEL_DELETE_FUNCTION; ConcurrentQueue(ConcurrentQueue const&) = delete;
ConcurrentQueue(ConcurrentQueue&& other) MOODYCAMEL_DELETE_FUNCTION; ConcurrentQueue(ConcurrentQueue&& other) = delete;
ConcurrentQueue& operator=(ConcurrentQueue const&) MOODYCAMEL_DELETE_FUNCTION; ConcurrentQueue& operator=(ConcurrentQueue const&) = delete;
ConcurrentQueue& operator=(ConcurrentQueue&& other) MOODYCAMEL_DELETE_FUNCTION; ConcurrentQueue& operator=(ConcurrentQueue&& other) = delete;
public: public:
tracy_force_inline T* enqueue_begin(producer_token_t const& token, index_t& currentTailIndex) tracy_force_inline T* enqueue_begin(producer_token_t const& token, index_t& currentTailIndex)
@ -697,8 +665,8 @@ private:
FreeList(FreeList&& other) : freeListHead(other.freeListHead.load(std::memory_order_relaxed)) { other.freeListHead.store(nullptr, std::memory_order_relaxed); } FreeList(FreeList&& other) : freeListHead(other.freeListHead.load(std::memory_order_relaxed)) { other.freeListHead.store(nullptr, std::memory_order_relaxed); }
void swap(FreeList& other) { details::swap_relaxed(freeListHead, other.freeListHead); } void swap(FreeList& other) { details::swap_relaxed(freeListHead, other.freeListHead); }
FreeList(FreeList const&) MOODYCAMEL_DELETE_FUNCTION; FreeList(FreeList const&) = delete;
FreeList& operator=(FreeList const&) MOODYCAMEL_DELETE_FUNCTION; FreeList& operator=(FreeList const&) = delete;
inline void add(N* node) inline void add(N* node)
{ {
@ -887,8 +855,8 @@ private:
} }
} }
inline T* operator[](index_t idx) MOODYCAMEL_NOEXCEPT { return static_cast<T*>(static_cast<void*>(elements)) + static_cast<size_t>(idx & static_cast<index_t>(BLOCK_SIZE - 1)); } inline T* operator[](index_t idx) noexcept { return static_cast<T*>(static_cast<void*>(elements)) + static_cast<size_t>(idx & static_cast<index_t>(BLOCK_SIZE - 1)); }
inline T const* operator[](index_t idx) const MOODYCAMEL_NOEXCEPT { return static_cast<T const*>(static_cast<void const*>(elements)) + static_cast<size_t>(idx & static_cast<index_t>(BLOCK_SIZE - 1)); } inline T const* operator[](index_t idx) const noexcept { return static_cast<T const*>(static_cast<void const*>(elements)) + static_cast<size_t>(idx & static_cast<index_t>(BLOCK_SIZE - 1)); }
private: private:
// IMPORTANT: This must be the first member in Block, so that if T depends on the alignment of // IMPORTANT: This must be the first member in Block, so that if T depends on the alignment of
@ -1454,17 +1422,17 @@ ConsumerToken::ConsumerToken(ConcurrentQueue<T, Traits>& queue)
} }
template<typename T, typename Traits> template<typename T, typename Traits>
inline void swap(ConcurrentQueue<T, Traits>& a, ConcurrentQueue<T, Traits>& b) MOODYCAMEL_NOEXCEPT inline void swap(ConcurrentQueue<T, Traits>& a, ConcurrentQueue<T, Traits>& b) noexcept
{ {
a.swap(b); a.swap(b);
} }
inline void swap(ProducerToken& a, ProducerToken& b) MOODYCAMEL_NOEXCEPT inline void swap(ProducerToken& a, ProducerToken& b) noexcept
{ {
a.swap(b); a.swap(b);
} }
inline void swap(ConsumerToken& a, ConsumerToken& b) MOODYCAMEL_NOEXCEPT inline void swap(ConsumerToken& a, ConsumerToken& b) noexcept
{ {
a.swap(b); a.swap(b);
} }