The Battle for Wesnoth  1.13.4+dev
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
Classes | Namespaces | Macros | Typedefs | Functions
util.hpp File Reference

Templates and utility-routines for strings and numbers. More...

#include "global.hpp"
#include <cmath>
#include <cstddef>
#include <cstdint>
#include <limits>
#include <math.h>
#include <vector>
#include <sstream>
#include <algorithm>
Include dependency graph for util.hpp:

Go to the source code of this file.

Classes

struct  bad_lexical_cast
 Thrown when a lexical_cast fails. More...
 
class  util::unique_ptr< T >
 
struct  util::detail::contains_impl< Container, Value >
 A struct that exists to implement a generic wrapper for std::find. More...
 
struct  util::detail::contains_impl< Container, typename Container::key_type >
 A struct that exists to implement a generic wrapper for the find() member of associative containers. More...
 

Namespaces

 util
 
 util::detail
 

Macros

#define LIKELY(a)   a
 
#define UNLIKELY(a)   a
 
#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 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 div100rounded (int num)
 Guarantees portable results for division by 100; round towards 0. 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...
 
int round_double (double d)
 
double round_portable (double d)
 
template<typename To , typename From >
To lexical_cast (From a)
 
template<typename To , typename From >
To lexical_cast_default (From a, To def=To())
 
template<>
size_t lexical_cast< size_t, const std::string & > (const std::string &a)
 
template<>
size_t lexical_cast< size_t, const char * > (const char *a)
 
template<>
size_t lexical_cast_default< size_t, const std::string & > (const std::string &a, size_t def)
 
template<>
size_t lexical_cast_default< size_t, const char * > (const char *a, size_t def)
 
template<>
long lexical_cast< long, const std::string & > (const std::string &a)
 
template<>
long lexical_cast< long, const char * > (const char *a)
 
template<>
long lexical_cast_default< long, const std::string & > (const std::string &a, long def)
 
template<>
long lexical_cast_default< long, const char * > (const char *a, long def)
 
template<>
int lexical_cast< int, const std::string & > (const std::string &a)
 
template<>
int lexical_cast< int, const char * > (const char *a)
 
template<>
int lexical_cast_default< int, const std::string & > (const std::string &a, int def)
 
template<>
int lexical_cast_default< int, const char * > (const char *a, int def)
 
template<>
double lexical_cast< double, const std::string & > (const std::string &a)
 
template<>
double lexical_cast< double, const char * > (const char *a)
 
template<>
double lexical_cast_default< double, const std::string & > (const std::string &a, double def)
 
template<>
double lexical_cast_default< double, const char * > (const char *a, double def)
 
template<>
float lexical_cast< float, const std::string & > (const std::string &a)
 
template<>
float lexical_cast< float, const char * > (const char *a)
 
template<>
float lexical_cast_default< float, const std::string & > (const std::string &a, float def)
 
template<>
float lexical_cast_default< float, const char * > (const char *a, float def)
 
template<typename To , typename From >
To lexical_cast_in_range (From a, To def, To min, To max)
 
template<typename Cmp >
bool in_ranges (const Cmp c, const std::vector< std::pair< Cmp, Cmp > > &ranges)
 
bool chars_equal_insensitive (char a, char b)
 
bool chars_less_insensitive (char a, char b)
 
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...
 
template<typename Container , typename Value >
bool util::contains (const Container &container, const Value &value)
 Returns true iff value is found in container. More...
 

Detailed Description

Templates and utility-routines for strings and numbers.

Definition in file util.hpp.

Macro Definition Documentation

#define ftofxp (   x)    (fixed_t((x) * fxp_base))
#define fxp_base   (1 << fxp_shift)

Definition at line 500 of file util.hpp.

#define fxp_shift   8

Definition at line 499 of file util.hpp.

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

IN: unsigned and int - OUT: fixed_t.

Definition at line 509 of file util.hpp.

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

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

IN: unsigned and fixed_t - OUT: unsigned.

Definition at line 506 of file util.hpp.

Referenced by adjust_surface_alpha(), brighten_image(), unit_drawer::draw_bar(), and submerge_alpha().

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

IN: fixed_t - OUT: int.

Definition at line 512 of file util.hpp.

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

#define LIKELY (   a)    a
#define UNLIKELY (   a)    a

Typedef Documentation

typedef int32_t fixed_t

Definition at line 498 of file util.hpp.

Function Documentation

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 221 of file util.hpp.

Referenced by BOOST_AUTO_TEST_CASE(), and count_leading_zeros().

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 type of x.
Parameters
xThe return value is the size, in bits, of this object.
Returns
the size, in bits, of an instance of type T.

