General math utility functions. More...
#include <cmath>
#include <cstddef>
#include <cstdint>
#include <cstdlib>
#include <limits>
#include <vector>
#include <algorithm>
#include <cassert>
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... | |
template<typename T > | |
T | modulo (T num, int mod, T min=0) |
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) |
General math utility functions.
Definition in file math.hpp.
IN: float or int - OUT: fixed_t.
Definition at line 317 of file math.hpp.
Referenced by font::floating_label::create_surface(), unit_drawer::draw_bar(), gui::textbox::draw_contents(), image::get_brightened(), game_display::new_turn(), image::o_modification::operator()(), unit_frame::redraw(), unit_drawer::redraw_unit(), display::render_image(), scale_surface(), scale_surface_legacy(), image::simplify_type(), and submerge_alpha().
#define fxpdiv | ( | x, | |
y | |||
) | (((x) << fxp_shift) / (y)) |
IN: unsigned and int - OUT: fixed_t.
Definition at line 323 of file math.hpp.
Referenced by unit_drawer::draw_bar(), game_display::new_turn(), scale_surface(), and scale_surface_legacy().
#define fxpmult | ( | x, | |
y | |||
) | (((x)*(y)) >> fxp_shift) |
IN: unsigned and fixed_t - OUT: unsigned.
Definition at line 320 of file math.hpp.
Referenced by brighten_image(), unit_drawer::draw_bar(), image::o_modification::operator()(), and submerge_alpha().
IN: fixed_t - OUT: int.
Definition at line 326 of file math.hpp.
Referenced by unit_drawer::draw_bar(), scale_surface(), and scale_surface_legacy().
|
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
T | The return value is the size, in bits, of an instance of this type. |
T
. Definition at line 105 of file math.hpp.
Referenced by BOOST_AUTO_TEST_CASE(), and count_leading_zeros().
|
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
T | The return value is the size, in bits, of the type of this object. |
T
.
|
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 47 of file math.hpp.
Referenced by tod_manager::get_illuminated_time_of_day(), and terrain_type::light_bonus().
|
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.
N | The 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. |
n | An integer upon which to operate. |
1
bits in n
, if N
satisfies the above constraints.Definition at line 297 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().
|
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.
N | The 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. |
n | An integer upon which to operate. |
0
bits in n
, if N
satisfies the above constraints.Definition at line 251 of file math.hpp.
References bit_width(), and count_leading_zeros_impl().
Referenced by BOOST_AUTO_TEST_CASE().
|
inline |
Definition at line 220 of file math.hpp.
References count_ones(), and w.
Referenced by count_leading_zeros(), and count_ones().
|
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.
N | The 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. |
n | An integer upon which to operate. |
1
bits in n
, if N
is a fundamental integer type. Definition at line 142 of file math.hpp.
References count_leading_zeros_impl(), n, and w.
Referenced by BOOST_AUTO_TEST_CASE(), and count_leading_zeros_impl().
|
inline |
Guarantees portable results for division by 100; round half up, to the nearest integer.
Definition at line 38 of file math.hpp.
Referenced by utils::apply_modifier(), and campaign_controller::show_carryover_message().
bool in_ranges | ( | const Cmp | c, |
const std::vector< std::pair< Cmp, Cmp >> & | ranges | ||
) |
Definition at line 86 of file math.hpp.
References c.
Referenced by unit_filter::first_match_on_map(), game_events::builtin_conditions::have_unit(), terrain_filter::match_internal(), and matches_simple_filter().
|
inline |
Definition at line 32 of file math.hpp.
Referenced by actions::shroud_clearer::clear_loc(), default_map_generator_job::default_generate_map(), is_odd(), and is_vertically_higher_than().
|
inline |
Definition at line 35 of file math.hpp.
References is_even().
Referenced by actions::shroud_clearer::clear_loc(), display::draw_minimap_units(), default_map_generator::generate_map(), display::get_location_y(), image::getMinimap(), intf_terrain_mask(), version_info::is_dev_version(), is_vertically_higher_than(), gamemap_base::overlay_rule::overlay_rule(), rotate_180_surface(), editor::map_fragment::rotate_60_ccw(), and editor::map_fragment::rotate_60_cw().
|
inline |
Definition at line 61 of file math.hpp.
References n.
Referenced by tod_manager::calculate_time_index_at_turn(), play_controller::find_last_visible_team(), tod_manager::fix_time_index(), and play_controller::play_turn().
|
inline |
round (base_damage * bonus / divisor) to the closest integer, but up or down towards base_damage
Definition at line 79 of file math.hpp.
Referenced by attack_info(), battle_context_unit_stats::battle_context_unit_stats(), and battle_context_unit_stats::calc_blows().
|
inline |
Definition at line 304 of file math.hpp.
Referenced by gui2::slider_base::set_slider_position(), gui2::slider::set_value(), and gui2::slider_base::update_slider_position().