#ifndef Serialize_H #define Serialize_H #include #include #include #include #include template struct Saver { static void DoSave (const T& t, std::ostream& os); }; template struct Saver { static void DoSave (const T& t, std::ostream& os) { os.write ((const char*)(void*)(&t), sizeof (t)); } }; template struct Saver { static void DoSave (const T& t, std::ostream& os) { T::DoSave (t, os); } }; template void Save (const T& t, std::ostream& os) { Saver::value>::DoSave (t, os); } template void Save (const std::vector& v, std::ostream& os) { Save (v.size(), os); for (typename std::vector::const_iterator it = v.begin(); it != v.end(); it++) Save (*it, os); } template void Save (const std::complex& z, std::ostream& os) { Saver, true>::DoSave (z, os); } template struct Loader { static void DoLoad (T& t, std::istream& os); }; template struct Loader { static void DoLoad (T& t, std::istream& os) { os.read ((char*)(void*)(&t), sizeof (t)); } }; template struct Loader { static void DoLoad (T& t, std::istream& os) { T::DoLoad (t, os); } }; template void Load (T& t, std::istream& os) { Loader::value>::DoLoad (t, os); } template void Load (std::vector& v, std::istream& os) { size_t size; Load (size, os); v.resize (size); for (size_t i = 0; i < size; i++) Load (v[i], os); } template void Load (std::complex& z, std::istream& os) { Loader, true>::DoLoad (z, os); } #endif