Ticket #10349: atomic_enum.patch

File atomic_enum.patch, 7.5 KB (added by ingo.loehken@…, 8 years ago)

patch for enum specialization to atomic

  • boost/atomic/detail/atomic_template.hpp

    # HG changeset patch
    # User iloehken
    # Date 1407854747 -7200
    #      Tue Aug 12 16:45:47 2014 +0200
    # Branch 1.56
    # Node ID 1a6edcfda31d5c14b218d8ee9d5eadc7cb016148
    # Parent  43ef1037b73e427d5193ef04c83e7b358c2d266f
    [boost] atomic : added facet to handle enums atomic as ints
    
    diff -r 43ef1037b73e -r 1a6edcfda31d boost/atomic/detail/atomic_template.hpp
    a b  
    2121#include <boost/assert.hpp>
    2222#include <boost/type_traits/is_signed.hpp>
    2323#include <boost/type_traits/is_integral.hpp>
     24#include <boost/type_traits/is_enum.hpp>
    2425#include <boost/atomic/detail/config.hpp>
    2526#include <boost/atomic/detail/casts.hpp>
    2627#include <boost/atomic/detail/operations_fwd.hpp>
     
    5657    return (failure_order & 15u) <= (success_order & 15u);
    5758}
    5859
    59 template< typename T, bool IsInt = boost::is_integral< T >::value >
    60 struct classify
     60struct integral_type;
     61struct enum_type;
     62struct user_defined_type;
     63struct pointer_type;
     64
     65template <typename T, bool bIsInt = boost::is_integral<T>::value>
     66struct classify_integral_or_other
    6167{
    62     typedef void type;
     68  typedef user_defined_type type;
    6369};
    6470
    6571template< typename T >
    66 struct classify< T, true > { typedef int type; };
     72struct classify_integral_or_other<T,true>
     73{
     74  typedef integral_type type;
     75};
    6776
    6877template< typename T >
    69 struct classify< T*, false > { typedef void* type; };
     78struct classify_integral_or_other<T*,false>
     79{
     80  typedef pointer_type type;
     81};
    7082
    71 template< typename T, typename Kind >
     83template <typename T, bool bIsEnum = boost::is_enum<T>::value>
     84struct classify_enum_or_other
     85{
     86  typedef enum_type type;
     87};
     88
     89template <typename T>
     90struct classify_enum_or_other<T,false>
     91  : public classify_integral_or_other<T>
     92{};
     93
     94template <typename T>
     95struct classify
     96  : public classify_enum_or_other<T>
     97{};
     98
     99
     100template <typename T, typename Kind>
    72101class base_atomic;
    73102
     103
     104
     105//! Implementation for enums ---> store as int
     106template <typename T>
     107class base_atomic<T,enum_type>
     108{
     109private:
     110    typedef T value_type;
     111    typedef T difference_type;
     112    typedef atomics::detail::operations< storage_size_of<int >::value, boost::is_signed<int >::value > operations;
     113
     114protected:
     115    typedef value_type value_arg_type;
     116
     117public:
     118    typedef typename operations::storage_type storage_type;
     119
     120protected:
     121    storage_type m_storage;
     122
     123public:
     124    BOOST_DEFAULTED_FUNCTION(base_atomic(), {})
     125    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : m_storage(v) {}
     126
     127    BOOST_FORCEINLINE void store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
     128    {
     129        BOOST_ASSERT(order != memory_order_consume);
     130        BOOST_ASSERT(order != memory_order_acquire);
     131        BOOST_ASSERT(order != memory_order_acq_rel);
     132
     133        operations::store(m_storage, static_cast< storage_type >(v), order);
     134    }
     135
     136    BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
     137    {
     138        BOOST_ASSERT(order != memory_order_release);
     139        BOOST_ASSERT(order != memory_order_acq_rel);
     140
     141        return static_cast< value_type >(operations::load(m_storage, order));
     142    }
     143
     144    BOOST_FORCEINLINE value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
     145    {
     146        return static_cast< value_type >(operations::exchange(m_storage, static_cast< storage_type >(v), order));
     147    }
     148
     149    BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT
     150    {
     151        BOOST_ASSERT(failure_order != memory_order_release);
     152        BOOST_ASSERT(failure_order != memory_order_acq_rel);
     153        BOOST_ASSERT(cas_failure_order_must_not_be_stronger_than_success_order(success_order, failure_order));
     154
     155        storage_type old_value = static_cast< storage_type >(expected);
     156        const bool res = operations::compare_exchange_strong(m_storage, old_value, static_cast< storage_type >(desired), success_order, failure_order);
     157        expected = static_cast< value_type >(old_value);
     158        return res;
     159    }
     160
     161    BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
     162    {
     163        return compare_exchange_strong(expected, desired, order, atomics::detail::deduce_failure_order(order));
     164    }
     165
     166    BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT
     167    {
     168        BOOST_ASSERT(failure_order != memory_order_release);
     169        BOOST_ASSERT(failure_order != memory_order_acq_rel);
     170        BOOST_ASSERT(cas_failure_order_must_not_be_stronger_than_success_order(success_order, failure_order));
     171
     172        storage_type old_value = static_cast< storage_type >(expected);
     173        const bool res = operations::compare_exchange_weak(m_storage, old_value, static_cast< storage_type >(desired), success_order, failure_order);
     174        expected = static_cast< value_type >(old_value);
     175        return res;
     176    }
     177
     178    BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
     179    {
     180        return compare_exchange_weak(expected, desired, order, atomics::detail::deduce_failure_order(order));
     181    }
     182
     183    BOOST_FORCEINLINE bool is_lock_free() const volatile BOOST_NOEXCEPT
     184    {
     185        return operations::is_lock_free(m_storage);
     186    }
     187
     188    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
     189    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
     190};
     191
     192
     193
    74194//! Implementation for integers
    75 template< typename T >
    76 class base_atomic< T, int >
     195template <typename T>
     196class base_atomic<T,integral_type>
    77197{
    78198private:
    79199    typedef T value_type;
     
    228348    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
    229349};
    230350
     351
     352
    231353//! Implementation for bool
    232354template< >
    233 class base_atomic< bool, int >
     355class base_atomic<bool,integral_type>
    234356{
    235357private:
    236358    typedef bool value_type;
     
    315437};
    316438
    317439
    318 //! Implementation for user-defined types, such as structs and enums
    319 template< typename T >
    320 class base_atomic< T, void >
     440
     441//! Implementation for user-defined types, such as structs
     442template <typename T>
     443class base_atomic<T,user_defined_type>
    321444{
    322445private:
    323446    typedef T value_type;
     
    403526};
    404527
    405528
     529
    406530//! Implementation for pointers
    407 template< typename T >
    408 class base_atomic< T*, void* >
     531template <typename T>
     532class base_atomic<T*,pointer_type>
    409533{
    410534private:
    411535    typedef T* value_type;
     
    533657};
    534658
    535659
     660
    536661//! Implementation for void pointers
    537 template< >
    538 class base_atomic< void*, void* >
     662template <>
     663class base_atomic<void*,pointer_type>
    539664{
    540665private:
    541666    typedef void* value_type;
     
    664789
    665790} // namespace detail
    666791
    667 template< typename T >
     792
     793
     794template <typename T>
    668795class atomic :
    669     public atomics::detail::base_atomic< T, typename atomics::detail::classify< T >::type >
     796  public atomics::detail::base_atomic<T,typename atomics::detail::classify<T>::type>
    670797{
    671798private:
    672799    typedef T value_type;