The Battle for Wesnoth  1.15.1+dev
Macros | Typedefs | Functions
math.hpp File Reference

General math utility functions. More...

#include <cmath>
#include <cstddef>
#include <cstdint>
#include <cstdlib>
#include <limits>
#include <vector>
#include <algorithm>
Include dependency graph for math.hpp:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define fxp_shift   8
 
#define fxp_base   (1 << fxp_shift)
 
#define ftofxp(x)   (fixed_t((x) * fxp_base))
 IN: float or int - OUT: fixed_t. More...
 
#define fxpmult(x, y)   (((x)*(y)) >> fxp_shift)
 IN: unsigned and fixed_t - OUT: unsigned. More...
 
#define fxpdiv(x, y)   (((x) << fxp_shift) / (y))
 IN: unsigned and int - OUT: fixed_t. More...
 
#define fxptoi(x)   ( ((x)>0) ? ((x) >> fxp_shift) : (-((-(x)) >> fxp_shift)) )
 IN: fixed_t - OUT: int. More...
 

Typedefs

typedef int32_t fixed_t
 

Functions

template<typename T >
bool is_even (T num)
 
template<typename T >
bool is_odd (T num)
 
int div100rounded (int num)
 Guarantees portable results for division by 100; round half up, to the nearest integer. More...
 
int bounded_add (int base, int increment, int max_sum, int min_sum=0)
 Returns base + increment, but will not increase base above max_sum, nor decrease it below min_sum. More...
 
int round_damage (int base_damage, int bonus, int divisor)
 round (base_damage * bonus / divisor) to the closest integer, but up or down towards base_damage More...
 
template<typename Cmp >
bool in_ranges (const Cmp c, const std::vector< std::pair< Cmp, Cmp >> &ranges)
 
template<typename T >
std::size_t bit_width ()
 Returns the size, in bits, of an instance of type T, providing a convenient and self-documenting name for the underlying expression: More...
 
template<typename T >
std::size_t bit_width (const T &)
 Returns the size, in bits, of x, providing a convenient and self-documenting name for the underlying expression: More...
 
template<typename N >
unsigned int count_ones (N n)
 Returns the quantity of 1 bits in n — i.e., n’s population count. More...
 
template<typename N >
unsigned int count_leading_zeros_impl (N n, std::size_t w)
 
template<typename N >
unsigned int count_leading_zeros (N n)
 Returns the quantity of leading 0 bits in n — i.e., the quantity of bits in n, minus the 1-based bit index of the most significant 1 bit in n, or minus 0 if n is 0. More...
 
template<typename N >
unsigned int count_leading_ones (N n)
 Returns the quantity of leading 1 bits in n — i.e., the quantity of bits in n, minus the 1-based bit index of the most significant 0 bit in n, or minus 0 if n contains no 0 bits. More...
 
int rounded_division (int a, int b)
 

Detailed Description

General math utility functions.

Definition in file math.hpp.

Macro Definition Documentation

◆ ftofxp

#define ftofxp (   x)    (fixed_t((x) * fxp_base))

◆ fxp_base

#define fxp_base   (1 << fxp_shift)

Definition at line 294 of file math.hpp.

◆ fxp_shift

#define fxp_shift   8

Definition at line 293 of file math.hpp.

◆ fxpdiv

#define fxpdiv (   x,
 
)    (((x) << fxp_shift) / (y))

IN: unsigned and int - OUT: fixed_t.

Definition at line 303 of file math.hpp.

Referenced by unit_drawer::draw_bar(), game_display::new_turn(), scale_surface(), and scale_surface_legacy().

◆ fxpmult

#define fxpmult (   x,
 
)    (((x)*(y)) >> fxp_shift)

IN: unsigned and fixed_t - OUT: unsigned.

Definition at line 300 of file math.hpp.

Referenced by brighten_image(), unit_drawer::draw_bar(), image::o_modification::operator()(), and submerge_alpha().

◆ fxptoi

#define fxptoi (   x)    ( ((x)>0) ? ((x) >> fxp_shift) : (-((-(x)) >> fxp_shift)) )

IN: fixed_t - OUT: int.

Definition at line 306 of file math.hpp.

Referenced by unit_drawer::draw_bar(), scale_surface(), and scale_surface_legacy().

Typedef Documentation

◆ fixed_t

typedef int32_t fixed_t

Definition at line 292 of file math.hpp.

Function Documentation

◆ bit_width() [1/2]

template<typename T >
std::size_t bit_width ( )
inline

Returns the size, in bits, of an instance of type T, providing a convenient and self-documenting name for the underlying expression:

sizeof(T) * std::numeric_limits<unsigned char>::digits

Template Parameters
TThe return value is the size, in bits, of an instance of this type.
Returns
the size, in bits, of an instance of type T.

