| 1 | // Licensed to the Apache Software Foundation (ASF) under one |
| 2 | // or more contributor license agreements. See the NOTICE file |
| 3 | // distributed with this work for additional information |
| 4 | // regarding copyright ownership. The ASF licenses this file |
| 5 | // to you under the Apache License, Version 2.0 (the |
| 6 | // "License"); you may not use this file except in compliance |
| 7 | // with the License. You may obtain a copy of the License at |
| 8 | // |
| 9 | // http://www.apache.org/licenses/LICENSE-2.0 |
| 10 | // |
| 11 | // Unless required by applicable law or agreed to in writing, |
| 12 | // software distributed under the License is distributed on an |
| 13 | // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| 14 | // KIND, either express or implied. See the License for the |
| 15 | // specific language governing permissions and limitations |
| 16 | // under the License. |
| 17 | |
| 18 | #ifndef ARROW_UTIL_MACROS_H |
| 19 | #define ARROW_UTIL_MACROS_H |
| 20 | |
| 21 | #define ARROW_STRINGIFY(x) #x |
| 22 | |
| 23 | // From Google gutil |
| 24 | #ifndef ARROW_DISALLOW_COPY_AND_ASSIGN |
| 25 | #define ARROW_DISALLOW_COPY_AND_ASSIGN(TypeName) \ |
| 26 | TypeName(const TypeName&) = delete; \ |
| 27 | void operator=(const TypeName&) = delete |
| 28 | #endif |
| 29 | |
| 30 | #define ARROW_UNUSED(x) (void)x |
| 31 | #define ARROW_ARG_UNUSED(x) |
| 32 | // |
| 33 | // GCC can be told that a certain branch is not likely to be taken (for |
| 34 | // instance, a CHECK failure), and use that information in static analysis. |
| 35 | // Giving it this information can help it optimize for the common case in |
| 36 | // the absence of better information (ie. -fprofile-arcs). |
| 37 | // |
| 38 | #if defined(__GNUC__) |
| 39 | #define ARROW_PREDICT_FALSE(x) (__builtin_expect(x, 0)) |
| 40 | #define ARROW_PREDICT_TRUE(x) (__builtin_expect(!!(x), 1)) |
| 41 | #define ARROW_NORETURN __attribute__((noreturn)) |
| 42 | #define ARROW_PREFETCH(addr) __builtin_prefetch(addr) |
| 43 | #elif defined(_MSC_VER) |
| 44 | #define ARROW_NORETURN __declspec(noreturn) |
| 45 | #define ARROW_PREDICT_FALSE(x) x |
| 46 | #define ARROW_PREDICT_TRUE(x) x |
| 47 | #define ARROW_PREFETCH(addr) |
| 48 | #else |
| 49 | #define ARROW_NORETURN |
| 50 | #define ARROW_PREDICT_FALSE(x) x |
| 51 | #define ARROW_PREDICT_TRUE(x) x |
| 52 | #define ARROW_PREFETCH(addr) |
| 53 | #endif |
| 54 | |
| 55 | #if (defined(__GNUC__) || defined(__APPLE__)) |
| 56 | #define ARROW_MUST_USE_RESULT __attribute__((warn_unused_result)) |
| 57 | #elif defined(_MSC_VER) |
| 58 | #define ARROW_MUST_USE_RESULT |
| 59 | #else |
| 60 | #define ARROW_MUST_USE_RESULT |
| 61 | #endif |
| 62 | |
| 63 | // ---------------------------------------------------------------------- |
| 64 | // C++/CLI support macros (see ARROW-1134) |
| 65 | |
| 66 | #ifndef NULLPTR |
| 67 | |
| 68 | #ifdef __cplusplus_cli |
| 69 | #define NULLPTR __nullptr |
| 70 | #else |
| 71 | #define NULLPTR nullptr |
| 72 | #endif |
| 73 | |
| 74 | #endif // ifndef NULLPTR |
| 75 | |
| 76 | // ---------------------------------------------------------------------- |
| 77 | |
| 78 | // clang-format off |
| 79 | // [[deprecated]] is only available in C++14, use this for the time being |
| 80 | // This macro takes an optional deprecation message |
| 81 | #if __cplusplus <= 201103L |
| 82 | # ifdef __GNUC__ |
| 83 | # define ARROW_DEPRECATED(...) __attribute__((deprecated(__VA_ARGS__))) |
| 84 | # elif defined(_MSC_VER) |
| 85 | # define ARROW_DEPRECATED(...) __declspec(deprecated(__VA_ARGS__)) |
| 86 | # else |
| 87 | # define ARROW_DEPRECATED(...) |
| 88 | # endif |
| 89 | #else |
| 90 | # define ARROW_DEPRECATED(...) [[deprecated(__VA_ARGS__)]] |
| 91 | #endif |
| 92 | |
| 93 | // ---------------------------------------------------------------------- |
| 94 | |
| 95 | // macros to disable padding |
| 96 | // these macros are portable across different compilers and platforms |
| 97 | //[https://github.com/google/flatbuffers/blob/master/include/flatbuffers/flatbuffers.h#L1355] |
| 98 | #if !defined(MANUALLY_ALIGNED_STRUCT) |
| 99 | #if defined(_MSC_VER) |
| 100 | #define MANUALLY_ALIGNED_STRUCT(alignment) \ |
| 101 | __pragma(pack(1)); \ |
| 102 | struct __declspec(align(alignment)) |
| 103 | #define STRUCT_END(name, size) \ |
| 104 | __pragma(pack()); \ |
| 105 | static_assert(sizeof(name) == size, "compiler breaks packing rules") |
| 106 | #elif defined(__GNUC__) || defined(__clang__) |
| 107 | #define MANUALLY_ALIGNED_STRUCT(alignment) \ |
| 108 | _Pragma("pack(1)") struct __attribute__((aligned(alignment))) |
| 109 | #define STRUCT_END(name, size) \ |
| 110 | _Pragma("pack()") static_assert(sizeof(name) == size, "compiler breaks packing rules") |
| 111 | #else |
| 112 | #error Unknown compiler, please define structure alignment macros |
| 113 | #endif |
| 114 | #endif // !defined(MANUALLY_ALIGNED_STRUCT) |
| 115 | |
| 116 | // ---------------------------------------------------------------------- |
| 117 | // Convenience macro disabling a particular UBSan check in a function |
| 118 | |
| 119 | #if defined(__clang__) |
| 120 | #define ARROW_DISABLE_UBSAN(feature) __attribute__((no_sanitize(feature))) |
| 121 | #else |
| 122 | #define ARROW_DISABLE_UBSAN(feature) |
| 123 | #endif |
| 124 | |
| 125 | // ---------------------------------------------------------------------- |
| 126 | // From googletest |
| 127 | // (also in parquet-cpp) |
| 128 | |
| 129 | // When you need to test the private or protected members of a class, |
| 130 | // use the FRIEND_TEST macro to declare your tests as friends of the |
| 131 | // class. For example: |
| 132 | // |
| 133 | // class MyClass { |
| 134 | // private: |
| 135 | // void MyMethod(); |
| 136 | // FRIEND_TEST(MyClassTest, MyMethod); |
| 137 | // }; |
| 138 | // |
| 139 | // class MyClassTest : public testing::Test { |
| 140 | // // ... |
| 141 | // }; |
| 142 | // |
| 143 | // TEST_F(MyClassTest, MyMethod) { |
| 144 | // // Can call MyClass::MyMethod() here. |
| 145 | // } |
| 146 | |
| 147 | #define FRIEND_TEST(test_case_name, test_name) \ |
| 148 | friend class test_case_name##_##test_name##_Test |
| 149 | |
| 150 | #endif // ARROW_UTIL_MACROS_H |
| 151 | |