OpenTTD Source 20241224-master-gf74b0cf984
math_func.hpp File Reference

Integer math functions. More...

Go to the source code of this file.

Functions

template<typename T >
constexpr T abs (const T a)
 Returns the absolute value of (scalar) variable.
 
template<typename T >
constexpr T Align (const T x, uint n)
 Return the smallest multiple of n equal or greater than x.
 
template<typename T >
constexpr T * AlignPtr (T *x, uint n)
 Return the smallest multiple of n equal or greater than x Applies to pointers only.
 
template<typename T >
constexpr T Clamp (const T a, const T min, const T max)
 Clamp a value between an interval.
 
template<typename T >
constexpr T SoftClamp (const T a, const T min, const T max)
 Clamp a value between an interval.
 
constexpr int Clamp (const int a, const int min, const int max)
 Clamp an integer between an interval.
 
constexpr uint ClampU (const uint a, const uint min, const uint max)
 Clamp an unsigned integer between an interval.
 
template<typename To , typename From , std::enable_if_t< std::is_integral< From >::value, int > = 0>
constexpr To ClampTo (From value)
 Clamp the given value down to lie within the requested type.
 
template<typename T >
constexpr T Delta (const T a, const T b)
 Returns the (absolute) difference between two (scalar) variables.
 
template<typename T >
constexpr bool IsInsideBS (const T x, const size_t base, const size_t size)
 Checks if a value is between a window started at some base point.
 
template<typename T , std::enable_if_t< std::disjunction_v< std::is_convertible< T, size_t >, std::is_base_of< StrongTypedefBase, T > >, int > = 0>
constexpr bool IsInsideMM (const T x, const size_t min, const size_t max) noexcept
 Checks if a value is in an interval.
 
template<typename T >
constexpr void Swap (T &a, T &b)
 Type safe swap operation.
 
constexpr uint ToPercent8 (uint i)
 Converts a "fract" value 0..255 to "percent" value 0..100.
 
constexpr uint ToPercent16 (uint i)
 Converts a "fract" value 0..65535 to "percent" value 0..100.
 
int DivideApprox (int a, int b)
 Deterministic approximate division.
 
constexpr uint CeilDiv (uint a, uint b)
 Computes ceil(a / b) for non-negative a and b.
 
constexpr uint Ceil (uint a, uint b)
 Computes ceil(a / b) * b for non-negative a and b.
 
constexpr int RoundDivSU (int a, uint b)
 Computes round(a / b) for signed a and unsigned b.
 
constexpr uint64_t PowerOfTen (int power)
 Computes ten to the given power.
 
uint32_t IntSqrt (uint32_t num)
 Compute the integer square root.
 

Detailed Description

Integer math functions.

Definition in file math_func.hpp.

Function Documentation

◆ abs()

◆ Align()

template<typename T >
constexpr T Align ( const T  x,
uint  n 
)
constexpr

Return the smallest multiple of n equal or greater than x.

Note
n must be a power of 2
Parameters
xThe min value
nThe base of the number we are searching
Returns
The smallest multiple of n equal or greater than x

Definition at line 37 of file math_func.hpp.

Referenced by TarScanner::AddFile(), AlignPtr(), VideoDriver_Win32GDI::AllocateBackingStore(), CacheSpriteAllocator::AllocatePtr(), DEFINE_POOL_METHOD(), DrawDirtyBlocks(), MakeBMPImage(), OpenGLBackend::Resize(), OpenGLSprite::Update(), and ViewportSign::UpdatePosition().

◆ AlignPtr()

template<typename T >
constexpr T * AlignPtr ( T *  x,
uint  n 
)
constexpr

Return the smallest multiple of n equal or greater than x Applies to pointers only.

Note
n must be a power of 2
Parameters
xThe min value
nThe base of the number we are searching
Returns
The smallest multiple of n equal or greater than x
See also
Align()

Definition at line 55 of file math_func.hpp.

References Align().

◆ Ceil()

constexpr uint Ceil ( uint  a,
uint  b 
)
constexpr

Computes ceil(a / b) * b for non-negative a and b.

Parameters
aNumerator
bDenominator
Returns
a rounded up to the nearest multiple of b.

Definition at line 331 of file math_func.hpp.

References CeilDiv().

Referenced by ResizeWindow(), and SurveyMemoryToText().

◆ CeilDiv()

◆ Clamp() [1/2]

constexpr int Clamp ( const int  a,
const int  min,
const int  max 
)
constexpr

