Saveload: Add helper to conditionally save template functor

This commit is contained in:
Jonathan G Rennison
2023-08-14 18:51:00 +01:00
parent f378167951
commit e3021de408
3 changed files with 44 additions and 0 deletions

View File

@@ -2073,6 +2073,26 @@ std::pair<byte *, size_t> SlSaveToTempBufferRestore(uint8 state)
return result; return result;
} }
SlConditionallySaveState SlConditionallySaveSetup()
{
assert(_sl.action == SLA_SAVE);
if (_sl.dumper->IsAutoLengthActive()) {
return { (size_t)(_sl.dumper->buf - _sl.dumper->autolen_buf), 0, true };
} else {
return { 0, SlSaveToTempBufferSetup(), false };
}
}
extern void SlConditionallySaveCompletion(const SlConditionallySaveState &state, bool save)
{
if (state.nested) {
if (!save) _sl.dumper->buf = _sl.dumper->autolen_buf + state.current_len;
} else {
auto result = SlSaveToTempBufferRestore(state.need_length);
if (save) _sl.dumper->CopyBytes(result.first, result.second);
}
}
SlLoadFromBufferState SlLoadFromBufferSetup(const byte *buffer, size_t length) SlLoadFromBufferState SlLoadFromBufferSetup(const byte *buffer, size_t length)
{ {
assert(_sl.action == SLA_LOAD || _sl.action == SLA_LOAD_CHECK); assert(_sl.action == SLA_LOAD || _sl.action == SLA_LOAD_CHECK);

View File

@@ -747,6 +747,29 @@ std::vector<uint8> SlSaveToVector(F proc)
return std::vector<uint8>(result.begin(), result.end()); return std::vector<uint8>(result.begin(), result.end());
} }
struct SlConditionallySaveState {
size_t current_len;
uint8 need_length;
bool nested;
};
/**
* Run proc, saving as normal if proc returns true, otherwise the saved data is discarded
* @param proc The callback procedure that is called, this should return true to save, false to discard
* @return Whether the callback procedure returned true to save
*/
template <typename F>
bool SlConditionallySave(F proc)
{
extern SlConditionallySaveState SlConditionallySaveSetup();
extern void SlConditionallySaveCompletion(const SlConditionallySaveState &state, bool save);
SlConditionallySaveState state = SlConditionallySaveSetup();
bool save = proc();
SlConditionallySaveCompletion(state, save);
return save;
}
struct SlLoadFromBufferState { struct SlLoadFromBufferState {
size_t old_obj_len; size_t old_obj_len;
byte *old_bufp; byte *old_bufp;

View File

@@ -259,6 +259,7 @@ struct MemoryDumper {
size_t GetSize() const; size_t GetSize() const;
void StartAutoLength(); void StartAutoLength();
std::pair<byte *, size_t> StopAutoLength(); std::pair<byte *, size_t> StopAutoLength();
bool IsAutoLengthActive() const { return this->saved_buf != nullptr; }
}; };
#endif /* SL_SAVELOAD_BUFFER_H */ #endif /* SL_SAVELOAD_BUFFER_H */