OpenTTD Source: CYapfBaseT< Types > Class Template Reference

OpenTTD Source 13.1

Public Types | Public Member Functions | Data Fields | Protected Member Functions | Protected Attributes
CYapfBaseT< Types > Class Template Reference

CYapfBaseT - A-star type path finder base class. More...

`#include <yapf_base.hpp>`

## Public Types
typedef Types::Tpf | Tpf
| the pathfinder class (derived from THIS class)
typedef Types::TrackFollower | TrackFollower
typedef Types::NodeList | NodeList
| our node list
typedef Types::VehicleType | VehicleType
| the type of vehicle
typedef NodeList::Titem | Node
| this will be our node type
typedef Node::Key | Key
| key to hash tables

## Public Member Functions
| CYapfBaseT ()
| default constructor
| ~CYapfBaseT ()
| default destructor
const YAPFSettings & | PfGetSettings () const
| return current settings (can be custom - company based - but later)
bool | FindPath (const VehicleType *v)
| Main pathfinder routine: More...
Node * | GetBestNode ()
| If path was found return the best node that has reached the destination. More...
Node & | CreateNewNode ()
| Calls NodeList::CreateNewNode() - allocates new node that can be filled and used as argument for AddStartupNode() or AddNewNode()
void | AddStartupNode (Node &n)
| Add new node (created by CreateNewNode and filled with data) into open list.
void | AddMultipleNodes (Node *parent, const TrackFollower &tf)
| add multiple nodes - direct children of the given node
void | PruneIntermediateNodeBranch (Node *n)
| In some cases an intermediate node branch should be pruned. More...
void | AddNewNode (Node &n, const TrackFollower &tf)
| AddNewNode() - called by Tderived::PfFollowNode() for each child node. More...
const VehicleType * | GetVehicle () const
void | DumpBase (DumpTarget &dmp) const

## Data Fields
NodeList | m_nodes
| node list multi-container
int | m_num_steps
| this is there for debugging purposes (hope it doesn't hurt)

## Protected Member Functions
Tpf & | Yapf ()
| to access inherited path finder

## Protected Attributes
Node * | m_pBestDestNode
| pointer to the destination node found at last round
Node * | m_pBestIntermediateNode
| here should be node closest to the destination if path not found
const YAPFSettings * | m_settings
| current settings (_settings_game.yapf)
int | m_max_search_nodes
| maximum number of nodes we are allowed to visit before we give up
const VehicleType * | m_veh
| vehicle that we are trying to drive
int | m_stats_cost_calcs
| stats - how many node's costs were calculated
int | m_stats_cache_hits
| stats - how many node's costs were reused from cache

## Detailed Description

### template<class Types>
class CYapfBaseT< Types >

CYapfBaseT - A-star type path finder base class.

Derive your own pathfinder from it. You must provide the following template argument: Types - used as collection of local types used in pathfinder

## Requirements for the Types struct:

The following types must be defined in the 'Types' argument:

- Types::Tpf - your pathfinder derived from CYapfBaseT
- Types::NodeList - open/closed node list (look at CNodeList_HashTableT) NodeList needs to have defined local type Titem - defines the pathfinder node type. Node needs to define local type Key - the node key in the collection ()

For node list you can use template class CNodeList_HashTableT, for which you need to declare only your node type. Look at test_yapf.h for an example.

## Requirements to your pathfinder class derived from CYapfBaseT:

Your pathfinder derived class needs to implement following methods: inline void PfSetStartupNodes() inline void PfFollowNode(Node &org) inline bool PfCalcCost(Node &n) inline bool PfCalcEstimate(Node &n) inline bool PfDetectDestination(Node &n)

For more details about those methods, look at the end of CYapfBaseT declaration. There are some examples. For another example look at test_yapf.h (part or unittest project).

Definition at line 47 of file yapf_base.hpp.

## Member Function Documentation

## ◆ AddNewNode()

template<class Types >

void CYapfBaseT< Types >::AddNewNode | ( | Node & | n,
|  | const TrackFollower & | tf
| ) |  |
| inline

AddNewNode() - called by Tderived::PfFollowNode() for each child node.

Nodes are evaluated here and added into open list

Definition at line 224 of file yapf_base.hpp.

References CYapfBaseT< Types >::m_max_search_nodes, CYapfBaseT< Types >::m_nodes, CYapfBaseT< Types >::m_pBestDestNode, CYapfBaseT< Types >::m_pBestIntermediateNode, CYapfBaseT< Types >::m_stats_cache_hits, CYapfBaseT< Types >::m_stats_cost_calcs, and CYapfBaseT< Types >::Yapf().

## ◆ FindPath()

template<class Types >

bool CYapfBaseT< Types >::FindPath | ( | const VehicleType * | v | ) |
| inline

Main pathfinder routine:

- set startup node(s)
- main loop that stops if:
  - the destination was found
  - or the open list is empty (no route to destination).
  - or the maximum amount of loops reached - m_max_search_nodes (default = 10000)
    Returns
      true if the path was found

Definition at line 111 of file yapf_base.hpp.

References CYapfBaseT< Types >::m_max_search_nodes, CYapfBaseT< Types >::m_nodes, CYapfBaseT< Types >::m_num_steps, CYapfBaseT< Types >::m_pBestDestNode, CYapfBaseT< Types >::m_veh, and CYapfBaseT< Types >::Yapf().

## ◆ GetBestNode()

template<class Types >

Node* CYapfBaseT< Types >::GetBestNode | ( |  | ) |
| inline

If path was found return the best node that has reached the destination.

Otherwise return the best visited node (which was nearest to the destination).

Definition at line 161 of file yapf_base.hpp.

References CYapfBaseT< Types >::m_pBestDestNode, and CYapfBaseT< Types >::m_pBestIntermediateNode.

## ◆ PruneIntermediateNodeBranch()

template<class Types >

void CYapfBaseT< Types >::PruneIntermediateNodeBranch | ( | Node * | n | ) |
| inline

In some cases an intermediate node branch should be pruned.

The most prominent case is when a red EOL signal is encountered, but there was a segment change (e.g. a rail type change) before that. If the branch would not be pruned, the rail type change location would remain the best intermediate node, and thus the vehicle would still go towards the red EOL signal.

Definition at line 210 of file yapf_base.hpp.

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

- src/pathfinder/yapf/yapf_base.hpp