Clamp an integer between an interval.

This function returns a value which is between the given interval of min and max. If the given value is in this interval the value itself is returned otherwise the border of the interval is returned, according which side of the interval was 'left'.

Note
The min value must be less or equal of max or you get some unexpected results.
Parameters
aThe value to clamp/truncate.
minThe minimum of the interval.
maxthe maximum of the interval.
Returns
A value between min and max which is closest to a.
See also
ClampU(uint, uint, uint)

Definition at line 129 of file math_func.hpp.

◆ Clamp() [2/2]

template<typename T >
constexpr T Clamp ( const T  a,
const T  min,
const T  max 
)
constexpr

Clamp a value between an interval.

This function returns a value which is between the given interval of min and max. If the given value is in this interval the value itself is returned otherwise the border of the interval is returned, according which side of the interval was 'left'.

Note
The min value must be less or equal of max or you get some unexpected results.
Parameters
aThe value to clamp/truncate.
minThe minimum of the interval.
maxthe maximum of the interval.
Returns
A value between min and max which is closest to a.
See also
ClampU(uint, uint, uint)
Clamp(int, int, int)

Definition at line 79 of file math_func.hpp.

Referenced by AdjustGUIZoom(), AfterLoadGame(), AirportChangeInfo(), AmbientSoundEffectCallback(), AnimationBase< Tbase, Tspec, Tobj, Textra, GetCallback, Tframehelper >::AnimateTile(), BridgeChangeInfo(), ChangeIndustryProduction(), ClampSmoothScroll(), ClickChangeDateCheat(), ClickChangeMaxHlCheat(), ClickSliderWidget(), CmdTownRating(), Train::ConsistChanged(), CreateEffectVehicleAbove(), DrawRoadVehEngine(), DrawSliderWidget(), RefitWindow::DrawWidget(), EnsureVisibleCaption(), NetworkAskRelayWindow::FindWindowPlacementAndResize(), NetworkAskSurveyWindow::FindWindowPlacementAndResize(), GenerateLandscape(), GenerateTerrainPerlin(), GetAmplitude(), QueryString::GetBoundingRect(), Path::GetCapacityRatio(), Train::GetCurveSpeedLimit(), GetGlobalVariable(), GetPlatformInfo(), GetRoadVehLength(), GetSavegameFormat(), GetServiceIntervalClamped(), VideoDriver::GetSuggestedUIScale(), GetTileHeightBelowAircraft(), VehicleScopeResolver::GetVariable(), HandleCrashedAircraft(), HeightMapCurves(), IndustrytilesChangeInfo(), InitializeWindowViewport(), InverseRemapCoords2(), MakeBMPImage(), MakePCXImage(), MakePNGImage(), IntSettingDesc::MakeValueValid(), GenerateLandscapeWindow::OnClick(), CreateScenarioWindow::OnClick(), NetworkStartServerWindow::OnClick(), CustomCurrencyWindow::OnClick(), BuildBridgeWindow::OnInitialPosition(), SpriteAlignerWindow::OnInvalidateData(), GenerateLandscapeWindow::OnQueryTextFinished(), CreateScenarioWindow::OnQueryTextFinished(), NetworkStartServerWindow::OnQueryTextFinished(), OrdersWindow::OnQueryTextFinished(), CustomCurrencyWindow::OnQueryTextFinished(), MultiCommodityFlow::PushFlow(), RailTypeChangeInfo(), RecomputePrices(), SetAircraftPosition(), SetDateWindow::SetDateWindow(), Scrollbar::SetPosition(), SetPriceBaseMultiplier(), SetSelectionTilesDirty(), ScriptConfig::SetSetting(), SetStartingYear(), GRFConfig::SetValue(), SmallMapWindow::SetZoomLevel(), SoundEffectChangeInfo(), MusicDriver_Win32::Start(), TileHeightOutsideMap(), TileLoop_Town(), TownHouseChangeInfo(), TransmitNotesOff(), Train::UpdateAcceleration(), UpdateGUIZoom(), Scrollbar::UpdateListPositionOnKeyPress(), DisasterVehicle::UpdatePosition(), VehicleEnterDepot(), and VpSelectTilesWithMethod().

◆ ClampTo()

template<typename To , typename From , std::enable_if_t< std::is_integral< From >::value, int > = 0>
constexpr To ClampTo ( From  value)
constexpr

Clamp the given value down to lie within the requested type.

Specialization of ClampTo for StrongType::Typedef.

