libsnes-gain the ability to serialize const arrays: useful for emitting comments in savestates, which is helpful for debugging. note to self: add a serializer for bools which transforms to 0 or 1

This commit is contained in:
zeromus 2012-12-01 08:28:46 +00:00
parent db37a6f64f
commit 7722344e55
2 changed files with 54 additions and 15 deletions

View File

@ -64,11 +64,26 @@ namespace nall {
}
}
template<typename T> void integer(const T &value) {
enum { size = std::is_same<bool, T>::value ? 1 : sizeof(T) };
if(imode == Save) {
for(unsigned n = 0; n < size; n++) idata[isize++] = (uintmax_t)value >> (n << 3);
} else if(imode == Load) {
} else if(imode == Size) {
isize += size;
}
}
template<typename T> void array(T &array) {
enum { size = sizeof(T) / sizeof(typename std::remove_extent<T>::type) };
for(unsigned n = 0; n < size; n++) integer(array[n]);
}
template<typename T> void array(const T &array) {
enum { size = sizeof(T) / sizeof(typename std::remove_extent<T>::type) };
for(unsigned n = 0; n < size; n++) integer(array[n]);
}
template<typename T> void array(T array, unsigned size) {
for(unsigned n = 0; n < size; n++) integer(array[n]);
}

View File

@ -48,29 +48,53 @@ void System::serialize(serializer &s) {
s.integer((unsigned&)expansion);
}
//zero 01-dec-2012 - these will embed strings in the savestates, so you can debug them more easily. but itll break the savestate format
//#define DEBUGSAVESTATE(X) s.array(#X)
#define DEBUGSAVESTATE(X)
void System::serialize_all(serializer &s) {
cartridge.serialize(s);
system.serialize(s);
random.serialize(s);
cpu.serialize(s);
DEBUGSAVESTATE(cart);
cartridge.serialize(s);
DEBUGSAVESTATE(system);
system.serialize(s);
DEBUGSAVESTATE(random);
random.serialize(s);
DEBUGSAVESTATE(cpu);
cpu.serialize(s);
DEBUGSAVESTATE(smp);
smp.serialize(s);
DEBUGSAVESTATE(ppu);
ppu.serialize(s);
DEBUGSAVESTATE(dsp);
dsp.serialize(s);
DEBUGSAVESTATE(input);
input.serialize(s);
DEBUGSAVESTATE(sufamiturbo);
if(cartridge.mode() == Cartridge::Mode::SufamiTurbo) sufamiturbo.serialize(s);
#if defined(GAMEBOY)
if(cartridge.mode() == Cartridge::Mode::SuperGameBoy) icd2.serialize(s);
#endif
if(cartridge.has_superfx()) superfx.serialize(s);
if(cartridge.has_sa1()) sa1.serialize(s);
if(cartridge.has_necdsp()) necdsp.serialize(s);
if(cartridge.has_hitachidsp()) hitachidsp.serialize(s);
if(cartridge.has_armdsp()) armdsp.serialize(s);
if(cartridge.has_srtc()) srtc.serialize(s);
if(cartridge.has_sdd1()) sdd1.serialize(s);
if(cartridge.has_spc7110()) spc7110.serialize(s);
if(cartridge.has_obc1()) obc1.serialize(s);
DEBUGSAVESTATE(icd2);
if(cartridge.mode() == Cartridge::Mode::SuperGameBoy) icd2.serialize(s);
#endif
DEBUGSAVESTATE(superfx);
if(cartridge.has_superfx()) superfx.serialize(s);
DEBUGSAVESTATE(sa1);
if(cartridge.has_sa1()) sa1.serialize(s);
DEBUGSAVESTATE(necdsp);
if(cartridge.has_necdsp()) necdsp.serialize(s);
DEBUGSAVESTATE(hitachidsp);
if(cartridge.has_hitachidsp()) hitachidsp.serialize(s);
DEBUGSAVESTATE(armdsp);
if(cartridge.has_armdsp()) armdsp.serialize(s);
DEBUGSAVESTATE(srtc);
if(cartridge.has_srtc()) srtc.serialize(s);
DEBUGSAVESTATE(sdd1);
if(cartridge.has_sdd1()) sdd1.serialize(s);
DEBUGSAVESTATE(spc7110);
if(cartridge.has_spc7110()) spc7110.serialize(s);
DEBUGSAVESTATE(obc1);
if(cartridge.has_obc1()) obc1.serialize(s);
DEBUGSAVESTATE(msu1);
if(cartridge.has_msu1()) msu1.serialize(s);
}