| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #ifndef ADAPTER_HH |
| #define ADAPTER_HH |
| |
| #cmakedefine HAS_PREAD |
| #cmakedefine HAS_STRPTIME |
| #cmakedefine HAS_DIAGNOSTIC_PUSH |
| #cmakedefine HAS_DOUBLE_TO_STRING |
| #cmakedefine HAS_INT64_TO_STRING |
| #cmakedefine HAS_PRE_1970 |
| #cmakedefine HAS_POST_2038 |
| #cmakedefine HAS_STD_ISNAN |
| #cmakedefine HAS_BUILTIN_OVERFLOW_CHECK |
| #cmakedefine NEEDS_Z_PREFIX |
| |
| #include "orc/orc-config.hh" |
| #include <string> |
| |
| #ifdef _MSC_VER |
| #include <BaseTsd.h> |
| typedef SSIZE_T ssize_t; |
| #define timegm(tm) _mkgmtime(tm) |
| #define gmtime_r(timep, result) (gmtime_s(result, timep) ? NULL : result) |
| #define asctime_r(tm, buf) (asctime_s(buf, 26, tm) ? NULL : buf) |
| #endif |
| |
| #ifndef HAS_STRPTIME |
| char* strptime(const char* buf, const char* format, struct tm* tm); |
| #endif |
| |
| #ifndef HAS_PREAD |
| ssize_t pread(int fd, void* buf, size_t count, off_t offset); |
| #endif |
| |
| #ifdef HAS_DIAGNOSTIC_PUSH |
| #ifdef __clang__ |
| #define DIAGNOSTIC_PUSH _Pragma("clang diagnostic push") |
| #define DIAGNOSTIC_POP _Pragma("clang diagnostic pop") |
| #elif defined(__GNUC__) |
| #define DIAGNOSTIC_PUSH _Pragma("GCC diagnostic push") |
| #define DIAGNOSTIC_POP _Pragma("GCC diagnostic pop") |
| #elif defined(_MSC_VER) |
| #define DIAGNOSTIC_PUSH __pragma(warning(push)) |
| #define DIAGNOSTIC_POP __pragma(warning(pop)) |
| #else |
| #error("Unknown compiler") |
| #endif |
| #else |
| #define DIAGNOSTIC_PUSH |
| #define DIAGNOSTIC_POP |
| #endif |
| |
| #define PRAGMA(TXT) _Pragma(#TXT) |
| |
| #ifdef __clang__ |
| #define DIAGNOSTIC_IGNORE(XXX) PRAGMA(clang diagnostic ignored XXX) |
| #elif defined(__GNUC__) |
| #define DIAGNOSTIC_IGNORE(XXX) PRAGMA(GCC diagnostic ignored XXX) |
| #elif defined(_MSC_VER) |
| #define DIAGNOSTIC_IGNORE(XXX) __pragma(warning(disable : XXX)) |
| #else |
| #define DIAGNOSTIC_IGNORE(XXX) |
| #endif |
| |
| #ifndef UINT32_MAX |
| #define UINT32_MAX 0xffffffff |
| #endif |
| |
| #ifndef INT64_MAX |
| #define INT64_MAX 0x7fffffffffffffff |
| #endif |
| |
| #ifndef INT64_MIN |
| #define INT64_MIN (-0x7fffffffffffffff - 1) |
| #endif |
| |
| #define GTEST_LANG_CXX11 0 |
| |
| #ifndef HAS_STD_ISNAN |
| #include <math.h> |
| #define std::isnan(XXX) isnan(XXX) |
| #else |
| #include <cmath> |
| #endif |
| |
| #include <mutex> |
| |
| #ifdef NEEDS_Z_PREFIX |
| #define Z_PREFIX 1 |
| #endif |
| |
| namespace orc { |
| std::string to_string(double val); |
| std::string to_string(int64_t val); |
| } |
| |
| #ifdef HAS_BUILTIN_OVERFLOW_CHECK |
| #define multiplyExact !__builtin_mul_overflow |
| #define addExact !__builtin_add_overflow |
| #else |
| namespace orc { |
| /** |
| * Compute value * repetitions, return false if overflow, return true otherwise |
| * and save the result at the address pointed to by result |
| * imitates the jdk Math.multiplyExact implementation |
| * but this method makes the assumption that repetitions > 1 |
| */ |
| static bool multiplyExact(int64_t value, int64_t repetitions, int64_t* result) { |
| int64_t r = value * repetitions; |
| if (((value < 0 ? -value : value) | repetitions) >> 31 != 0 && r / repetitions != value) { |
| return false; |
| } |
| *result = r; |
| return true; |
| } |
| |
| /** |
| * imitates the jdk Math.addExact implementation |
| */ |
| static bool addExact(int64_t sum, int64_t increment, int64_t* result) { |
| int64_t r = sum + increment; |
| if (((sum ^ r) & (increment ^ r)) < 0) { |
| return false; |
| } |
| *result = r; |
| return true; |
| } |
| } |
| #endif |
| |
| #endif /* ADAPTER_HH */ |