diff --git a/src/sl/company_sl.cpp b/src/sl/company_sl.cpp index 8360a94508..34023f5ec8 100644 --- a/src/sl/company_sl.cpp +++ b/src/sl/company_sl.cpp @@ -491,7 +491,7 @@ static void Save_PLYR() { for (Company *c : Company::Iterate()) { SlSetArrayIndex(c->index); - SlAutolength((AutolengthProc*)SaveLoad_PLYR, c); + SlAutolength(SaveLoad_PLYR, c); } } diff --git a/src/sl/linkgraph_sl.cpp b/src/sl/linkgraph_sl.cpp index ce5830b6e7..ac781c4a7b 100644 --- a/src/sl/linkgraph_sl.cpp +++ b/src/sl/linkgraph_sl.cpp @@ -336,7 +336,7 @@ static void Save_LGRP() FilterDescs(); for (LinkGraph *lg : LinkGraph::Iterate()) { SlSetArrayIndex(lg->index); - SlAutolength((AutolengthProc*)DoSave_LGRP, lg); + SlAutolength(DoSave_LGRP, lg); } } @@ -348,7 +348,7 @@ static void Save_LGRJ() FilterDescs(); for (LinkGraphJob *lgj : LinkGraphJob::Iterate()) { SlSetArrayIndex(lgj->index); - SlAutolength((AutolengthProc*)DoSave_LGRJ, lgj); + SlAutolength(DoSave_LGRJ, lgj); } } diff --git a/src/sl/order_sl.cpp b/src/sl/order_sl.cpp index f1ad9a8230..7c2af243d0 100644 --- a/src/sl/order_sl.cpp +++ b/src/sl/order_sl.cpp @@ -364,14 +364,13 @@ static void Save_ORDL() SetupDescs_ORDL(); for (OrderList *list : OrderList::Iterate()) { SlSetArrayIndex(list->index); - SlAutolength([](void *data) { - OrderList *list = static_cast(data); + SlAutolength([&]() { SlObjectSaveFiltered(list, _filtered_ordl_desc); SlWriteUint32(list->GetScheduledDispatchScheduleCount()); for (DispatchSchedule &ds : list->GetScheduledDispatchScheduleSet()) { SaveDispatchSchedule(ds); } - }, list); + }); } } @@ -458,14 +457,13 @@ void Save_BKOR() for (OrderBackup *ob : OrderBackup::Iterate()) { SlSetArrayIndex(ob->index); - SlAutolength([](void *data) { - OrderBackup *ob = static_cast(data); + SlAutolength([&]() { SlObject(ob, GetOrderBackupDescription()); SlWriteUint32((uint)ob->dispatch_schedules.size()); for (DispatchSchedule &ds : ob->dispatch_schedules) { SaveDispatchSchedule(ds); } - }, ob); + }); } } diff --git a/src/sl/plans_sl.cpp b/src/sl/plans_sl.cpp index 89e83dd07e..f3544b4839 100644 --- a/src/sl/plans_sl.cpp +++ b/src/sl/plans_sl.cpp @@ -40,7 +40,7 @@ static void Save_PLAN() { for (Plan *p : Plan::Iterate()) { SlSetArrayIndex(p->index); - SlAutolength((AutolengthProc*) RealSave_PLAN, p); + SlAutolength(RealSave_PLAN, p); } } diff --git a/src/sl/saveload.cpp b/src/sl/saveload.cpp index d96f92e8f1..1ad1459931 100644 --- a/src/sl/saveload.cpp +++ b/src/sl/saveload.cpp @@ -2383,19 +2383,17 @@ void SlGlobList(const SaveLoadTable &slt) SlObject(nullptr, slt); } -/** - * Do something of which I have no idea what it is :P - * @param proc The callback procedure that is called - * @param arg The variable that will be used for the callback procedure - */ -void SlAutolength(AutolengthProc *proc, void *arg) +void SlAutolengthSetup() { assert(_sl.action == SLA_SAVE); assert(_sl.need_length == NL_WANTLENGTH); _sl.need_length = NL_NONE; _sl.dumper->StartAutoLength(); - proc(arg); +} + +void SlAutolengthCompletion() +{ auto result = _sl.dumper->StopAutoLength(); /* Setup length */ _sl.need_length = NL_WANTLENGTH; diff --git a/src/sl/saveload.h b/src/sl/saveload.h index b63d685fdf..18c3ae9097 100644 --- a/src/sl/saveload.h +++ b/src/sl/saveload.h @@ -83,7 +83,6 @@ bool IsNetworkServerSave(); bool IsScenarioSave(); typedef void ChunkSaveLoadProc(); -typedef void AutolengthProc(void *arg); void SlUnreachablePlaceholder(); @@ -980,12 +979,27 @@ void WriteValue(void *ptr, VarType conv, int64_t val); void SlSetArrayIndex(uint index); int SlIterateArray(); -void SlAutolength(AutolengthProc *proc, void *arg); size_t SlGetFieldLength(); void SlSetLength(size_t length); size_t SlCalcObjMemberLength(const void *object, const SaveLoad &sld); size_t SlCalcObjLength(const void *object, const SaveLoadTable &slt); +/** + * Run proc, automatically prepending the written length + * @param proc The callback procedure that is called + * @param args Any + */ +template +void SlAutolength(F proc, Args... args) +{ + extern void SlAutolengthSetup(); + extern void SlAutolengthCompletion(); + + SlAutolengthSetup(); + proc(std::forward(args)...); + SlAutolengthCompletion(); +} + /** * Run proc, saving result in the autolength temp buffer * @param proc The callback procedure that is called diff --git a/src/sl/station_sl.cpp b/src/sl/station_sl.cpp index 7acb434382..1555acdb6e 100644 --- a/src/sl/station_sl.cpp +++ b/src/sl/station_sl.cpp @@ -622,7 +622,7 @@ static void Save_STNN() /* Write the stations */ for (BaseStation *st : BaseStation::Iterate()) { SlSetArrayIndex(st->index); - SlAutolength((AutolengthProc*)RealSave_STNN, st); + SlAutolength(RealSave_STNN, st); } } diff --git a/src/sl/town_sl.cpp b/src/sl/town_sl.cpp index 754cbda0e7..008b4acd3f 100644 --- a/src/sl/town_sl.cpp +++ b/src/sl/town_sl.cpp @@ -317,7 +317,7 @@ static void Save_TOWN() SetupDescs_TOWN(); for (Town *t : Town::Iterate()) { SlSetArrayIndex(t->index); - SlAutolength((AutolengthProc*)RealSave_Town, t); + SlAutolength(RealSave_Town, t); } } diff --git a/src/sl/vehicle_sl.cpp b/src/sl/vehicle_sl.cpp index 5e76094215..8885b129e2 100644 --- a/src/sl/vehicle_sl.cpp +++ b/src/sl/vehicle_sl.cpp @@ -1316,7 +1316,7 @@ void Save_VENC() return; } - SlAutolength([](void *) { + SlAutolength([]() { int types[4] = {}; int total = 0; for (Vehicle *v : Vehicle::Iterate()) { @@ -1377,7 +1377,7 @@ void Save_VENC() SlWriteUint32(a->index); SlWriteUint16(a->acache.cached_max_range); } - }, nullptr); + }); } void Load_VENC() @@ -1610,7 +1610,7 @@ void Save_VLKA() for (Train *t : Train::Iterate()) { if (t->lookahead != nullptr) { SlSetArrayIndex(t->index); - SlAutolength((AutolengthProc*) RealSave_VLKA, t->lookahead.get()); + SlAutolength(RealSave_VLKA, t->lookahead.get()); } } }