mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-08-13 01:29:10 +00:00
ai
data
docs
lang
makefiledir
media
music
openttd.xcode
os
scenario
scripts
sound
strgen
table
video
yapf
unittest
array.hpp
autocopyptr.hpp
binaryheap.hpp
blob.hpp
countedptr.hpp
crc32.hpp
fixedsizearray.hpp
follow_track.cpp
follow_track.hpp
hashtable.hpp
nodelist.hpp
track_dir.hpp
yapf.h
yapf.hpp
yapf_base.hpp
yapf_common.cpp
yapf_common.hpp
yapf_costbase.hpp
yapf_costcache.hpp
yapf_costrail.hpp
yapf_destrail.hpp
yapf_node.hpp
yapf_node_rail.hpp
yapf_node_road.hpp
yapf_rail.cpp
yapf_road.cpp
yapf_settings.h
yapf_ship.cpp
BUGS
COPYING
Doxyfile
Makefile
aircraft.h
aircraft_cmd.c
aircraft_gui.c
airport.c
airport.h
airport_gui.c
airport_movement.h
aystar.c
aystar.h
bmp.c
bmp.h
bridge.h
bridge_gui.c
bridge_map.c
bridge_map.h
callback_table.c
callback_table.h
changelog.txt
clear_cmd.c
clear_map.h
command.c
command.h
configure
console.c
console.h
console_cmds.c
currency.c
currency.h
date.c
date.h
debug.c
debug.h
dedicated.c
depot.c
depot.h
direction.h
disaster_cmd.c
dock_gui.c
driver.c
driver.h
dummy_land.c
economy.c
economy.h
elrail.c
endian_check.c
engine.c
engine.h
engine_gui.c
fileio.c
fileio.h
fios.c
fios.h
functions.h
genworld.c
genworld.h
genworld_gui.c
gfx.c
gfx.h
gfxinit.c
gfxinit.h
graph_gui.c
gui.h
hal.h
heightmap.c
heightmap.h
industry.h
industry_cmd.c
industry_gui.c
industry_map.h
intro_gui.c
known-bugs.txt
landscape.c
langs.vcproj
langs_vs80.vcproj
lzoconf.h
macros.h
main_gui.c
mainicon.ico
map.c
map.h
masm64.rules
md5.c
md5.h
mersenne.c
minilzo.c
minilzo.h
misc.c
misc_cmd.c
misc_gui.c
mixer.c
mixer.h
music.c
music.h
music_gui.c
namegen.c
namegen.h
network.c
network.h
network_client.c
network_client.h
network_core.h
network_data.c
network_data.h
network_gamelist.c
network_gamelist.h
network_gui.c
network_gui.h
network_server.c
network_server.h
network_udp.c
network_udp.h
newgrf.c
newgrf.h
newgrf_callbacks.h
newgrf_cargo.c
newgrf_cargo.h
newgrf_engine.c
newgrf_engine.h
newgrf_spritegroup.c
newgrf_spritegroup.h
newgrf_station.c
newgrf_station.h
newgrf_text.c
newgrf_text.h
news.h
news_gui.c
npf.c
npf.h
oldloader.c
openttd.c
openttd.h
openttd.ico
openttd.sln
openttd.tgt
openttd.vcproj
openttd_vs80.sln
openttd_vs80.vcproj
order.h
order_cmd.c
order_gui.c
os2.c
os_timer.c
ottdres.rc
pathfind.c
pathfind.h
player.h
player_gui.c
players.c
pool.c
pool.h
queue.c
queue.h
rail.c
rail.h
rail_cmd.c
rail_gui.c
rail_map.h
railtypes.h
readme.txt
resource.h
road.h
road_cmd.c
road_cmd.h
road_gui.c
road_map.c
road_map.h
roadveh.h
roadveh_cmd.c
roadveh_gui.c
saveload.c
saveload.h
screenshot.c
screenshot.h
sdl.c
sdl.h
settings.c
settings.h
settings_gui.c
ship.h
ship_cmd.c
ship_gui.c
signs.c
signs.h
slope.h
smallmap_gui.c
sound.c
sound.h
sprite.h
spritecache.c
spritecache.h
station.h
station_cmd.c
station_gui.c
station_map.c
station_map.h
stdafx.h
string.c
string.h
strings.c
strings.h
subsidy_gui.c
svnup.sh
terraform_gui.c
texteff.c
tgp.c
tgp.h
thread.c
thread.h
tile.c
tile.h
town.h
town_cmd.c
town_gui.c
town_map.h
train.h
train_cmd.c
train_gui.c
tree_cmd.c
tree_map.h
tunnel_map.c
tunnel_map.h
tunnelbridge_cmd.c
unix.c
unmovable.h
unmovable_cmd.c
unmovable_map.h
variables.h
vehicle.c
vehicle.h
vehicle_gui.c
vehicle_gui.h
viewport.c
viewport.h
void_map.h
water_cmd.c
water_map.h
waypoint.c
waypoint.h
widget.c
win32.c
win32.h
win64.asm
window.c
window.h
yapf.txt
114 lines
3.8 KiB
C++
114 lines
3.8 KiB
C++
/* $Id$ */
|
|
|
|
#ifndef YAPF_NODE_RAIL_HPP
|
|
#define YAPF_NODE_RAIL_HPP
|
|
|
|
/** key for cached segment cost for rail YAPF */
|
|
struct CYapfRailSegmentKey
|
|
{
|
|
uint32 m_value;
|
|
|
|
FORCEINLINE CYapfRailSegmentKey(const CYapfRailSegmentKey& src) : m_value(src.m_value) {}
|
|
FORCEINLINE CYapfRailSegmentKey(const CYapfNodeKeyExitDir& node_key) {Set(node_key);}
|
|
|
|
FORCEINLINE void Set(const CYapfRailSegmentKey& src) {m_value = src.m_value;}
|
|
FORCEINLINE void Set(const CYapfNodeKeyExitDir& node_key) {m_value = (((int)node_key.m_tile) << 2) | node_key.m_exitdir;}
|
|
|
|
FORCEINLINE int32 CalcHash() const {return m_value;}
|
|
FORCEINLINE TileIndex GetTile() const {return (TileIndex)(m_value >> 2);}
|
|
FORCEINLINE DiagDirection GetExitDir() const {return (DiagDirection)(m_value & 3);}
|
|
FORCEINLINE bool operator == (const CYapfRailSegmentKey& other) const {return m_value == other.m_value;}
|
|
};
|
|
|
|
/** cached segment cost for rail YAPF */
|
|
struct CYapfRailSegment
|
|
{
|
|
typedef CYapfRailSegmentKey Key;
|
|
|
|
CYapfRailSegmentKey m_key;
|
|
TileIndex m_last_tile;
|
|
Trackdir m_last_td;
|
|
int m_cost;
|
|
TileIndex m_last_signal_tile;
|
|
Trackdir m_last_signal_td;
|
|
CYapfRailSegment* m_hash_next;
|
|
union {
|
|
byte m_flags;
|
|
struct {
|
|
bool m_end_of_line : 1;
|
|
} flags_s;
|
|
} flags_u;
|
|
byte m_reserve[3];
|
|
|
|
FORCEINLINE CYapfRailSegment(const CYapfRailSegmentKey& key)
|
|
: m_key(key)
|
|
, m_last_tile(INVALID_TILE)
|
|
, m_last_td(INVALID_TRACKDIR)
|
|
, m_cost(-1)
|
|
, m_last_signal_tile(INVALID_TILE)
|
|
, m_last_signal_td(INVALID_TRACKDIR)
|
|
, m_hash_next(NULL)
|
|
{
|
|
flags_u.m_flags = 0;
|
|
}
|
|
|
|
FORCEINLINE const Key& GetKey() const {return m_key;}
|
|
FORCEINLINE TileIndex GetTile() const {return m_key.GetTile();}
|
|
FORCEINLINE DiagDirection GetExitDir() const {return m_key.GetExitDir();}
|
|
FORCEINLINE CYapfRailSegment* GetHashNext() {return m_hash_next;}
|
|
FORCEINLINE void SetHashNext(CYapfRailSegment* next) {m_hash_next = next;}
|
|
};
|
|
|
|
/** Yapf Node for rail YAPF */
|
|
template <class Tkey_>
|
|
struct CYapfRailNodeT
|
|
: CYapfNodeT<Tkey_, CYapfRailNodeT<Tkey_> >
|
|
{
|
|
typedef CYapfNodeT<Tkey_, CYapfRailNodeT<Tkey_> > base;
|
|
typedef CYapfRailSegment CachedData;
|
|
|
|
CYapfRailSegment *m_segment;
|
|
uint16 m_num_signals_passed;
|
|
union {
|
|
uint32 m_inherited_flags;
|
|
struct {
|
|
bool m_targed_seen : 1;
|
|
bool m_choice_seen : 1;
|
|
bool m_last_signal_was_red : 1;
|
|
} flags_s;
|
|
} flags_u;
|
|
SignalType m_last_red_signal_type;
|
|
|
|
FORCEINLINE void Set(CYapfRailNodeT* parent, TileIndex tile, Trackdir td, bool is_choice)
|
|
{
|
|
base::Set(parent, tile, td, is_choice);
|
|
m_segment = NULL;
|
|
if (parent == NULL) {
|
|
m_num_signals_passed = 0;
|
|
flags_u.m_inherited_flags = 0;
|
|
m_last_red_signal_type = SIGTYPE_NORMAL;
|
|
} else {
|
|
m_num_signals_passed = parent->m_num_signals_passed;
|
|
flags_u.m_inherited_flags = parent->flags_u.m_inherited_flags;
|
|
m_last_red_signal_type = parent->m_last_red_signal_type;
|
|
}
|
|
flags_u.flags_s.m_choice_seen |= is_choice;
|
|
}
|
|
|
|
FORCEINLINE TileIndex GetLastTile() const {assert(m_segment != NULL); return m_segment->m_last_tile;}
|
|
FORCEINLINE Trackdir GetLastTrackdir() const {assert(m_segment != NULL); return m_segment->m_last_td;}
|
|
FORCEINLINE void SetLastTileTrackdir(TileIndex tile, Trackdir td) {assert(m_segment != NULL); m_segment->m_last_tile = tile; m_segment->m_last_td = td;}
|
|
};
|
|
|
|
// now define two major node types (that differ by key type)
|
|
typedef CYapfRailNodeT<CYapfNodeKeyExitDir> CYapfRailNodeExitDir;
|
|
typedef CYapfRailNodeT<CYapfNodeKeyTrackDir> CYapfRailNodeTrackDir;
|
|
|
|
// Default NodeList types
|
|
typedef CNodeList_HashTableT<CYapfRailNodeExitDir , 10, 12> CRailNodeListExitDir;
|
|
typedef CNodeList_HashTableT<CYapfRailNodeTrackDir, 12, 16> CRailNodeListTrackDir;
|
|
|
|
|
|
|
|
#endif /* YAPF_NODE_RAIL_HPP */
|