#pragma once #include "./storage.h" #include "../stfx-library.h" // for the ...ParamIgnore classes namespace stfx { namespace storage { template struct STFXStorageScanner : public signalsmith::storage::StorageScanner { void info(const char *, const char *) {} int version(int v) { return v; } template bool changed(const char *key, V &v) { auto &sub = *(SubClassCRTP *)this; sub(key, v); return false; } void invalidate(const char *) {} bool extra() { return false; } template void extra(const char *, V) {} template RangeParamIgnore range(const char *key, PR ¶m) { return {}; } template SteppedParamIgnore stepped(const char *key, PS ¶m) { return {}; } }; template struct STFXStorageWriter : public signalsmith::storage::StorageCborWriter { using signalsmith::storage::StorageCborWriter::StorageCborWriter; void info(const char *name, const char *desc) { sub().extra("name", name); sub().extra("desc", desc); } template bool changed(const char *key, V &v) { sub()(key, v); return false; } void invalidate(const char *) {} int version(int v) { sub()("version", v); return v; } bool extra() { return false; } template void extra(const char *key, V v) {} template RangeParamIgnore range(const char *key, PR ¶m) { sub()(key, param); return {}; } template SteppedParamIgnore stepped(const char *key, PS ¶m) { sub()(key, param); return {}; } private: SubClassCRTP & sub() { return *(SubClassCRTP *)this; } }; template struct STFXStorageReader : public signalsmith::storage::StorageCborReader { using signalsmith::storage::StorageCborReader::StorageCborReader; // This is supplemental void info(const char *, const char *) {} int version(int v) { sub()("version", v); return v; } bool extra() { return false; } template void extra(const char *key, V v) {} template bool changed(const char *key, V &v) { V prev = v; sub()(key, v); return v != prev; } void invalidate(const char *invalidatedKey) { //LOG_EXPR(invalidatedKey); } template RangeParamIgnore range(const char *key, PR ¶m) { sub()(key, param); return {}; } template SteppedParamIgnore stepped(const char *key, PS ¶m) { sub()(key, param); return {}; } private: SubClassCRTP & sub() { return *(SubClassCRTP *)this; } }; // If void, use itself for CRTP template<> struct STFXStorageWriter : public STFXStorageWriter> { using STFXStorageWriter>::STFXStorageWriter; }; template<> struct STFXStorageReader : public STFXStorageReader> { using STFXStorageReader>::STFXStorageReader; }; }} // namespace