WPILibC++ 2023.4.3-108-ge5452e3
MathExtras.h File Reference
#include "wpi/Compiler.h"
#include <cassert>
#include <climits>
#include <cmath>
#include <cstdint>
#include <cstring>
#include <limits>
#include <type_traits>

Go to the source code of this file.

Classes

struct  wpi::detail::TrailingZerosCounter< T, SizeOfT >
 
struct  wpi::detail::LeadingZerosCounter< T, SizeOfT >
 
struct  wpi::detail::PopulationCounter< T, SizeOfT >
 
struct  wpi::detail::PopulationCounter< T, 8 >
 

Namespaces

namespace  wpi
 
namespace  wpi::detail
 detail namespace with internal helper functions
 

Macros

#define R2(n)   n, n + 2 * 64, n + 1 * 64, n + 3 * 64
 
#define R4(n)   R2(n), R2(n + 2 * 16), R2(n + 1 * 16), R2(n + 3 * 16)
 
#define R6(n)   R4(n), R4(n + 2 * 4), R4(n + 1 * 4), R4(n + 3 * 4)
 

Enumerations

enum  wpi::ZeroBehavior { wpi::ZB_Undefined , wpi::ZB_Max , wpi::ZB_Width }
 The behavior an operation has on an input of 0. More...
 

Functions

template<typename T >
unsigned wpi::countTrailingZeros (T Val, ZeroBehavior ZB=ZB_Width)
 Count number of 0's from the least significant bit to the most stopping at the first 1. More...
 
template<typename T >
unsigned wpi::countLeadingZeros (T Val, ZeroBehavior ZB=ZB_Width)
 Count number of 0's from the most significant bit to the least stopping at the first 1. More...
 
template<typename T >
wpi::findFirstSet (T Val, ZeroBehavior ZB=ZB_Max)
 Get the index of the first set bit starting from the least significant bit. More...
 
template<typename T >
wpi::maskTrailingOnes (unsigned N)
 Create a bitmask with the N right-most bits set to 1, and all other bits set to 0. More...
 
template<typename T >
wpi::maskLeadingOnes (unsigned N)
 Create a bitmask with the N left-most bits set to 1, and all other bits set to 0. More...
 
template<typename T >
wpi::maskTrailingZeros (unsigned N)
 Create a bitmask with the N right-most bits set to 0, and all other bits set to 1. More...
 
template<typename T >
wpi::maskLeadingZeros (unsigned N)
 Create a bitmask with the N left-most bits set to 0, and all other bits set to 1. More...
 
template<typename T >
wpi::findLastSet (T Val, ZeroBehavior ZB=ZB_Max)
 Get the index of the last set bit starting from the least significant bit. More...
 
template<typename T >
wpi::reverseBits (T Val)
 Reverse the bits in Val. More...
 
constexpr uint32_t wpi::Hi_32 (uint64_t Value)
 Return the high 32 bits of a 64 bit value. More...
 
constexpr uint32_t wpi::Lo_32 (uint64_t Value)
 Return the low 32 bits of a 64 bit value. More...
 
constexpr uint64_t wpi::Make_64 (uint32_t High, uint32_t Low)
 Make a 64-bit integer from a high / low pair of 32-bit integers. More...
 
template<unsigned N>
constexpr bool wpi::isInt (int64_t x)
 Checks if an integer fits into the given bit width. More...
 
template<>
constexpr bool wpi::isInt< 8 > (int64_t x)
 
template<>
constexpr bool wpi::isInt< 16 > (int64_t x)
 
template<>
constexpr bool wpi::isInt< 32 > (int64_t x)
 
template<unsigned N, unsigned S>
constexpr bool wpi::isShiftedInt (int64_t x)
 Checks if a signed integer is an N bit number shifted left by S. More...
 
template<unsigned N>
constexpr std::enable_if_t<(N< 64), bool > wpi::isUInt (uint64_t X)
 Checks if an unsigned integer fits into the given bit width. More...
 
constexpr bool wpi::isUInt (uint64_t)
 
template<>
constexpr bool wpi::isUInt< 8 > (uint64_t x)
 
template<>
constexpr bool wpi::isUInt< 16 > (uint64_t x)
 
template<>
constexpr bool wpi::isUInt< 32 > (uint64_t x)
 
