1// Copyright 2020 The Pigweed Authors 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); you may not 4// use this file except in compliance with the License. You may obtain a copy of 5// the License at 6// 7// https://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 11// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 12// License for the specific language governing permissions and limitations under 13// the License. 14#pragma once 15 16#include <math.h> 17 18#include "pw_polyfill/standard_library/namespace.h" 19 20_PW_POLYFILL_BEGIN_NAMESPACE_STD 21 22// The integer overloads of these functions are not provided. 23 24// This is not technically correct, but avoids ambiguous calls to an overloaded 25// abs function. 26template <typename T> 27inline T abs(T value) { 28 return value < 0 ? -value : value; 29} 30 31#ifdef isfinite 32#undef isfinite 33#endif // isfinite 34 35inline bool isfinite(float value) { return __builtin_isfinite(value); } 36inline bool isfinite(double value) { return __builtin_isfinite(value); } 37inline bool isfinite(long double value) { return __builtin_isfinite(value); } 38 39#ifdef isnan 40#undef isnan 41#endif // isnan 42 43inline bool isnan(float value) { return __builtin_isnan(value); } 44inline bool isnan(double value) { return __builtin_isnan(value); } 45inline bool isnan(long double value) { return __builtin_isnan(value); } 46 47#ifdef signbit 48#undef signbit 49#endif // signbit 50 51inline bool signbit(float value) { return __builtin_signbit(value); } 52inline bool signbit(double value) { return __builtin_signbit(value); } 53inline bool signbit(long double value) { return __builtin_signbit(value); } 54 55using ::round; 56 57_PW_POLYFILL_END_NAMESPACE_STD 58