diff --git a/src/base_consist.h b/src/base_consist.h index 0cac82aacd..ebb5d594d7 100644 --- a/src/base_consist.h +++ b/src/base_consist.h @@ -13,11 +13,11 @@ #include "order_type.h" #include "date_type.h" #include "timetable.h" -#include +#include "core/tinystring_type.hpp" /** Various front vehicle properties that are preserved when autoreplacing, using order-backup or switching front engines within a consist. */ struct BaseConsist { - std::string name; ///< Name of vehicle + TinyString name; ///< Name of vehicle /* Used for timetabling. */ uint32 current_order_time; ///< How many ticks have passed since this order started. diff --git a/src/base_station_base.h b/src/base_station_base.h index d14e53ebe5..524779c40e 100644 --- a/src/base_station_base.h +++ b/src/base_station_base.h @@ -15,6 +15,7 @@ #include "viewport_type.h" #include "station_map.h" #include "core/geometry_type.hpp" +#include "core/tinystring_type.hpp" #include typedef Pool StationPool; @@ -56,7 +57,7 @@ struct BaseStation : StationPool::PoolItem<&_station_pool> { TrackedViewportSign sign; ///< NOSAVE: Dimensions of sign byte delete_ctr; ///< Delete counter. If greater than 0 then it is decremented until it reaches 0; the waypoint is then is deleted. - std::string name; ///< Custom name + TinyString name; ///< Custom name StringID string_id; ///< Default name (town area) of station mutable std::string cached_name; ///< NOSAVE: Cache of the resolved name of the station, if not using a custom name diff --git a/src/depot_base.h b/src/depot_base.h index f4c52cffe8..48b9154166 100644 --- a/src/depot_base.h +++ b/src/depot_base.h @@ -12,13 +12,14 @@ #include "depot_map.h" #include "core/pool_type.hpp" +#include "core/tinystring_type.hpp" typedef Pool DepotPool; extern DepotPool _depot_pool; struct Depot : DepotPool::PoolItem<&_depot_pool> { Town *town; - std::string name; + TinyString name; TileIndex xy; uint16 town_cn; ///< The N-1th depot for this town (consecutive number) diff --git a/src/engine_base.h b/src/engine_base.h index 883926a25d..40bc37b905 100644 --- a/src/engine_base.h +++ b/src/engine_base.h @@ -13,13 +13,14 @@ #include "engine_type.h" #include "vehicle_type.h" #include "core/pool_type.hpp" +#include "core/tinystring_type.hpp" #include "newgrf_commons.h" typedef Pool EnginePool; extern EnginePool _engine_pool; struct Engine : EnginePool::PoolItem<&_engine_pool> { - std::string name; ///< Custom name of engine. + TinyString name; ///< Custom name of engine. Date intro_date; ///< Date of introduction of the engine. Date age; uint16 reliability; ///< Current reliability of the engine. diff --git a/src/saveload/depot_sl.cpp b/src/saveload/depot_sl.cpp index eedfcfd83c..e2560422b9 100644 --- a/src/saveload/depot_sl.cpp +++ b/src/saveload/depot_sl.cpp @@ -23,7 +23,7 @@ static const SaveLoad _depot_desc[] = { SLEG_CONDVAR(_town_index, SLE_UINT16, SL_MIN_VERSION, SLV_141), SLE_CONDREF(Depot, town, REF_TOWN, SLV_141, SL_MAX_VERSION), SLE_CONDVAR(Depot, town_cn, SLE_UINT16, SLV_141, SL_MAX_VERSION), - SLE_CONDSSTR(Depot, name, SLE_STR, SLV_141, SL_MAX_VERSION), + SLE_CONDSTR(Depot, name, SLE_STR, 0, SLV_141, SL_MAX_VERSION), SLE_CONDVAR(Depot, build_date, SLE_INT32, SLV_142, SL_MAX_VERSION), SLE_CONDNULL_X(4, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP, 5)), SLE_END() diff --git a/src/saveload/engine_sl.cpp b/src/saveload/engine_sl.cpp index 863aabff07..20e2596b3d 100644 --- a/src/saveload/engine_sl.cpp +++ b/src/saveload/engine_sl.cpp @@ -39,7 +39,7 @@ static const SaveLoad _engine_desc[] = { SLE_CONDVAR(Engine, company_avail, SLE_FILE_U8 | SLE_VAR_U16, SL_MIN_VERSION, SLV_104), SLE_CONDVAR(Engine, company_avail, SLE_UINT16, SLV_104, SL_MAX_VERSION), SLE_CONDVAR(Engine, company_hidden, SLE_UINT16, SLV_193, SL_MAX_VERSION), - SLE_CONDSSTR(Engine, name, SLE_STR, SLV_84, SL_MAX_VERSION), + SLE_CONDSTR(Engine, name, SLE_STR, 0, SLV_84, SL_MAX_VERSION), SLE_CONDNULL(16, SLV_2, SLV_144), // old reserved space diff --git a/src/saveload/saveload.cpp b/src/saveload/saveload.cpp index 9490c531e1..3424f14695 100644 --- a/src/saveload/saveload.cpp +++ b/src/saveload/saveload.cpp @@ -893,6 +893,7 @@ void WriteValue(void *ptr, VarType conv, int64 val) case SLE_VAR_I64: *(int64 *)ptr = val; break; case SLE_VAR_U64: *(uint64*)ptr = val; break; case SLE_VAR_NAME: *reinterpret_cast(ptr) = CopyFromOldName(val); break; + case SLE_VAR_CNAME: *(TinyString*)ptr = CopyFromOldName(val); break; case SLE_VAR_NULL: break; default: NOT_REACHED(); } diff --git a/src/saveload/saveload.h b/src/saveload/saveload.h index 785d822229..3a532bbef0 100644 --- a/src/saveload/saveload.h +++ b/src/saveload/saveload.h @@ -465,8 +465,9 @@ enum VarTypes { SLE_VAR_STRBQ = 11 << 4, ///< string enclosed in quotes (with pre-allocated buffer) SLE_VAR_STR = 12 << 4, ///< string pointer SLE_VAR_STRQ = 13 << 4, ///< string pointer enclosed in quotes - SLE_VAR_NAME = 14 << 4, ///< old custom name to be converted to a char pointer - /* 1 more possible memory-primitives */ + SLE_VAR_NAME = 14 << 4, ///< old custom name to be converted to a std::string + SLE_VAR_CNAME = 15 << 4, ///< old custom name to be converted to a char pointer + /* 0 more possible memory-primitives */ /* Shortcut values */ SLE_VAR_CHAR = SLE_VAR_I8, @@ -490,6 +491,7 @@ enum VarTypes { SLE_STRING = SLE_FILE_STRING | SLE_VAR_STR, SLE_STRINGQUOTE = SLE_FILE_STRING | SLE_VAR_STRQ, SLE_NAME = SLE_FILE_STRINGID | SLE_VAR_NAME, + SLE_CNAME = SLE_FILE_STRINGID | SLE_VAR_CNAME, /* Shortcut values */ SLE_UINT = SLE_UINT32, diff --git a/src/saveload/station_sl.cpp b/src/saveload/station_sl.cpp index 8bcbe6c5a5..987be23127 100644 --- a/src/saveload/station_sl.cpp +++ b/src/saveload/station_sl.cpp @@ -65,7 +65,7 @@ void MoveBuoysToWaypoints() TileIndex xy = st->xy; Town *town = st->town; StringID string_id = st->string_id; - std::string name = st->name; + TinyString name = std::move(st->name); Date build_date = st->build_date; /* TTDPatch could use "buoys with rail station" for rail waypoints */ bool train = st->train_station.tile != INVALID_TILE; @@ -80,7 +80,7 @@ void MoveBuoysToWaypoints() Waypoint *wp = new (index) Waypoint(xy); wp->town = town; wp->string_id = train ? STR_SV_STNAME_WAYPOINT : STR_SV_STNAME_BUOY; - wp->name = name; + wp->name = std::move(name); wp->delete_ctr = 0; // Just reset delete counter for once. wp->build_date = build_date; wp->owner = train ? GetTileOwner(xy) : OWNER_NONE; @@ -178,7 +178,7 @@ static const SaveLoad _old_station_desc[] = { SLE_CONDNULL(1, SL_MIN_VERSION, SLV_4), ///< alpha_order SLE_VAR(Station, string_id, SLE_STRINGID), - SLE_CONDSSTR(Station, name, SLE_STR | SLF_ALLOW_CONTROL, SLV_84, SL_MAX_VERSION), + SLE_CONDSTR(Station, name, SLE_STR | SLF_ALLOW_CONTROL, 0, SLV_84, SL_MAX_VERSION), SLE_CONDVAR(Station, indtype, SLE_UINT8, SLV_103, SL_MAX_VERSION), SLE_CONDVAR(Station, had_vehicle_of_type, SLE_FILE_U16 | SLE_VAR_U8, SL_MIN_VERSION, SLV_122), SLE_CONDVAR(Station, had_vehicle_of_type, SLE_UINT8, SLV_122, SL_MAX_VERSION), @@ -399,7 +399,8 @@ static const SaveLoad _base_station_desc[] = { SLE_VAR(BaseStation, xy, SLE_UINT32), SLE_REF(BaseStation, town, REF_TOWN), SLE_VAR(BaseStation, string_id, SLE_STRINGID), - SLE_SSTR(BaseStation, name, SLE_STR | SLF_ALLOW_CONTROL), + SLE_STR(BaseStation, name, SLE_STR | SLF_ALLOW_CONTROL, 0), + SLE_CONDVAR_X(Station, delete_ctr, SLE_UINT8, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP, 0, 3)), SLE_CONDVAR_X(Station, delete_ctr, SLE_FILE_U16 | SLE_VAR_U8, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SPRINGPP, 4)), SLE_VAR(BaseStation, owner, SLE_UINT8), diff --git a/src/saveload/town_sl.cpp b/src/saveload/town_sl.cpp index 5222f47e7c..3bfcfe376f 100644 --- a/src/saveload/town_sl.cpp +++ b/src/saveload/town_sl.cpp @@ -133,7 +133,7 @@ static const SaveLoad _town_desc[] = { SLE_CONDVAR(Town, townnamegrfid, SLE_UINT32, SLV_66, SL_MAX_VERSION), SLE_VAR(Town, townnametype, SLE_UINT16), SLE_VAR(Town, townnameparts, SLE_UINT32), - SLE_CONDSSTR(Town, name, SLE_STR | SLF_ALLOW_CONTROL, SLV_84, SL_MAX_VERSION), + SLE_CONDSTR(Town, name, SLE_STR | SLF_ALLOW_CONTROL, 0, SLV_84, SL_MAX_VERSION), SLE_VAR(Town, flags, SLE_UINT8), SLE_CONDVAR(Town, statues, SLE_FILE_U8 | SLE_VAR_U16, SL_MIN_VERSION, SLV_104), diff --git a/src/saveload/vehicle_sl.cpp b/src/saveload/vehicle_sl.cpp index 8df267be59..70c473690f 100644 --- a/src/saveload/vehicle_sl.cpp +++ b/src/saveload/vehicle_sl.cpp @@ -621,8 +621,8 @@ const SaveLoad *GetVehicleDescription(VehicleType vt) SLE_VAR(Vehicle, subtype, SLE_UINT8), SLE_REF(Vehicle, next, REF_VEHICLE_OLD), - SLE_CONDVAR(Vehicle, name, SLE_NAME, SL_MIN_VERSION, SLV_84), - SLE_CONDSSTR(Vehicle, name, SLE_STR | SLF_ALLOW_CONTROL, SLV_84, SL_MAX_VERSION), + SLE_CONDVAR(Vehicle, name, SLE_CNAME, SL_MIN_VERSION, SLV_84), + SLE_CONDSTR(Vehicle, name, SLE_STR | SLF_ALLOW_CONTROL, 0, SLV_84, SL_MAX_VERSION), SLE_CONDVAR(Vehicle, unitnumber, SLE_FILE_U8 | SLE_VAR_U16, SL_MIN_VERSION, SLV_8), SLE_CONDVAR(Vehicle, unitnumber, SLE_UINT16, SLV_8, SL_MAX_VERSION), SLE_VAR(Vehicle, owner, SLE_UINT8), diff --git a/src/saveload/waypoint_sl.cpp b/src/saveload/waypoint_sl.cpp index 4117a591ee..390b403e68 100644 --- a/src/saveload/waypoint_sl.cpp +++ b/src/saveload/waypoint_sl.cpp @@ -29,7 +29,7 @@ struct OldWaypoint { Town *town; uint16 town_cn; StringID string_id; - std::string name; + TinyString name; uint8 delete_ctr; Date build_date; uint8 localidx; @@ -118,7 +118,7 @@ void MoveWaypointsToBaseStations() Waypoint *new_wp = new Waypoint(t); new_wp->town = wp.town; new_wp->town_cn = wp.town_cn; - new_wp->name = wp.name; + new_wp->name = std::move(wp.name); new_wp->delete_ctr = 0; // Just reset delete counter for once. new_wp->build_date = wp.build_date; new_wp->owner = wp.owner; @@ -172,7 +172,7 @@ static const SaveLoad _old_waypoint_desc[] = { SLE_CONDVAR(OldWaypoint, town_cn, SLE_FILE_U8 | SLE_VAR_U16, SLV_12, SLV_89), SLE_CONDVAR(OldWaypoint, town_cn, SLE_UINT16, SLV_89, SL_MAX_VERSION), SLE_CONDVAR(OldWaypoint, string_id, SLE_STRINGID, SL_MIN_VERSION, SLV_84), - SLE_CONDSSTR(OldWaypoint, name, SLE_STR, SLV_84, SL_MAX_VERSION), + SLE_CONDSTR(OldWaypoint, name, SLE_STR, 0, SLV_84, SL_MAX_VERSION), SLE_VAR(OldWaypoint, delete_ctr, SLE_UINT8), SLE_CONDVAR(OldWaypoint, build_date, SLE_FILE_U16 | SLE_VAR_I32, SLV_3, SLV_31), diff --git a/src/town.h b/src/town.h index dc3c27c863..187cb3e26a 100644 --- a/src/town.h +++ b/src/town.h @@ -19,6 +19,7 @@ #include "openttd.h" #include "table/strings.h" #include "company_func.h" +#include "core/tinystring_type.hpp" #include #include @@ -63,7 +64,7 @@ struct Town : TownPool::PoolItem<&_town_pool> { uint32 townnamegrfid; uint16 townnametype; uint32 townnameparts; - std::string name; ///< Custom town name. If empty, the town was not renamed and uses the generated name. + TinyString name; ///< Custom town name. If empty, the town was not renamed and uses the generated name. mutable std::string cached_name; ///< NOSAVE: Cache of the resolved name of the town, if not using a custom town name byte flags; ///< See #TownFlags. diff --git a/src/vehicle_cmd.cpp b/src/vehicle_cmd.cpp index 885bac8654..6e81ccc0cc 100644 --- a/src/vehicle_cmd.cpp +++ b/src/vehicle_cmd.cpp @@ -801,29 +801,30 @@ static bool IsUniqueVehicleName(const char *name) static void CloneVehicleName(const Vehicle *src, Vehicle *dst) { std::string buf; + std::string src_name = src->name.c_str(); /* Find the position of the first digit in the last group of digits. */ size_t number_position; - for (number_position = src->name.length(); number_position > 0; number_position--) { + for (number_position = src_name.length(); number_position > 0; number_position--) { /* The design of UTF-8 lets this work simply without having to check * for UTF-8 sequences. */ - if (src->name[number_position - 1] < '0' || src->name[number_position - 1] > '9') break; + if (src_name[number_position - 1] < '0' || src_name[number_position - 1] > '9') break; } /* Format buffer and determine starting number. */ long num; byte padding = 0; - if (number_position == src->name.length()) { + if (number_position == src_name.length()) { /* No digit at the end, so start at number 2. */ - buf = src->name; + buf = src_name; buf += " "; number_position = buf.length(); num = 2; } else { /* Found digits, parse them and start at the next number. */ - buf = src->name.substr(0, number_position); + buf = src_name.substr(0, number_position); - auto num_str = src->name.substr(number_position); + auto num_str = src_name.substr(number_position); padding = (byte)num_str.length(); std::istringstream iss(num_str);