template<unsigned N, unsigned S>
constexpr bool wpi::isShiftedUInt (uint64_t x)
 Checks if a unsigned integer is an N bit number shifted left by S. More...
 
uint64_t wpi::maxUIntN (uint64_t N)
 Gets the maximum value for a N-bit unsigned integer. More...
 
int64_t wpi::minIntN (int64_t N)
 Gets the minimum value for a N-bit signed integer. More...
 
int64_t wpi::maxIntN (int64_t N)
 Gets the maximum value for a N-bit signed integer. More...
 
bool wpi::isUIntN (unsigned N, uint64_t x)
 Checks if an unsigned integer fits into the given (dynamic) bit width. More...
 
bool wpi::isIntN (unsigned N, int64_t x)
 Checks if an signed integer fits into the given (dynamic) bit width. More...
 
constexpr bool wpi::isMask_32 (uint32_t Value)
 Return true if the argument is a non-empty sequence of ones starting at the least significant bit with the remainder zero (32 bit version). More...
 
constexpr bool wpi::isMask_64 (uint64_t Value)
 Return true if the argument is a non-empty sequence of ones starting at the least significant bit with the remainder zero (64 bit version). More...
 
constexpr bool wpi::isShiftedMask_32 (uint32_t Value)
 Return true if the argument contains a non-empty sequence of ones with the remainder zero (32 bit version.) Ex. More...
 
constexpr bool wpi::isShiftedMask_64 (uint64_t Value)
 Return true if the argument contains a non-empty sequence of ones with the remainder zero (64 bit version.) More...
 
constexpr bool wpi::isPowerOf2_32 (uint32_t Value)
 Return true if the argument is a power of two > 0. More...
 
constexpr bool wpi::isPowerOf2_64 (uint64_t Value)
 Return true if the argument is a power of two > 0 (64 bit edition.) More...
 
template<typename T >
unsigned wpi::countLeadingOnes (T Value, ZeroBehavior ZB=ZB_Width)
 Count the number of ones from the most significant bit to the first zero bit. More...
 
template<typename T >
unsigned wpi::countTrailingOnes (T Value, ZeroBehavior ZB=ZB_Width)
 Count the number of ones from the least significant bit to the first zero bit. More...
 
template<typename T >
unsigned wpi::countPopulation (T Value)
 Count the number of set bits in a value. More...
 
template<size_t kValue>
constexpr size_t wpi::CTLog2 ()
 Compile time Log2. More...
 
template<>
constexpr size_t wpi::CTLog2< 1 > ()
 
double wpi::Log2 (double Value)
 Return the log base 2 of the specified value. More...
 
unsigned wpi::Log2_32 (uint32_t Value)
 Return the floor log base 2 of the specified value, -1 if the value is zero. More...
 
unsigned wpi::Log2_64 (uint64_t Value)
 Return the floor log base 2 of the specified value, -1 if the value is zero. More...
 
unsigned wpi::Log2_32_Ceil (uint32_t Value)
 Return the ceil log base 2 of the specified value, 32 if the value is zero. More...
 
unsigned wpi::Log2_64_Ceil (uint64_t Value)
 Return the ceil log base 2 of the specified value, 64 if the value is zero. More...
 
template<typename T >
wpi::greatestCommonDivisor (T A, T B)
 Return the greatest common divisor of the values using Euclid's algorithm. More...
 
uint64_t wpi::GreatestCommonDivisor64 (uint64_t A, uint64_t B)
 
double wpi::BitsToDouble (uint64_t Bits)
 This function takes a 64-bit integer and returns the bit equivalent double. More...
 
float wpi::BitsToFloat (uint32_t Bits)
 This function takes a 32-bit integer and returns the bit equivalent float. More...
 
uint64_t wpi::DoubleToBits (double Double)
 This function takes a double and returns the bit equivalent 64-bit integer. More...
 
uint32_t wpi::FloatToBits (float Float)
 This function takes a float and returns the bit equivalent 32-bit integer. More...
 
constexpr uint64_t wpi::MinAlign (uint64_t A, uint64_t B)
 A and B are either alignments or offsets. More...
 
uint64_t wpi::NextPowerOf2 (uint64_t A)
 Returns the next power of two (in 64-bits) that is strictly greater than A. More...
 
uint64_t wpi::PowerOf2Floor (uint64_t A)
 Returns the power of two which is less than or equal to the given value. More...
 
