1 /* 2 * Copyright 2016-present Facebook, Inc. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #pragma once 18 19 #include <cmath> 20 21 namespace folly { 22 23 #ifndef __ANDROID__ 24 25 /** 26 * Most platforms hopefully provide std::nextafter. 27 */ 28 29 /* using override */ using std::nextafter; 30 31 #else // !__ANDROID__ 32 33 /** 34 * On Android, std::nextafter isn't implemented. However, the C functions and 35 * compiler builtins are still provided. Using the GCC builtin is actually 36 * slightly faster, as they're constexpr and the use cases within folly are in 37 * constexpr context. 38 */ 39 40 #if defined(__GNUC__) && !defined(__clang__) 41 42 constexpr float nextafter(float x, float y) { 43 return __builtin_nextafterf(x, y); 44 } 45 46 constexpr double nextafter(double x, double y) { 47 return __builtin_nextafter(x, y); 48 } 49 50 constexpr long double nextafter(long double x, long double y) { 51 return __builtin_nextafterl(x, y); 52 } 53 54 #else // __GNUC__ 55 56 inline float nextafter(float x, float y) { 57 return ::nextafterf(x, y); 58 } 59 60 inline double nextafter(double x, double y) { 61 return ::nextafter(x, y); 62 } 63 64 inline long double nextafter(long double x, long double y) { 65 return ::nextafterl(x, y); 66 } 67 68 #endif // __GNUC__ 69 70 #endif // __ANDROID__ 71 } // namespace folly 72