a9dfc2436ab2e4a4f7084c6542f0c513e36670d3
[libcds.git] / tests / test-hdr / misc / cxx11_convert_memory_order.h
1 //$$CDS-header$$
2
3 // This header should be included AFTER <cds/cxx11_atomic.h> if needed
4
5 namespace misc {
6
7     static inline atomics::memory_order convert_to_store_order( atomics::memory_order order )
8     {
9         switch ( order ) {
10             case atomics::memory_order_acquire:
11             case atomics::memory_order_consume:
12                 return atomics::memory_order_relaxed;
13             case atomics::memory_order_acq_rel:
14                 return atomics::memory_order_release;
15             default:
16                 return order;
17         }
18     }
19
20     static inline atomics::memory_order convert_to_load_order( atomics::memory_order order )
21     {
22         switch ( order ) {
23             case atomics::memory_order_release:
24                 return atomics::memory_order_relaxed;
25             case atomics::memory_order_acq_rel:
26                 return atomics::memory_order_acquire;
27             default:
28                 return order;
29         }
30     }
31
32 #if CDS_COMPILER == CDS_COMPILER_INTEL
33     static inline atomics::memory_order convert_to_exchange_order( atomics::memory_order order )
34     {
35         return order == atomics::memory_order_consume ? atomics::memory_order_relaxed : order;
36     }
37 #else
38     static inline atomics::memory_order convert_to_exchange_order( atomics::memory_order order )
39     {
40         return order;
41     }
42 #endif
43
44     template <typename T, bool Volatile>
45     struct add_volatile;
46
47     template <typename T>
48     struct add_volatile<T, false>
49     {
50         typedef T   type;
51     };
52
53     template <typename T>
54     struct add_volatile<T, true>
55     {
56         typedef T volatile   type;
57     };
58
59 } // namespace misc