Definition at line 238 of file util.hpp.

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 beyond the applicable limit, base will be returned.)

Definition at line 44 of file util.hpp.

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

bool chars_equal_insensitive ( char  a,
char  b 
)
inline
bool chars_less_insensitive ( char  a,
char  b 
)
inline

Definition at line 207 of file util.hpp.

Referenced by gui::menu::basic_sorter::less().

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 415 of file util.hpp.

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

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 369 of file util.hpp.

References bit_width(), and count_leading_zeros_impl().

Referenced by BOOST_AUTO_TEST_CASE().

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

Definition at line 338 of file util.hpp.

References count_ones().

Referenced by count_leading_zeros().

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 260 of file util.hpp.

Referenced by BOOST_AUTO_TEST_CASE(), and count_leading_zeros_impl().

int div100rounded ( int  num)
inline

Guarantees portable results for division by 100; round towards 0.

Definition at line 52 of file util.hpp.

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

template<typename Cmp >
bool in_ranges ( const Cmp  c,
const std::vector< std::pair< Cmp, Cmp > > &  ranges 
)
template<typename T >
bool is_even ( num)
inline
template<typename T >
bool is_odd ( num)
inline
template<typename To , typename From >
To lexical_cast ( From  a)

Definition at line 90 of file util.hpp.

template<>
double lexical_cast< double, const char * > ( const char *  a)

Definition at line 215 of file util.cpp.

template<>
double lexical_cast< double, const std::string & > ( const std::string a)

Definition at line 202 of file util.cpp.

template<>
float lexical_cast< float, const char * > ( const char *  a)

Definition at line 267 of file util.cpp.

template<>
float lexical_cast< float, const std::string & > ( const std::string a)

Definition at line 254 of file util.cpp.

template<>
int lexical_cast< int, const char * > ( const char *  a)

Definition at line 154 of file util.cpp.

template<>
int lexical_cast< int, const std::string & > ( const std::string a)

Definition at line 140 of file util.cpp.

template<>
long lexical_cast< long, const char * > ( const char *  a)

Definition at line 96 of file util.cpp.

template<>
long lexical_cast< long, const std::string & > ( const std::string a)

Definition at line 83 of file util.cpp.

template<>
size_t lexical_cast< size_t, const char * > ( const char *  a)

Definition at line 38 of file util.cpp.

template<>
size_t lexical_cast< size_t, const std::string & > ( const std::string a)

Definition at line 24 of file util.cpp.

template<typename To , typename From >
To lexical_cast_default ( From  a,
To  def = To() 
)

Definition at line 103 of file util.hpp.

Referenced by t_translation::string_to_builder_number_().

template<>
double lexical_cast_default< double, const char * > ( const char *  a,
double  def 
)

Definition at line 241 of file util.cpp.

template<>
double lexical_cast_default< double, const std::string & > ( const std::string a,
double  def 
)

Definition at line 228 of file util.cpp.

template<>
float lexical_cast_default< float, const char * > ( const char *  a,
float  def 
)

Definition at line 292 of file util.cpp.

template<>
float lexical_cast_default< float, const std::string & > ( const std::string a,
float  def 
)

Definition at line 279 of file util.cpp.

template<>
int lexical_cast_default< int, const char * > ( const char *  a,
int  def 
)

Definition at line 185 of file util.cpp.

Referenced by BOOST_AUTO_TEST_CASE().

template<>
int lexical_cast_default< int, const std::string & > ( const std::string a,
int  def 
)

Definition at line 168 of file util.cpp.

template<>
long lexical_cast_default< long, const char * > ( const char *  a,
long  def 
)

Definition at line 124 of file util.cpp.

template<>
long lexical_cast_default< long, const std::string & > ( const std::string a,
long  def 
)

Definition at line 108 of file util.cpp.

template<>
size_t lexical_cast_default< size_t, const char * > ( const char *  a,
size_t  def 
)

Definition at line 67 of file util.cpp.

template<>
size_t lexical_cast_default< size_t, const std::string & > ( const std::string a,
size_t  def 
)

Definition at line 51 of file util.cpp.

template<typename To , typename From >
To lexical_cast_in_range ( From  a,
To  def,
To  min,
To  max 
)

Definition at line 176 of file util.hpp.

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 60 of file util.hpp.

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

int round_double ( double  d)
inline
double round_portable ( double  d)
inline

Definition at line 76 of file util.hpp.

References floating_point_emulation::floor().

Referenced by variant::operator^().