00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "g-map-vertex.hh"
00026 #include "streams.hh"
00027 #include <cstring>
00028 #include <map>
00029 using namespace std;
00030 using namespace GMap3d;
00031
00032 void CGMapVertex::giveNumberToDarts(int ADirectInfoIndex)
00033 {
00034 CDynamicCoverageAll it(this);
00035
00036 for (uint32_t num=0; it.cont(); ++it, ++num)
00037 (*it)->setDirectInfo(ADirectInfoIndex, (void *) num);
00038 }
00039
00040 TSaveFormat CGMapVertex::getFileFormat(const char * AFilename)
00041 {
00042 ifstream stream(AFilename);
00043 char id[256];
00044
00045 stream.getline(id,256);
00046 stream.close();
00047
00048 if (strcmp(id, getFileHeader(BinaryFormat))==0) return BinaryFormat;
00049 if (strcmp(id, getFileHeader( AsciiFormat))==0) return AsciiFormat;
00050
00051 return UnknownFormat;
00052 }
00053
00054 const char * CGMapVertex::getFileHeader(TSaveFormat AFormat)
00055 {
00056 switch (AFormat)
00057 {
00058 case BinaryFormat:
00059 return "Moka file [binary]";
00060 case AsciiFormat:
00061 return "Moka file [ascii]";
00062 default:
00063 return NULL;
00064 }
00065 }
00066
00067 bool CGMapVertex::save(const char * AFilename, TSaveFormat AFormat)
00068 {
00069 ofstream stream;
00070 if ( AFormat==BinaryFormat )
00071 stream.open(AFilename, ios::trunc | ios::binary);
00072 else
00073 stream.open(AFilename, ios::trunc);
00074
00075 bool result = save(stream, AFormat);
00076 stream.close();
00077 return result;
00078 }
00079
00080 CDart* CGMapVertex::load(const char * AFilename, TSaveFormat AFormat)
00081 {
00082 ifstream stream;
00083 if ( AFormat==BinaryFormat )
00084 stream.open(AFilename, ios::binary);
00085 else
00086 stream.open(AFilename);
00087
00088 CDart* result = load(stream, AFormat);
00089 stream.close();
00090 return result;
00091 }
00092
00093 bool CGMapVertex::save(ostream & AStream, TSaveFormat AFormat)
00094 {
00095 int directInfoIndex = getNewDirectInfo();
00096 const char * header = getFileHeader(AFormat);
00097
00098 assert(header!=NULL);
00099
00100
00101 giveNumberToDarts(directInfoIndex);
00102
00103
00104 switch (AFormat)
00105 {
00106 case AsciiFormat : setAsciiMode (); break;
00107 case BinaryFormat: setBinaryMode(); break;
00108 default: cerr << "CGMapVertex.save: Format inconnu!!!" << endl;
00109 }
00110
00111 AStream << header << endl;
00112
00113
00114 assert(NB_MARKS % 8 == 0);
00115 bool m[8], u[8];
00116
00117 for (int i=0; i<NB_MARKS; ++i)
00118 {
00119 m[i % 8] = FMaskMarks[i];
00120 u[i % 8] = FUsedMarks[i];
00121
00122 if (i % 8 == 7)
00123 {
00124 writeChar(AStream, bool2char(m)); writeSpc(AStream);
00125 writeChar(AStream, bool2char(u)); writeSpc(AStream);
00126 }
00127 }
00128
00129 writeRet(AStream);
00130
00131
00132 bool ok = true;
00133 CDynamicCoverageAll it(this);
00134
00135 for (; ok && it.cont(); ++it)
00136 {
00137 CDartVertex * current = (CDartVertex *) *it;
00138 ok = current->save(AStream, AFormat, directInfoIndex);
00139 }
00140
00141 freeDirectInfo(directInfoIndex);
00142 return ok;
00143 }
00144
00145 CDart* CGMapVertex::load(istream & AStream, TSaveFormat AFormat)
00146 {
00147
00148 switch (AFormat)
00149 {
00150 case AsciiFormat : setAsciiMode (); break;
00151 case BinaryFormat: setBinaryMode(); break;
00152 default:
00153 cerr << "CGMapVertex.load: Format inconnu!!!" << endl;
00154 return NULL;
00155 }
00156
00157
00158 {
00159 char id[256];
00160 AStream.getline(id, 256);
00161
00162 if (strcmp(id, getFileHeader(AFormat)) != 0)
00163 return NULL;
00164 }
00165
00166
00167 bitset<NB_MARKS> streamUsed;
00168 bitset<NB_MARKS> streamMask;
00169
00170 assert(NB_MARKS % 8 == 0);
00171 bool m[8],u[8];
00172
00173 int i;
00174
00175 for (i=0; i<NB_MARKS; ++i)
00176 {
00177 if (i % 8 == 0)
00178 {
00179 char2bool(readChar(AStream), m);
00180 char2bool(readChar(AStream), u);
00181 }
00182
00183 if (u[i % 8] && ! FUsedMarks[i])
00184 cerr << "CGMapVertex::load: Marque n°" << i
00185 << " ignorée lors du chargement." << endl;
00186
00187 streamUsed.set(i, u[i % 8]);
00188 streamMask.set(i, m[i % 8]);
00189 }
00190
00191
00192 bitset<NB_MARKS> marksToKeep = FUsedMarks & streamUsed;
00193
00194 int nbLoaded = 0;
00195 int mark = getNewMark();
00196
00197 negateMaskMark(mark);
00198
00199 CDartVertex * dart=NULL;
00200 for (bool cont = true; cont; )
00201 {
00202 dart = (CDartVertex *) addMapDart();
00203 cont = dart->load(AStream, AFormat);
00204
00205 if (cont)
00206 {
00207
00208 setMarks(dart, (dart->getMarks() ^ streamMask) & marksToKeep);
00209 ++nbLoaded;
00210 }
00211 else
00212 delMapDart(dart);
00213 }
00214
00215 negateMaskMark(mark);
00216
00217
00218 CDynamicCoverageAll it(this);
00219 if ( it.cont() )
00220 {
00221 dart=static_cast<CDartVertex*>(*it);
00222
00223 CDartVertex** table = new CDartVertex* [nbLoaded];
00224 i = nbLoaded;
00225
00226 for (; it.cont(); ++it)
00227 if (isMarked(*it, mark))
00228 {
00229 table[--i] = (CDartVertex *) *it;
00230 unsetMark(*it, mark);
00231 }
00232
00233 assert(i==0);
00234
00235 for (; i<nbLoaded; ++i)
00236 for (int dim=0; dim<=3; ++dim)
00237 {
00238 int n = (uint32_t) table[i]->getAlpha(dim) -1;
00239
00240 if (n==i)
00241 table[i]->setFree(dim);
00242 else
00243 if (n<i)
00244 linkAlpha(table[i], table[n], dim);
00245 }
00246
00247 delete [] table;
00248 }
00249
00250 freeMark(mark);
00251
00252 return dart;
00253 }
00254
00255 CDart* CGMapVertex::load(const char * AFilename)
00256 {
00257 TSaveFormat format= CGMapVertex::getFileFormat(AFilename);
00258
00259 if ( format==UnknownFormat ) return NULL;
00260 return load(AFilename,format);
00261 }
00262