Definition at line 85 of file math.hpp.

Referenced by BOOST_AUTO_TEST_CASE(), and count_leading_zeros().

◆ bit_width() [2/2]

template<typename T >
std::size_t bit_width ( const T &  )
inline

Returns the size, in bits, of x, providing a convenient and self-documenting name for the underlying expression:

sizeof(x) * std::numeric_limits<unsigned char>::digits

Template Parameters
TThe return value is the size, in bits, of the type of this object.
Returns
the size, in bits, of an instance of type T.

Definition at line 100 of file math.hpp.

◆ bounded_add()

int bounded_add ( int  base,
int  increment,
int  max_sum,
int  min_sum = 0 
)
inline

Returns base + increment, but will not increase base above max_sum, nor decrease it below min_sum.

(If base is already below the applicable limit, base will be returned.)

Definition at line 46 of file math.hpp.

Referenced by tod_manager::get_illuminated_time_of_day(), and terrain_type::light_bonus().

◆ count_leading_ones()

template<typename N >
unsigned int count_leading_ones ( n)
inline

Returns the quantity of leading 1 bits in n — i.e., the quantity of bits in n, minus the 1-based bit index of the most significant 0 bit in n, or minus 0 if n contains no 0 bits.

Template Parameters
NThe type of n. This should be a fundamental integer type that (a) is not wider than unsigned long long int, and (b) is no greater than INT_MAX bits in width; if N does not satisfy these constraints, the return value is undefined.
Parameters
nAn integer upon which to operate.
Returns
the quantity of leading 1 bits in n, if N satisfies the above constraints.
See also
count_leading_zeros()

Definition at line 277 of file math.hpp.

Referenced by BOOST_AUTO_TEST_CASE(), utf8::byte_size_from_utf8_first(), and ucs4_convert_impl::utf8_impl::byte_size_from_utf8_first().

◆ count_leading_zeros()

template<typename N >
unsigned int count_leading_zeros ( n)
inline

Returns the quantity of leading 0 bits in n — i.e., the quantity of bits in n, minus the 1-based bit index of the most significant 1 bit in n, or minus 0 if n is 0.

Template Parameters
NThe type of n. This should be a fundamental integer type that (a) is not wider than unsigned long long int (the GCC count-leading-zeros built-in functions are defined for unsigned int, unsigned long int, and unsigned long long int), and (b) is no greater than INT_MAX bits in width (the GCC built-in functions return instances of type int); if N does not satisfy these constraints, the return value is undefined.
Parameters
nAn integer upon which to operate.
Returns
the quantity of leading 0 bits in n, if N satisfies the above constraints.
See also
count_leading_ones()

Definition at line 231 of file math.hpp.

References bit_width(), and count_leading_zeros_impl().

Referenced by BOOST_AUTO_TEST_CASE().

◆ count_leading_zeros_impl()

template<typename N >
unsigned int count_leading_zeros_impl ( n,
std::size_t  w 
)
inline

Definition at line 200 of file math.hpp.

References count_ones(), and w.

Referenced by count_leading_zeros(), and count_ones().

◆ count_ones()

template<typename N >
unsigned int count_ones ( n)
inline

Returns the quantity of 1 bits in n — i.e., n’s population count.

Algorithm adapted from: https://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetKernighan

This algorithm was chosen for relative simplicity, not for speed.

Template Parameters
NThe type of n. This should be a fundamental integer type no greater than UINT_MAX bits in width; if it is not, the return value is undefined.
Parameters
nAn integer upon which to operate.
Returns
the quantity of 1 bits in n, if N is a fundamental integer type.

Definition at line 122 of file math.hpp.

References count_leading_zeros_impl(), n, and w.

Referenced by BOOST_AUTO_TEST_CASE(), and count_leading_zeros_impl().

◆ div100rounded()

int div100rounded ( int  num)
inline

Guarantees portable results for division by 100; round half up, to the nearest integer.

Definition at line 37 of file math.hpp.

Referenced by utils::apply_modifier(), and campaign_controller::show_carryover_message().

◆ in_ranges()

template<typename Cmp >
bool in_ranges ( const Cmp  c,
const std::vector< std::pair< Cmp, Cmp >> &  ranges 
)

◆ is_even()

template<typename T >
bool is_even ( num)
inline

◆ is_odd()

template<typename T >
bool is_odd ( num)
inline

◆ round_damage()

int round_damage ( int  base_damage,
int  bonus,
int  divisor 
)
inline

round (base_damage * bonus / divisor) to the closest integer, but up or down towards base_damage

Definition at line 59 of file math.hpp.

Referenced by attack_info(), battle_context_unit_stats::battle_context_unit_stats(), and battle_context_unit_stats::calc_blows().

◆ rounded_division()

int rounded_division ( int  a,
int  b 
)
inline