OpenTTD Source  20240917-master-g9ab0a47812
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. More...
 

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. More...
 
bool HandleRefit (CargoID refit_cargo)
 Handle refit orders by updating capacities and refit_capacities. More...
 
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. More...
 
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. More...
 
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. More...
 

Protected Attributes

Vehiclevehicle
 Vehicle for which the links should be refreshed.
 
uint capacities [NUM_CARGO]
 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 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.

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 90 of file refresh.cpp.

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

◆ 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 163 of file refresh.cpp.

References HasBit(), Order::IsType(), and USE_NEXT.

◆ 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 265 of file refresh.cpp.

References Order::IsType().

Referenced by Run().

◆ RefreshStats()

void LinkRefresher::RefreshStats ( const Order cur,
const Order next 
)
protected

Refresh link stats for the given pair of orders.

Parameters
curLast stop where the consist could interact with cargo.
nextNext order to be processed.

Definition at line 201 of file refresh.cpp.

References Order::GetDestination(), and SpecializedStation< Station, false >::GetIfValid().

◆ 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(), is_full_loading, Vehicle::last_loading_station, Vehicle::orders, RefreshLinks(), and seen_hops.


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