OpenTTD Source 20241224-master-gf74b0cf984
LinkRefresher Class Reference

Utility to refresh links a consist will visit. More...

#include <refresh.h>

Data Structures

struct  Hop
 A hop the refresh algorithm might evaluate. More...
 
struct  RefitDesc
 Simulated cargo type and capacity for prediction of future links. More...
 

Static Public Member Functions

static void Run (Vehicle *v, bool allow_merge=true, bool is_full_loading=false)
 Refresh all links the given vehicle will visit.
 

Protected Types

enum  RefreshFlags {
  USE_NEXT , HAS_CARGO , WAS_REFIT , RESET_REFIT ,
  IN_AUTOREFIT
}
 Various flags about properties of the last examined link that might have an influence on the next one. More...
 
typedef std::vector< RefitDescRefitList
 
typedef std::set< HopHopSet
 

Protected Member Functions

 LinkRefresher (Vehicle *v, HopSet *seen_hops, bool allow_merge, bool is_full_loading)
 Constructor for link refreshing algorithm.
 
bool HandleRefit (CargoID refit_cargo)
 Handle refit orders by updating capacities and refit_capacities.
 
void ResetRefit ()
 Restore capacities and refit_capacities as vehicle might have been able to load now.
 
void RefreshStats (const Order *cur, const Order *next)
 Refresh link stats for the given pair of orders.
 
const OrderPredictNextOrder (const Order *cur, const Order *next, uint8_t flags, uint num_hops=0)
 Predict the next order the vehicle will execute and resolve conditionals by recursion and return next non-conditional order in list.
 
void RefreshLinks (const Order *cur, const Order *next, uint8_t flags, uint num_hops=0)
 Iterate over orders starting at cur and next and refresh links associated with them.
 

Protected Attributes

Vehiclevehicle
 Vehicle for which the links should be refreshed.
 
CargoArray capacities {}
 Current added capacities per cargo ID in the consist.
 
RefitList refit_capacities
 Current state of capacity remaining from previous refits versus overall capacity per vehicle in the consist.
 
HopSet * seen_hops
 Hops already seen. If the same hop is seen twice we stop the algorithm. This is shared between all Refreshers of the same run.
 
CargoID cargo
 Cargo given in last refit order.
 
bool allow_merge
 If the refresher is allowed to merge or extend link graphs.
 
bool is_full_loading
 If the vehicle is full loading.
 

Detailed Description

Utility to refresh links a consist will visit.

Definition at line 19 of file refresh.h.

Member Typedef Documentation

◆ HopSet

typedef std::set<Hop> LinkRefresher::HopSet
protected

Definition at line 78 of file refresh.h.

◆ RefitList

typedef std::vector<RefitDesc> LinkRefresher::RefitList
protected

Definition at line 77 of file refresh.h.

Member Enumeration Documentation

◆ RefreshFlags

Various flags about properties of the last examined link that might have an influence on the next one.

Enumerator
USE_NEXT 

There was a conditional jump. Try to use the given next order when looking for a new one.

HAS_CARGO 

Consist could leave the last stop where it could interact with cargo carrying cargo (i.e. not an "unload all" + "no loading" order).

WAS_REFIT 

Consist was refit since the last stop where it could interact with cargo.

RESET_REFIT 

Consist had a chance to load since the last refit and the refit capacities can be reset.

IN_AUTOREFIT 

Currently doing an autorefit loop. Ignore the first autorefit order.

Definition at line 28 of file refresh.h.

Constructor & Destructor Documentation

◆ LinkRefresher()

LinkRefresher::LinkRefresher ( Vehicle vehicle,
HopSet *  seen_hops,
bool  allow_merge,
bool  is_full_loading 
)
protected

Constructor for link refreshing algorithm.

Parameters
vehicleVehicle to refresh links for.
seen_hopsSet of hops already seen. This is shared between this refresher and all its children.
allow_mergeIf the refresher is allowed to merge or extend link graphs.
is_full_loadingIf the vehicle is full loading.

Definition at line 69 of file refresh.cpp.

References capacities, Vehicle::Next(), NUM_CARGO, and refit_capacities.

Member Function Documentation

◆ HandleRefit()

bool LinkRefresher::HandleRefit ( CargoID  refit_cargo)
protected

Handle refit orders by updating capacities and refit_capacities.

Parameters
refit_cargoCargo to refit to.
Returns
True if any vehicle was refit; false if none was.

Definition at line 88 of file refresh.cpp.

