Nugget
atomic_macros_base.h
1 // Copyright (c) Electronic Arts Inc. All rights reserved.
4 
5 
6 #ifndef EASTL_ATOMIC_INTERNAL_MACROS_BASE_H
7 #define EASTL_ATOMIC_INTERNAL_MACROS_BASE_H
8 
9 #if defined(EA_PRAGMA_ONCE_SUPPORTED)
10  #pragma once
11 #endif
12 
13 
14 #define EASTL_ATOMIC_INTERNAL_COMPILER_AVAILABLE(op) \
15  EA_PREPROCESSOR_JOIN(EA_PREPROCESSOR_JOIN(EASTL_COMPILER_, op), _AVAILABLE)
16 
17 #define EASTL_ATOMIC_INTERNAL_ARCH_AVAILABLE(op) \
18  EA_PREPROCESSOR_JOIN(EA_PREPROCESSOR_JOIN(EASTL_ARCH_, op), _AVAILABLE)
19 
20 #define EASTL_ATOMIC_INTERNAL_NOT_IMPLEMENTED_ERROR(...) \
21  static_assert(false, "eastl::atomic<T> atomic macro not implemented!")
22 
23 
24 /* Compiler && Arch Not Implemented */
25 #define EASTL_ATOMIC_INTERNAL_OP_PATTERN_00(op) \
26  EASTL_ATOMIC_INTERNAL_NOT_IMPLEMENTED_ERROR
27 
28 /* Arch Implemented */
29 #define EASTL_ATOMIC_INTERNAL_OP_PATTERN_01(op) \
30  EA_PREPROCESSOR_JOIN(EASTL_ARCH_, op)
31 
32 /* Compiler Implmented */
33 #define EASTL_ATOMIC_INTERNAL_OP_PATTERN_10(op) \
34  EA_PREPROCESSOR_JOIN(EASTL_COMPILER_, op)
35 
36 /* Compiler && Arch Implemented */
37 #define EASTL_ATOMIC_INTERNAL_OP_PATTERN_11(op) \
38  EA_PREPROCESSOR_JOIN(EASTL_ARCH_, op)
39 
40 
41 /* This macro creates the pattern macros above for the 2x2 True-False truth table */
42 #define EASTL_ATOMIC_INTERNAL_OP_HELPER1(compiler, arch, op) \
43  EA_PREPROCESSOR_JOIN(EASTL_ATOMIC_INTERNAL_OP_PATTERN_, EA_PREPROCESSOR_JOIN(compiler, arch))(op)
44 
45 
47 //
48 // EASTL_ATOMIC_CHOOSE_OP_IMPL
49 //
50 // This macro chooses between the compiler or architecture implementation for a
51 // given atomic operation.
52 //
53 // USAGE:
54 //
55 // EASTL_ATOMIC_CHOOSE_OP_IMPL(ATOMIC_FETCH_ADD_RELAXED_8)(ret, ptr, val)
56 //
57 #define EASTL_ATOMIC_CHOOSE_OP_IMPL(op) \
58  EASTL_ATOMIC_INTERNAL_OP_HELPER1( \
59  EASTL_ATOMIC_INTERNAL_COMPILER_AVAILABLE(op), \
60  EASTL_ATOMIC_INTERNAL_ARCH_AVAILABLE(op), \
61  op \
62  )
63 
64 
65 #endif /* EASTL_ATOMIC_INTERNAL_MACROS_BASE_H */