For example ClampTo<uint8_t> will return a value clamped to the range of 0 to 255. Anything smaller will become 0, anything larger will become 255.

Parameters
aThe 64-bit value to clamp.
Returns
The 64-bit value reduced to a value within the given allowed range for the return type.
See also
Clamp(int, int, int)

Definition at line 167 of file math_func.hpp.

◆ ClampU()

constexpr uint ClampU ( const uint  a,
const uint  min,
const uint  max 
)
constexpr

Clamp an unsigned integer between an interval.

This function returns a value which is between the given interval of min and max. If the given value is in this interval the value itself is returned otherwise the border of the interval is returned, according which side of the interval was 'left'.

Note
The min value must be less or equal of max or you get some unexpected results.
Parameters
aThe value to clamp/truncate.
minThe minimum of the interval.
maxthe maximum of the interval.
Returns
A value between min and max which is closest to a.
See also
Clamp(int, int, int)

Definition at line 150 of file math_func.hpp.

Referenced by CalcClosestStationTile(), ChangeIndustryProduction(), ConvertFromOldCompanyManagerFace(), IntSettingDesc::MakeValueValid(), IndustryViewWindow::OnQueryTextFinished(), VideoDriver::UpdateAutoResolution(), and SavePresetWindow::UpdateWidgetSize().

◆ Delta()

template<typename T >
constexpr T Delta ( const T  a,
const T  b 
)
constexpr

Returns the (absolute) difference between two (scalar) variables.

Parameters
aThe first scalar
bThe second scalar
Returns
The absolute difference between the given scalars

Definition at line 234 of file math_func.hpp.

Referenced by DisasterTick_Big_Ufo(), DisasterTick_Big_Ufo_Destroyer(), DisasterTick_Ufo(), DistanceManhattan(), DistanceMax(), DistanceMaxPlusManhattan(), DrawTileSelection(), PlaceTreeAtSameHeight(), and VpSelectTilesWithMethod().

◆ DivideApprox()

int DivideApprox ( int  a,
int  b 
)

Deterministic approximate division.

Cancels out division errors stemming from the integer nature of the division over multiple runs.

Parameters
aDividend.
bDivisor.
Returns
a/b or (a/b)+1.

Definition at line 22 of file math_func.cpp.

References abs().

Referenced by StationViewWindow::BuildCargoList(), and StationViewWindow::EstimateDestinations().

◆ IntSqrt()

uint32_t IntSqrt ( uint32_t  num)

Compute the integer square root.

Parameters
numRadicand.
Returns
Rounded integer square root.
Note
Algorithm taken from http://en.wikipedia.org/wiki/Methods_of_computing_square_roots

Definition at line 42 of file math_func.cpp.

Referenced by CanalMaintenanceCost(), RailMaintenanceCost(), RoadMaintenanceCost(), SignalMaintenanceCost(), and StationMaintenanceCost().

◆ IsInsideBS()

template<typename T >
constexpr bool IsInsideBS ( const T  x,
const size_t  base,
const size_t  size 
)
constexpr

◆ IsInsideMM()

template<typename T , std::enable_if_t< std::disjunction_v< std::is_convertible< T, size_t >, std::is_base_of< StrongTypedefBase, T > >, int > = 0>
constexpr bool IsInsideMM ( const T  x,
const size_t  min,
const size_t  max 
)
constexprnoexcept

Checks if a value is in an interval.

Returns true if a value is in the interval of [min, max).

Parameters
xThe value to check
minThe minimum of the interval
maxThe maximum of the interval
See also
IsInsideBS()

Definition at line 268 of file math_func.hpp.

Referenced by AddChildSpriteToFoundation(), AddDateIntroducedRailTypes(), AddDateIntroducedRoadTypes(), AfterLoadGame(), Map::Allocate(), CmdPlantTree(), RoadVehicle::Crash(), DeleteLastRoadVeh(), NetworkClientListWindow::DrawCompany(), GoalListWindow::DrawListColumn(), SmallMapWindow::DrawVehicles(), GraphLegendWindow::DrawWidget(), PerformanceRatingDetailWindow::DrawWidget(), LinkGraphLegendWindow::DrawWidget(), BuildSignalWindow::DrawWidget(), BuildRailDepotWindow::DrawWidget(), BuildRoadDepotWindow::DrawWidget(), SubsidyListWindow::DrawWidget(), FileList::FindItem(), MissingGlyphSearcher::FindMissingGlyphs(), FormatString(), GenerateCompanyName(), NetworkClientListWindow::GetButtonAtPoint(), QueryString::GetCharAtPosition(), Layouter::GetCharAtPosition(), GetClosestWaterDistance(), GetHalftileFoundationCorner(), IConsoleWindow::GetTextCharacterAtPosition(), GetTownRoadType(), HasRoadTypeAvail(), IsNonContinuousFoundation(), IsPtInWindowViewport(), IsSpecialRailFoundation(), IsValidCorner(), CITYChunkHandler::Load(), PLYRChunkHandler::LoadCheck(), MapGRFStringID(), ReplaceVehicleWindow::OnClick(), BuildVehicleWindow::OnClick(), CheatWindow::OnClick(), GSConfigWindow::OnClick(), GraphLegendWindow::OnClick(), PerformanceRatingDetailWindow::OnClick(), SelectGameWindow::OnClick(), LinkGraphLegendWindow::OnClick(), NewGRFParametersWindow::OnClick(), ScriptSettingsWindow::OnClick(), ScriptDebugWindow::OnClick(), ScenarioEditorLandscapeGenerationWindow::OnClick(), SmallMapWindow::OnMouseWheel(), LinkGraphLegendWindow::OnTooltip(), NetworkClientListWindow::OnTooltip(), PlaceTreeGroupAroundTile(), Vehicle::PreDestructor(), RemapOldStringID(), SwitchNewGRFBlitter(), TTDPStringIDToOTTDStringIDMapping(), Vehicle::UpdateVisualEffect(), LinkGraphLegendWindow::UpdateWidgetSize(), BuildSignalWindow::UpdateWidgetSize(), BuildRailDepotWindow::UpdateWidgetSize(), and BuildRoadDepotWindow::UpdateWidgetSize().

◆ PowerOfTen()

constexpr uint64_t PowerOfTen ( int  power)
constexpr

Computes ten to the given power.

Parameters
powerThe power of ten to get.
Returns
The power of ten.

Definition at line 358 of file math_func.hpp.

Referenced by FormatString().

◆ RoundDivSU()

constexpr int RoundDivSU ( int  a,
uint  b 
)
constexpr

Computes round(a / b) for signed a and unsigned b.

Parameters
aNumerator
bDenominator
Returns
Quotient, rounded to nearest

Definition at line 342 of file math_func.hpp.

Referenced by IndustryViewWindow::DrawInfo(), DrawLayoutLine(), DrawStringMultiLine(), ScenarioEditorLandscapeGenerationWindow::DrawWidget(), TownViewWindow::DrawWidget(), HandleScrollbarScrolling(), IndustryViewWindow::OnClick(), IndustryViewWindow::OnQueryTextFinished(), and UpdateTownGrowCounter().

◆ SoftClamp()

template<typename T >
constexpr T SoftClamp ( const T  a,
const T  min,
const T  max 
)
constexpr

Clamp a value between an interval.

This function returns a value which is between the given interval of min and max. If the given value is in this interval the value itself is returned otherwise the border of the interval is returned, according which side of the interval was 'left'.

Note
If the min value is greater than the max, return value is the average of the min and max.
Parameters
aThe value to clamp/truncate.
minThe minimum of the interval.
maxthe maximum of the interval.
Returns
A value between min and max which is closest to a.

Definition at line 102 of file math_func.hpp.

Referenced by QueryWindow::FindWindowPlacementAndResize(), and TooltipsWindow::OnInitialPosition().

◆ Swap()

◆ ToPercent16()

constexpr uint ToPercent16 ( uint  i)
constexpr

Converts a "fract" value 0..65535 to "percent" value 0..100.

Parameters
ivalue to convert, range 0..65535
Returns
value in range 0..100

Definition at line 306 of file math_func.hpp.

Referenced by DrawVehiclePurchaseInfo(), VehicleDetailsWindow::DrawWidget(), and ProcessConditionalOrder().

◆ ToPercent8()

constexpr uint ToPercent8 ( uint  i)
constexpr

Converts a "fract" value 0..255 to "percent" value 0..100.

Parameters
ivalue to convert, range 0..255
Returns
value in range 0..100

Definition at line 295 of file math_func.hpp.

Referenced by StationViewWindow::DrawCargoRatings(), IndustryViewWindow::DrawInfo(), IndustryDirectoryWindow::GetCargoTransportedPercentsIfValid(), and IndustryDirectoryWindow::GetIndustryString().