Saveload: Add helper to conditionally save template functor
This commit is contained in:
@@ -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);
|
||||||
|
@@ -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;
|
||||||
|
@@ -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 */
|
||||||
|
Reference in New Issue
Block a user