References capacities, cargo, Engine::DetermineCapacity(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem<&_engine_pool >::Get(), GetBestFittingSubType(), HasBit(), Vehicle::Next(), refit_capacities, VEH_AIRCRAFT, and vehicle.

Referenced by RefreshLinks().

◆ PredictNextOrder()

const Order * LinkRefresher::PredictNextOrder ( const Order cur,
const Order next,
uint8_t  flags,
uint  num_hops = 0 
)
protected

Predict the next order the vehicle will execute and resolve conditionals by recursion and return next non-conditional order in list.

Parameters
curCurrent order being evaluated.
nextNext order to be evaluated.
flagsRefreshFlags to give hints about the previous link and state carried over from that.
num_hopsNumber of hops already taken by recursive calls to this method.
Returns
new next Order.

Definition at line 161 of file refresh.cpp.

References Order::GetConditionSkipToOrder(), OrderList::GetNext(), OrderList::GetNextDecisionNode(), OrderList::GetNumOrders(), OrderList::GetOrderAt(), HasBit(), Order::IsType(), Vehicle::orders, RefreshLinks(), SetBit(), USE_NEXT, and vehicle.

Referenced by RefreshLinks().

◆ RefreshLinks()

void LinkRefresher::RefreshLinks ( const Order cur,
const Order next,
uint8_t  flags,
uint  num_hops = 0 
)
protected

Iterate over orders starting at cur and next and refresh links associated with them.

cur and next can be equal. If they're not they must be "neighbours" in their order list, which means next must be directly reachable from cur without passing any further OT_GOTO_STATION or OT_IMPLICIT orders in between.

Parameters
curCurrent order being evaluated.
nextNext order to be checked.
flagsRefreshFlags to give hints about the previous link and state carried over from that.
num_hopsNumber of hops already taken by recursive calls to this method.

Definition at line 263 of file refresh.cpp.

References Order::CanLeaveWithCargo(), ClrBit(), CargoSpec::Get(), Order::GetRefitCargo(), HandleRefit(), HAS_CARGO, HasBit(), IN_AUTOREFIT, Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem< Tpool >::index, Order::IsAutoRefit(), Order::IsRefit(), Order::IsType(), NUM_CARGO, PredictNextOrder(), RefreshLinks(), RefreshStats(), RESET_REFIT, ResetRefit(), seen_hops, SetBit(), USE_NEXT, and WAS_REFIT.

Referenced by PredictNextOrder(), RefreshLinks(), and Run().

◆ RefreshStats()

◆ ResetRefit()

void LinkRefresher::ResetRefit ( )
protected

Restore capacities and refit_capacities as vehicle might have been able to load now.

Definition at line 143 of file refresh.cpp.

References capacities, and refit_capacities.

Referenced by RefreshLinks().

◆ Run()

void LinkRefresher::Run ( Vehicle v,
bool  allow_merge = true,
bool  is_full_loading = false 
)
static

Refresh all links the given vehicle will visit.

Parameters
vVehicle to refresh links for.
allow_mergeIf the refresher is allowed to merge or extend link graphs.
is_full_loadingIf the vehicle is full loading.

Definition at line 26 of file refresh.cpp.

References allow_merge, BaseConsist::cur_implicit_order_index, OrderList::GetNextDecisionNode(), Vehicle::GetOrder(), HAS_CARGO, is_full_loading, Vehicle::last_loading_station, Vehicle::orders, RefreshLinks(), and seen_hops.

Referenced by DeleteStaleLinks(), Vehicle::LeaveStation(), and LoadUnloadVehicle().

Field Documentation

◆ allow_merge

bool LinkRefresher::allow_merge
protected

If the refresher is allowed to merge or extend link graphs.

Definition at line 85 of file refresh.h.

Referenced by RefreshStats(), and Run().

◆ capacities

CargoArray LinkRefresher::capacities {}
protected

Current added capacities per cargo ID in the consist.

Definition at line 81 of file refresh.h.

Referenced by HandleRefit(), LinkRefresher(), RefreshStats(), and ResetRefit().

◆ cargo

CargoID LinkRefresher::cargo
protected

Cargo given in last refit order.

Definition at line 84 of file refresh.h.

Referenced by HandleRefit().

◆ is_full_loading

bool LinkRefresher::is_full_loading
protected

If the vehicle is full loading.

Definition at line 86 of file refresh.h.

Referenced by RefreshStats(), and Run().

◆ refit_capacities

RefitList LinkRefresher::refit_capacities
protected

Current state of capacity remaining from previous refits versus overall capacity per vehicle in the consist.

Definition at line 82 of file refresh.h.

Referenced by HandleRefit(), LinkRefresher(), and ResetRefit().

◆ seen_hops

HopSet* LinkRefresher::seen_hops
protected

Hops already seen. If the same hop is seen twice we stop the algorithm. This is shared between all Refreshers of the same run.

Definition at line 83 of file refresh.h.

Referenced by RefreshLinks(), and Run().

◆ vehicle

Vehicle* LinkRefresher::vehicle
protected

Vehicle for which the links should be refreshed.

Definition at line 80 of file refresh.h.

Referenced by HandleRefit(), PredictNextOrder(), and RefreshStats().


The documentation for this class was generated from the following files: