// -*- mode: c++; indent-tabs-mode: nil; tab-width:2 -*- // (c) 2006,2007,2008 Ulrich Germann #ifndef __Pickler #define __Pickler #include #include #include #include #include "tpt_typedefs.h" #include "num_read_write.h" #include namespace tpt { /// Utility method placed here for lack of a better place /// @return the size of file fname. ::uint64_t getFileSize(const std::string& fname); /** * The following functions write and read data in a compact binary * representation. Write and read errors can be checked directly * on the std::ostream object after the function call, so no return value is * necessary.*/ void binwrite(std::ostream& out, char data); void binwrite(std::ostream& out, unsigned char data); void binwrite(std::ostream& out, unsigned short data); void binwrite(std::ostream& out, unsigned int data); void binwrite(std::ostream& out, unsigned long data); void binwrite(std::ostream& out, size_t data); void binwrite(std::ostream& out, unsigned long long data); void binwrite(std::ostream& out, std::string const& data); void binwrite(std::ostream& out, float data); void binread(std::istream& in, char &data); void binread(std::istream& in, unsigned char &data); void binread(std::istream& in, unsigned short &data); void binread(std::istream& in, unsigned int &data); void binread(std::istream& in, unsigned long &data); void binread(std::istream& in, size_t &data); void binread(std::istream& in, unsigned long long &data); void binread(std::istream& in, std::string &data); void binread(std::istream& in, float &data); char const *binread(char const* p, uint16_t& buf); char const *binread(char const* p, uint32_t& buf); char const *binread(char const* p, uint64_t& buf); char const *binread(char const* p, float& buf); #ifdef __clang__ char const *binread(char const* p, size_t& buf); #endif std::ostream& write(std::ostream& out, char x); std::ostream& write(std::ostream& out, unsigned char x); std::ostream& write(std::ostream& out, short x); std::ostream& write(std::ostream& out, unsigned short x); std::ostream& write(std::ostream& out, long x); std::ostream& write(std::ostream& out, size_t x); std::ostream& write(std::ostream& out, float x); std::istream& read(std::istream& in, char& x); std::istream& read(std::istream& in, unsigned char& x); std::istream& read(std::istream& in, short& x); std::istream& read(std::istream& in, unsigned short& x); std::istream& read(std::istream& in, long& x); std::istream& read(std::istream& in, size_t& x); std::istream& read(std::istream& in, float& x); /* template char const* binread(char const* p, WHATEVER* buf); template char const* binread(char const* p, numtype& buf); */ template void binwrite(std::ostream& out, std::pair const& data); template void binread(std::istream& in, std::pair& data); template char const* binread(char const* p, std::pair& data); template char const* binread(char const* p, std::vector& v); template char const* binread(char const* p, std::pair& data) { #ifdef VERIFY_TIGHT_PACKING assert(p); #endif p = binread(p,data.first); p = binread(p,data.second); return p; } template char const* binread(char const* p, std::vector& v) { size_t vsize; #ifdef VERIFY_TIGHT_PACKING assert(p); #endif p = binread(p, vsize); v.resize(vsize); for (size_t i = 0; i < vsize; ++i) p = binread(p,v[i]); return p; } template T read(std::istream& in) { T ret; read(in,ret); return ret; } template T binread(std::istream& in) { T ret; binread(in,ret); return ret; } template void binwrite(std::ostream& out, std::vector const& data) { binwrite(out,data.size()); for (size_t i = 0; i < data.size(); i++) { binwrite(out,data[i]); } } template void binread(std::istream& in, std::vector& data) { size_t s; binread(in,s); data.resize(s); for (size_t i = 0; i < s; i++) { binread(in,data[i]); } } template void binread(std::istream& in, std::map& data) { size_t s; K k; V v; binread(in,s); data.clear(); // I have no idea why this is necessary, but it is, even when // /data/ is supposed to be empty for (size_t i = 0; i < s; i++) { binread(in,k); binread(in,v); data[k] = v; // cerr << "* " << i << " " << k << " " << v << std::endl; } } template void binwrite(std::ostream& out, std::map const& data) { binwrite(out,data.size()); for (typename std::map::const_iterator m = data.begin(); m != data.end(); m++) { binwrite(out,m->first); binwrite(out,m->second); } } template void binwrite(std::ostream& out, std::pair const& data) { binwrite(out,data.first); binwrite(out,data.second); } template void binread(std::istream& in, std::pair& data) { binread(in,data.first); binread(in,data.second); } template char const* binread(char const* p, WHATEVER* buf) { #ifdef VERIFY_TIGHT_PACKING assert(p); #endif return binread(p,*buf); } } // end namespace sapt #endif