00001
00002 #ifndef INCLUDED_LoadSave_h
00003 #define INCLUDED_LoadSave_h
00004
00005 #include <string>
00006
00007
00008
00009
00010 class LoadSave {
00011 public:
00012
00013 static const unsigned int stringpad=sizeof(unsigned int)+1;
00014
00015
00016
00017 LoadSave() {}
00018 LoadSave(const char* filename) { LoadFile(filename); }
00019 virtual ~LoadSave();
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 virtual unsigned int getBinSize() const =0;
00030
00031
00032
00033
00034 virtual unsigned int LoadBuffer(const char buf[], unsigned int len)=0;
00035
00036
00037
00038
00039 virtual unsigned int SaveBuffer(char buf[], unsigned int len) const =0;
00040
00041
00042
00043
00044
00045
00046 virtual unsigned int LoadFile(const char* filename);
00047 virtual unsigned int SaveFile(const char* filename) const;
00048
00049
00050
00051
00052
00053
00054
00055
00056 virtual unsigned int LoadFile(FILE* f);
00057
00058
00059
00060
00061
00062
00063
00064 virtual unsigned int SaveFile(FILE* f) const;
00065
00066
00067
00068
00069
00070
00071
00072 virtual unsigned int creatorSize(const char creator[]) const { return strlen(creator)+stringpad; }
00073
00074
00075
00076
00077
00078
00079 virtual unsigned int checkCreator(const char* creator, const char buf[], unsigned int len, bool isLoading=true) const;
00080
00081
00082
00083
00084
00085 virtual unsigned int checkCreator(const char* creator, FILE* f, bool isLoading=true) const;
00086
00087
00088
00089
00090
00091 virtual unsigned int saveCreator(const char* creator, char buf[], unsigned int len) const;
00092
00093
00094
00095
00096 virtual unsigned int saveCreator(const char* creator, FILE* f) const;
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109 inline static unsigned int encode(const LoadSave& x, char buf[], unsigned int cap) { return x.SaveBuffer(buf,cap); }
00110 inline static unsigned int decode(LoadSave& x, const char buf[], unsigned int cap) { return x.LoadBuffer(buf,cap); }
00111 inline static unsigned int encode(const LoadSave& x, FILE* f) { return x.SaveFile(f); }
00112 inline static unsigned int decode(LoadSave& x, FILE* f) { return x.LoadFile(f); }
00113
00114
00115
00116
00117 #ifdef LOADSAVE_SWAPBYTES
00118
00119 inline static unsigned int encode(const double x, char buf[], unsigned int cap) { if(cap<sizeof(x)) return 0; byteswap(*(double*)buf,x); return sizeof(x); }
00120 inline static unsigned int decode(double& x, const char buf[], unsigned int cap) { if(cap<sizeof(x)) return 0; byteswap(x,*(const double*)buf); return sizeof(x);}
00121 inline static unsigned int encode(const double x, FILE* f) { double t=0; byteswap(t,x); return sizeof(x)*fwrite(&t,sizeof(x),1,f); }
00122 inline static unsigned int decode(double& x, FILE* f) { double t=0; if(fread(&t,sizeof(x),1,f)==0) return 0; byteswap(x,t); return sizeof(x);}
00123
00124 inline static unsigned int encode(const float x, char buf[], unsigned int cap) { if(cap<sizeof(x)) return 0; byteswap(*(float*)buf,x); return sizeof(x); }
00125 inline static unsigned int decode(float& x, const char buf[], unsigned int cap) { if(cap<sizeof(x)) return 0; byteswap(x,*(const float*)buf); return sizeof(x);}
00126 inline static unsigned int encode(const float x, FILE* f) { float t=0; byteswap(t,x); return sizeof(x)*fwrite(&t,sizeof(x),1,f); }
00127 inline static unsigned int decode(float& x, FILE* f) { float t=0; if(fread(&t,sizeof(x),1,f)==0) return 0; byteswap(x,t); return sizeof(x);}
00128
00129 inline static unsigned int encode(const long x, char buf[], unsigned int cap) { if(cap<sizeof(x)) return 0; byteswap(*(long*)buf,x); return sizeof(x); }
00130 inline static unsigned int decode(long& x, const char buf[], unsigned int cap) { if(cap<sizeof(x)) return 0; byteswap(x,*(const long*)buf); return sizeof(x);}
00131 inline static unsigned int encode(const long x, FILE* f) { long t=0; byteswap(t,x); return sizeof(x)*fwrite(&t,sizeof(x),1,f); }
00132 inline static unsigned int decode(long& x, FILE* f) { long t=0; if(fread(&t,sizeof(x),1,f)==0) return 0; byteswap(x,t); return sizeof(x);}
00133 inline static unsigned int encode(const unsigned long x, char buf[], unsigned int cap) { if(cap<sizeof(x)) return 0; byteswap(*(unsigned long*)buf,x); return sizeof(x); }
00134 inline static unsigned int decode(unsigned long& x, const char buf[], unsigned int cap) { if(cap<sizeof(x)) return 0; byteswap(x,*(const unsigned long*)buf); return sizeof(x);}
00135 inline static unsigned int encode(const unsigned long x, FILE* f) { unsigned long t=0; byteswap(t,x); return sizeof(x)*fwrite(&t,sizeof(x),1,f); }
00136 inline static unsigned int decode(unsigned long& x, FILE* f) { unsigned long t=0; if(fread(&t,sizeof(x),1,f)==0) return 0; byteswap(x,t); return sizeof(x);}
00137 inline static unsigned int encode(const int x, char buf[], unsigned int cap) { if(cap<sizeof(x)) return 0; byteswap(*(int*)buf,x); return sizeof(x); }
00138 inline static unsigned int decode(int& x, const char buf[], unsigned int cap) { if(cap<sizeof(x)) return 0; byteswap(x,*(const int*)buf); return sizeof(x);}
00139 inline static unsigned int encode(const int x, FILE* f) { int t=0; byteswap(t,x); return sizeof(x)*fwrite(&t,sizeof(x),1,f); }
00140 inline static unsigned int decode(int& x, FILE* f) { int t=0; if(fread(&t,sizeof(x),1,f)==0) return 0; byteswap(x,t); return sizeof(x);}
00141 inline static unsigned int encode(const unsigned int x, char buf[], unsigned int cap) { if(cap<sizeof(x)) return 0; byteswap(*(unsigned int*)buf,x); return sizeof(x); }
00142 inline static unsigned int decode(unsigned int& x, const char buf[], unsigned int cap) { if(cap<sizeof(x)) return 0; byteswap(x,*(const unsigned int*)buf); return sizeof(x);}
00143 inline static unsigned int encode(const unsigned int x, FILE* f) { unsigned int t=0; byteswap(t,x); return sizeof(x)*fwrite(&t,sizeof(x),1,f); }
00144 inline static unsigned int decode(unsigned int& x, FILE* f) { unsigned int t=0; if(fread(&t,sizeof(x),1,f)==0) return 0; byteswap(x,t); return sizeof(x);}
00145
00146 inline static unsigned int encode(const short x, char buf[], unsigned int cap) { if(cap<sizeof(x)) return 0; byteswap(*(short*)buf,x); return sizeof(x); }
00147 inline static unsigned int decode(short& x, const char buf[], unsigned int cap) { if(cap<sizeof(x)) return 0; byteswap(x,*(const short*)buf); return sizeof(x);}
00148 inline static unsigned int encode(const short x, FILE* f) { short t; byteswap(t,x); return sizeof(x)*fwrite(&t,sizeof(x),1,f); }
00149 inline static unsigned int decode(short& x, FILE* f) { short t=0; if(fread(&t,sizeof(x),1,f)==0) return 0; byteswap(x,t); return sizeof(x);}
00150 inline static unsigned int encode(const unsigned short x, char buf[], unsigned int cap) { if(cap<sizeof(x)) return 0; byteswap(*(unsigned short*)buf,x); return sizeof(x); }
00151 inline static unsigned int decode(unsigned short& x, const char buf[], unsigned int cap) { if(cap<sizeof(x)) return 0; byteswap(x,*(const unsigned short*)buf); return sizeof(x);}
00152 inline static unsigned int encode(const unsigned short x, FILE* f) { unsigned short t; byteswap(t,x); return sizeof(x)*fwrite(&t,sizeof(x),1,f); }
00153 inline static unsigned int decode(unsigned short& x, FILE* f) { unsigned short t=0; if(fread(&t,sizeof(x),1,f)==0) return 0; byteswap(x,t); return sizeof(x);}
00154
00155 #else
00156
00157 inline static unsigned int encode(const double x, char buf[], unsigned int cap) { if(cap<sizeof(x)) return 0; memcpy(buf,&x,sizeof(x)); return sizeof(x); }
00158 inline static unsigned int decode(double& x, const char buf[], unsigned int cap) { if(cap<sizeof(x)) return 0; memcpy(&x,buf,sizeof(x)); return sizeof(x); }
00159 inline static unsigned int encode(const double x, FILE* f) { return sizeof(x)*fwrite(&x,sizeof(x),1,f); }
00160 inline static unsigned int decode(double& x, FILE* f) { return sizeof(x)*fread(&x,sizeof(x),1,f); }
00161
00162 inline static unsigned int encode(const float x, char buf[], unsigned int cap) { if(cap<sizeof(x)) return 0; memcpy(buf,&x,sizeof(x)); return sizeof(x); }
00163 inline static unsigned int decode(float& x, const char buf[], unsigned int cap) { if(cap<sizeof(x)) return 0; memcpy(&x,buf,sizeof(x)); return sizeof(x); }
00164 inline static unsigned int encode(const float x, FILE* f) { return sizeof(x)*fwrite(&x,sizeof(x),1,f); }
00165 inline static unsigned int decode(float& x, FILE* f) { return sizeof(x)*fread(&x,sizeof(x),1,f); }
00166
00167 inline static unsigned int encode(const long x, char buf[], unsigned int cap) { if(cap<sizeof(x)) return 0; memcpy(buf,&x,sizeof(x)); return sizeof(x); }
00168 inline static unsigned int decode(long& x, const char buf[], unsigned int cap) { if(cap<sizeof(x)) return 0; memcpy(&x,buf,sizeof(x)); return sizeof(x); }
00169 inline static unsigned int encode(const long x, FILE* f) { return sizeof(x)*fwrite(&x,sizeof(x),1,f); }
00170 inline static unsigned int decode(long& x, FILE* f) { return sizeof(x)*fread(&x,sizeof(x),1,f); }
00171 inline static unsigned int encode(const unsigned long x, char buf[], unsigned int cap) { if(cap<sizeof(x)) return 0; memcpy(buf,&x,sizeof(x)); return sizeof(x); }
00172 inline static unsigned int decode(unsigned long& x, const char buf[], unsigned int cap) { if(cap<sizeof(x)) return 0; memcpy(&x,buf,sizeof(x)); return sizeof(x); }
00173 inline static unsigned int encode(const unsigned long x, FILE* f) { return sizeof(x)*fwrite(&x,sizeof(x),1,f); }
00174 inline static unsigned int decode(unsigned long& x, FILE* f) { return sizeof(x)*fread(&x,sizeof(x),1,f); }
00175 inline static unsigned int encode(const int x, char buf[], unsigned int cap) { if(cap<sizeof(x)) return 0; memcpy(buf,&x,sizeof(x)); return sizeof(x); }
00176 inline static unsigned int decode(int& x, const char buf[], unsigned int cap) { if(cap<sizeof(x)) return 0; memcpy(&x,buf,sizeof(x)); return sizeof(x); }
00177 inline static unsigned int encode(const int x, FILE* f) { return sizeof(x)*fwrite(&x,sizeof(x),1,f); }
00178 inline static unsigned int decode(int& x, FILE* f) { return sizeof(x)*fread(&x,sizeof(x),1,f); }
00179 inline static unsigned int encode(const unsigned int x, char buf[], unsigned int cap) { if(cap<sizeof(x)) return 0; memcpy(buf,&x,sizeof(x)); return sizeof(x); }
00180 inline static unsigned int decode(unsigned int& x, const char buf[], unsigned int cap) { if(cap<sizeof(x)) return 0; memcpy(&x,buf,sizeof(x)); return sizeof(x); }
00181 inline static unsigned int encode(const unsigned int x, FILE* f) { return sizeof(x)*fwrite(&x,sizeof(x),1,f); }
00182 inline static unsigned int decode(unsigned int& x, FILE* f) { return sizeof(x)*fread(&x,sizeof(x),1,f); }
00183
00184 inline static unsigned int encode(const short x, char buf[], unsigned int cap) { if(cap<sizeof(x)) return 0; memcpy(buf,&x,sizeof(x)); return sizeof(x); }
00185 inline static unsigned int decode(short& x, const char buf[], unsigned int cap) { if(cap<sizeof(x)) return 0; memcpy(&x,buf,sizeof(x)); return sizeof(x); }
00186 inline static unsigned int encode(const short x, FILE* f) { return sizeof(x)*fwrite(&x,sizeof(x),1,f); }
00187 inline static unsigned int decode(short& x, FILE* f) { return sizeof(x)*fread(&x,sizeof(x),1,f); }
00188 inline static unsigned int encode(const unsigned short x, char buf[], unsigned int cap) { if(cap<sizeof(x)) return 0; memcpy(buf,&x,sizeof(x)); return sizeof(x); }
00189 inline static unsigned int decode(unsigned short& x, const char buf[], unsigned int cap){ if(cap<sizeof(x)) return 0; memcpy(&x,buf,sizeof(x)); return sizeof(x); }
00190 inline static unsigned int encode(const unsigned short x, FILE* f) { return sizeof(x)*fwrite(&x,sizeof(x),1,f); }
00191 inline static unsigned int decode(unsigned short& x, FILE* f) { return sizeof(x)*fread(&x,sizeof(x),1,f); }
00192
00193 #endif //end of big/little endian differences
00194
00195 inline static unsigned int encode(const std::string& x, char buf[], unsigned int cap) { if(cap<sizeof(unsigned int)+x.size()+1) return 0; memcpy(buf+encode(x.size(),buf,cap),x.c_str(),x.size()+1); return x.size()+stringpad; }
00196 inline static unsigned int decode(std::string& x, const char buf[], unsigned int cap) { if(cap<sizeof(unsigned int)) return 0; unsigned int sz=0; decode(sz,buf,cap); if(cap<sizeof(unsigned int)+sz+1) return 0; x.assign(buf+sizeof(unsigned int),sz); return x.size()+stringpad; }
00197 inline static unsigned int encode(const std::string& x, FILE* f) { encode(x.size(),f); return sizeof(unsigned int)+fwrite(x.c_str(),1,sizeof(x)+1,f); }
00198 inline static unsigned int decode(std::string& x, FILE* f) { unsigned int sz=0; decode(sz,f); char *tmp=new char[sz+1]; if(fread(tmp,1,sz+1,f)!=sz+1) { delete [] tmp; return 0; } x.assign(tmp,sz); delete [] tmp; return sz+stringpad; }
00199
00200 inline static unsigned int encode(const char* x, char buf[], unsigned int cap) { unsigned int sz=strlen(x); if(cap<sizeof(unsigned int)+sz+1) return 0; memcpy(buf+encode(sz,buf,cap),x,sz+1); return sz+stringpad; }
00201 inline static unsigned int decode(char*& x, const char buf[], unsigned int cap) { if(cap<sizeof(unsigned int)) return 0; unsigned int sz=0; decode(sz,buf,cap); if(cap<sizeof(unsigned int)+sz+1) return 0; x=new char[sz+1]; strncpy(x,buf+sizeof(unsigned int),sz+1); return sz+stringpad; }
00202 inline static unsigned int encode(const char* x, FILE* f) { unsigned int sz=strlen(x); encode(sz,f); return sizeof(unsigned int)+fwrite(x,1,sz+1,f); }
00203 inline static unsigned int decode(char*& x, FILE* f) { unsigned int sz=0; decode(sz,f); x=new char[sz+1]; if(fread(x,1,sz+1,f)!=sz+1) { delete [] x; x=NULL; return 0; } return sz+stringpad; }
00204
00205 inline static unsigned int encode(const char x, char buf[], unsigned int cap) { if(cap<sizeof(x)) return 0; buf[0]=x; return sizeof(x); }
00206 inline static unsigned int decode(char& x, const char buf[], unsigned int cap) { if(cap<sizeof(x)) return 0; x=buf[0]; return sizeof(x);}
00207 inline static unsigned int encode(const char x, FILE* f) { return sizeof(x)*fwrite(&x,sizeof(x),1,f); }
00208 inline static unsigned int decode(char& x, FILE* f) { return sizeof(x)*fread(&x,sizeof(x),1,f); }
00209 inline static unsigned int encode(const unsigned char x, char buf[], unsigned int cap) { if(cap<sizeof(x)) return 0; buf[0]=(char)x; return sizeof(x); }
00210 inline static unsigned int decode(unsigned char& x, const char buf[], unsigned int cap){ if(cap<sizeof(x)) return 0; x=(unsigned char)buf[0]; return sizeof(x);}
00211 inline static unsigned int encode(const unsigned char x, FILE* f) { return sizeof(x)*fwrite(&x,sizeof(x),1,f); }
00212 inline static unsigned int decode(unsigned char& x, FILE* f) { return sizeof(x)*fread(&x,sizeof(x),1,f); }
00213
00214 inline static unsigned int encode(const bool x, char buf[], unsigned int cap) { if(cap<sizeof(char)) return 0; buf[0]=(char)(x?1:0); return sizeof(char); }
00215 inline static unsigned int decode(bool& x, const char buf[], unsigned int cap) { if(cap<sizeof(char)) return 0; x=(buf[0]!=(char)0); return sizeof(char);}
00216 inline static unsigned int encode(const bool x, FILE* f) { char t=(char)(x?1:0); return sizeof(char)*fwrite(&t,sizeof(char),1,f); }
00217 inline static unsigned int decode(bool& x, FILE* f) { char t='\0'; fread(&t,sizeof(char),1,f); x=(t!=(char)0); return sizeof(char); }
00218
00219 protected:
00220
00221 template<class T> inline static void byteswap(T& dstc, const T& srcc) {
00222 char* dst=(char*)&dstc;
00223 const char* src=(const char*)&srcc;
00224 for(unsigned int i=0; i<sizeof(T); i++)
00225 dst[sizeof(T)-1-i]=src[i];
00226 }
00227 };
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242 #endif