From 15fea054fbd0faf2d4635f8259d07a6f69332082 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Fri, 12 Jan 2018 01:13:49 +0000 Subject: [PATCH] Add function pointer mode to SlXvFeatureTest --- src/saveload/extended_ver_sl.cpp | 2 ++ src/saveload/extended_ver_sl.h | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/src/saveload/extended_ver_sl.cpp b/src/saveload/extended_ver_sl.cpp index 7a3e0ced88..7fdec374bb 100644 --- a/src/saveload/extended_ver_sl.cpp +++ b/src/saveload/extended_ver_sl.cpp @@ -60,6 +60,8 @@ bool SlXvFeatureTest::IsFeaturePresent(uint16 savegame_version, uint16 savegame_ { bool savegame_version_ok = savegame_version >= savegame_version_from && savegame_version <= savegame_version_to; + if (this->functor) return (*this->functor)(savegame_version, savegame_version_ok); + if (this->feature == XSLFI_NULL) return savegame_version_ok; bool feature_ok = SlXvIsFeaturePresent(this->feature, this->min_version, this->max_version); diff --git a/src/saveload/extended_ver_sl.h b/src/saveload/extended_ver_sl.h index b495c60c4e..72d8fa2691 100644 --- a/src/saveload/extended_ver_sl.h +++ b/src/saveload/extended_ver_sl.h @@ -39,11 +39,14 @@ enum SlXvFeatureTestOperator { * Structure to describe an extended feature version test, and how it combines with a traditional savegame version test */ struct SlXvFeatureTest { + using TestFunctorPtr = bool (*)(uint16, bool); ///< Return true if feature present, first parameter is standard savegame version, second is whether standard savegame version is within bounds + private: uint16 min_version; uint16 max_version; SlXvFeatureIndex feature; SlXvFeatureTestOperator op; + TestFunctorPtr functor = nullptr; public: SlXvFeatureTest() @@ -52,6 +55,9 @@ struct SlXvFeatureTest { SlXvFeatureTest(SlXvFeatureTestOperator op_, SlXvFeatureIndex feature_, uint16 min_version_ = 1, uint16 max_version_ = 0xFFFF) : min_version(min_version_), max_version(max_version_), feature(feature_), op(op_) { } + SlXvFeatureTest(TestFunctorPtr functor_) + : min_version(0), max_version(0), feature(XSLFI_NULL), op(XSLFTO_OR), functor(functor_) { } + bool IsFeaturePresent(uint16 savegame_version, uint16 savegame_version_from, uint16 savegame_version_to) const; };