uint64_t wpi::PowerOf2Ceil (uint64_t A)
 Returns the power of two which is greater than or equal to the given value. More...
 
uint64_t wpi::alignTo (uint64_t Value, uint64_t Align, uint64_t Skew=0)
 Returns the next integer (mod 2**64) that is greater than or equal to Value and is a multiple of Align. More...
 
template<uint64_t Align>
constexpr uint64_t wpi::alignTo (uint64_t Value)
 Returns the next integer (mod 2**64) that is greater than or equal to Value and is a multiple of Align. More...
 
uint64_t wpi::divideCeil (uint64_t Numerator, uint64_t Denominator)
 Returns the integer ceil(Numerator / Denominator). More...
 
uint64_t wpi::divideNearest (uint64_t Numerator, uint64_t Denominator)
 Returns the integer nearest(Numerator / Denominator). More...
 
uint64_t wpi::alignDown (uint64_t Value, uint64_t Align, uint64_t Skew=0)
 Returns the largest uint64_t less than or equal to Value and is Skew mod Align. More...
 
template<unsigned B>
constexpr int32_t wpi::SignExtend32 (uint32_t X)
 Sign-extend the number in the bottom B bits of X to a 32-bit integer. More...
 
int32_t wpi::SignExtend32 (uint32_t X, unsigned B)
 Sign-extend the number in the bottom B bits of X to a 32-bit integer. More...
 
template<unsigned B>
constexpr int64_t wpi::SignExtend64 (uint64_t x)
 Sign-extend the number in the bottom B bits of X to a 64-bit integer. More...
 
int64_t wpi::SignExtend64 (uint64_t X, unsigned B)
 Sign-extend the number in the bottom B bits of X to a 64-bit integer. More...
 
template<typename T >
std::enable_if_t< std::is_unsigned< T >::value, T > wpi::AbsoluteDifference (T X, T Y)
 Subtract two unsigned integers, X and Y, of type T and return the absolute value of the result. More...
 
template<typename T >
std::enable_if_t< std::is_unsigned< T >::value, T > wpi::SaturatingAdd (T X, T Y, bool *ResultOverflowed=nullptr)
 Add two unsigned integers, X and Y, of type T. More...
 
template<typename T >
std::enable_if_t< std::is_unsigned< T >::value, T > wpi::SaturatingMultiply (T X, T Y, bool *ResultOverflowed=nullptr)
 Multiply two unsigned integers, X and Y, of type T. More...
 
template<typename T >
std::enable_if_t< std::is_unsigned< T >::value, T > wpi::SaturatingMultiplyAdd (T X, T Y, T A, bool *ResultOverflowed=nullptr)
 Multiply two unsigned integers, X and Y, and add the unsigned integer, A to the product. More...
 
template<typename T >
std::enable_if_t< std::is_signed< T >::value, T > wpi::AddOverflow (T X, T Y, T &Result)
 Add two signed integers, computing the two's complement truncated result, returning true if overflow occured. More...
 
template<typename T >
std::enable_if_t< std::is_signed< T >::value, T > wpi::SubOverflow (T X, T Y, T &Result)
 Subtract two signed integers, computing the two's complement truncated result, returning true if an overflow ocurred. More...
 
template<typename T >
std::enable_if_t< std::is_signed< T >::value, T > wpi::MulOverflow (T X, T Y, T &Result)
 Multiply two signed integers, computing the two's complement truncated result, returning true if an overflow ocurred. More...
 
template<typename T >
constexpr int wpi::sgn (T val)
 
template<typename T >
constexpr T wpi::Lerp (const T &startValue, const T &endValue, double t)
 Linearly interpolates between two values. More...
 

Variables

static const unsigned char wpi::BitReverseTable256 [256]
 Macro compressed bit reversal table for 256 bits. More...
 
const float wpi::huge_valf
 Use this rather than HUGE_VALF; the latter causes warnings on MSVC. More...
 

Macro Definition Documentation

◆ R2

#define R2 (   n)    n, n + 2 * 64, n + 1 * 64, n + 3 * 64

◆ R4

#define R4 (   n)    R2(n), R2(n + 2 * 16), R2(n + 1 * 16), R2(n + 3 * 16)

◆ R6

#define R6 (   n)    R4(n), R4(n + 2 * 4), R4(n + 1 * 4), R4(n + 3 * 4)