My Project
|
00001 /* 00002 * $Id:$ 00003 */ 00004 00005 #if !defined(READSERIALIZATIONFILE) 00006 #define READSERIALIZATIONFILE 00007 00008 #include <string> 00009 #include <iostream> 00010 #include <fstream> 00011 00012 #include <boost/serialization/serialization.hpp> 00013 #include <boost/serialization/vector.hpp> 00014 00015 #include <boost/archive/binary_oarchive.hpp> 00016 #include <boost/archive/text_oarchive.hpp> 00017 #include <boost/archive/xml_oarchive.hpp> 00018 #include <boost/archive/binary_iarchive.hpp> 00019 #include <boost/archive/text_iarchive.hpp> 00020 #include <boost/archive/xml_iarchive.hpp> 00021 00022 #include <boost/filesystem.hpp> 00023 00024 #if defined(SPLITSERIALIZEXML) 00025 #define ARCFORMAT xml 00026 #else 00027 #define ARCFORMAT binary 00028 #endif 00029 00030 #define cat(x,y) x##y 00031 #define wrapped_cat(x,y) cat(x,y) 00032 00033 #ifdef MULTH 00034 # include <omp.h> 00035 #endif 00036 00037 #include "Header.hh" 00038 00039 #include "HeaderBase.hh" 00040 #include "ElementContainer.hh" 00041 #include "ElementContainerArray.hh" 00042 #include "ElementContainerMatrix.hh" 00043 #include "UInt4Container.hh" 00044 #include "UInt4ContainerArray.hh" 00045 #include "UInt4ContainerMatrix.hh" 00046 00047 00061 template <class Archive> 00062 class ReadSerializationFile { 00063 private: 00064 std::ifstream ifil; 00065 Archive ia; 00066 /*< 00067 * template class Archive should be {binary,text,xml}_iarchive 00068 */ 00069 00070 const std::string _ifname; 00071 public: 00072 ReadSerializationFile(const char *filename) 00073 : ifil(filename), ia(ifil), _ifname(filename) 00074 {}; 00075 00076 void Load(UInt4 &data) { 00077 ia >> boost::serialization::make_nvp("UInt4Val", data); 00078 } 00079 00080 void Load(Int4 &data) { 00081 ia >> boost::serialization::make_nvp("Int4Val", data); 00082 } 00083 00084 void Load(std::string &data) { 00085 ia >> boost::serialization::make_nvp("StringVal", data); 00086 } 00087 00088 void Load(Double &data) { 00089 ia >> boost::serialization::make_nvp("DoubleVal", data); 00090 } 00091 00092 void Load(vector<UInt4> &data) { 00093 ia >> boost::serialization::make_nvp("UInt4VectorVal", data); 00094 } 00095 00096 void Load(vector<Int4> &data) { 00097 ia >> boost::serialization::make_nvp("Int4VectorVal", data); 00098 } 00099 00100 void Load(vector<std::string> &data) { 00101 ia >> boost::serialization::make_nvp("StringVectorVal", data); 00102 } 00103 00104 void Load(vector<Double> &data) { 00105 ia >> boost::serialization::make_nvp("DoubleVectorVal", data); 00106 } 00107 00108 00109 00110 UInt4 LoadUInt4(void) { 00111 UInt4 data; 00112 Load(data); 00113 return data; 00114 } 00115 00116 vector<UInt4> LoadUInt4Vector(void) { 00117 vector<UInt4> data; 00118 Load(data); 00119 return data; 00120 } 00121 00122 Int4 LoadInt4(void) { 00123 Int4 data; 00124 Load(data); 00125 return data; 00126 } 00127 00128 vector<Int4> LoadInt4Vector(void) { 00129 vector<Int4> data; 00130 Load(data); 00131 return data; 00132 } 00133 00134 std::string LoadString(void) { 00135 std::string data; 00136 Load(data); 00137 return data; 00138 } 00139 00140 vector<std::string> LoadStringVector(void) { 00141 vector<std::string> data; 00142 Load(data); 00143 return data; 00144 } 00145 00146 Double LoadDouble(void) { 00147 Double data; 00148 Load(data); 00149 return data; 00150 } 00151 00152 vector<Double> LoadDoubleVector(void) { 00153 vector<Double> data; 00154 Load(data); 00155 return data; 00156 } 00157 00158 00159 00160 void Load(HeaderBase &data) { 00161 ia >> boost::serialization::make_nvp("HeaderBase", data); 00162 } 00163 00164 void Load(ElementContainer &data) { 00165 ia >> boost::serialization::make_nvp("ElementContainer", data); 00166 } 00167 00168 void Load(ElementContainerArray &data) { 00169 ia >> boost::serialization::make_nvp("ElementContainerArray", data); 00170 } 00171 00172 void Load(ElementContainerMatrix &data) { 00173 ia >> boost::serialization::make_nvp("ElementContainerMatrix", data); 00174 } 00175 00176 void Load(UInt4Container &data) { 00177 ia >> boost::serialization::make_nvp("UInt4Container", data); 00178 } 00179 00180 void Load(UInt4ContainerArray &data) { 00181 ia >> boost::serialization::make_nvp("UInt4ContainerArray", data); 00182 } 00183 00184 void Load(UInt4ContainerMatrix &data) { 00185 ia >> boost::serialization::make_nvp("UInt4ContainerMatrix", data); 00186 } 00187 00188 00189 HeaderBase LoadHeaderBase(void) { 00190 HeaderBase data; 00191 Load(data); 00192 return data; 00193 } 00194 00195 ElementContainer LoadElementContainer(void) { 00196 ElementContainer data; 00197 Load(data); 00198 return data; 00199 } 00200 00201 ElementContainerArray LoadElementContainerArray(void) { 00202 ElementContainerArray data; 00203 Load(data); 00204 return data; 00205 } 00206 00207 ElementContainerMatrix LoadElementContainerMatrix(void) { 00208 ElementContainerMatrix data; 00209 Load(data); 00210 return data; 00211 } 00212 00213 UInt4Container LoadUInt4Container(void) { 00214 UInt4Container data; 00215 Load(data); 00216 return data; 00217 } 00218 00219 UInt4ContainerArray LoadUInt4ContainerArray(void) { 00220 UInt4ContainerArray data; 00221 Load(data); 00222 return data; 00223 } 00224 00225 UInt4ContainerMatrix LoadUInt4ContainerMatrix(void) { 00226 UInt4ContainerMatrix data; 00227 Load(data); 00228 return data; 00229 } 00230 00231 00232 private: 00233 template <class pContainer, class cContainer> 00234 void SplitLoad(pContainer &data); 00235 00236 public: 00237 void SplitLoad(ElementContainerArray &data) { 00238 SplitLoad<ElementContainerArray, ElementContainer>(data); 00239 } 00240 00241 void SplitLoad(ElementContainerMatrix &data) { 00242 SplitLoad<ElementContainerMatrix, ElementContainerArray>(data); 00243 } 00244 00245 void SplitLoad(UInt4ContainerArray &data) { 00246 SplitLoad<UInt4ContainerArray, UInt4Container>(data); 00247 } 00248 00249 void SplitLoad(UInt4ContainerMatrix &data) { 00250 SplitLoad<UInt4ContainerMatrix, UInt4ContainerArray>(data); 00251 } 00252 00253 ElementContainerArray SplitLoadElementContainerArray(void) { 00254 ElementContainerArray data; 00255 SplitLoad(data); 00256 return data; 00257 } 00258 00259 ElementContainerMatrix SplitLoadElementContainerMatrix(void) { 00260 ElementContainerMatrix data; 00261 SplitLoad(data); 00262 return data; 00263 } 00264 00265 UInt4ContainerArray SplitLoadUInt4ContainerArray(void) { 00266 UInt4ContainerArray data; 00267 SplitLoad(data); 00268 return data; 00269 } 00270 00271 UInt4ContainerMatrix SplitLoadUInt4ContainerMatrix(void) { 00272 UInt4ContainerMatrix data; 00273 SplitLoad(data); 00274 return data; 00275 } 00276 }; 00277 00278 template <class Archive> 00279 template <class pContainer, class cContainer> 00280 void ReadSerializationFile<Archive>::SplitLoad(pContainer &data) { 00281 std::vector<std::string> S; 00282 std::vector<UInt4> csize; 00283 boost::filesystem::path serializepath(_ifname); 00284 serializepath = serializepath.branch_path(); 00285 data.preload(ia, S, csize); 00286 00287 unsigned int size = S.size()-1; 00288 00289 { 00290 boost::filesystem::path F0 = serializepath / S[0]; 00291 std::string F = (serializepath / S[0]).string(); 00292 if (!boost::filesystem::exists(F)) { 00293 cout << "part of serialization file for NeutronVector<T,H> " 00294 << F << " not exist" << std::endl; 00295 } else { 00296 std::ifstream ifil(F.c_str()); 00297 boost::archive::wrapped_cat(ARCFORMAT,_iarchive) ibin(ifil); 00298 00299 ibin >> boost::serialization::make_nvp("Header", *data.PutHeaderPointer()); 00300 } 00301 } 00302 00303 UInt4 totalcsize=std::accumulate(csize.begin(), csize.end(), 0); 00304 00305 // create/resize a vector v with a size totalcsize, 00306 // it shouldn't contains a pointer to objects, because 00307 // following code rewrite them by another pointers 00308 for (unsigned int i=0;i<data.PutSize();++i) 00309 data.EraseElement(i); 00310 data.Resize(totalcsize); 00311 00312 00313 std::vector<UInt4> csize2(csize.size()+1,0); 00314 std::partial_sum(csize.begin(), csize.end(), &csize2[1]); 00315 00316 std::vector<std::vector< cContainer *> > _EC(size); 00317 00318 #ifdef MULTH 00319 omp_set_num_threads( 00320 std::min(MULTH, std::min(omp_get_max_threads(), omp_get_num_procs()) ) 00321 ); 00322 #endif 00323 #pragma omp parallel for 00324 for (unsigned int i=0;i<size;++i) { 00325 std::string F = (serializepath / S[i+1]).string(); 00326 if (!boost::filesystem::exists(F)) { 00327 cout << "part of serialization file for NeutronVector<T,H> " 00328 << F << " not exist" << std::endl; 00329 continue; 00330 } 00331 std::ifstream ifil(F.c_str()); 00332 boost::archive::wrapped_cat(ARCFORMAT,_iarchive) A(ifil); 00333 A >> boost::serialization::make_nvp("StoredContainers", _EC[i]); 00334 ifil.close(); 00335 00336 std::copy(_EC[i].begin(),_EC[i].end(), &data.v[csize2[i]]); 00337 } 00338 } 00339 00340 #endif /* READSERIALIZATIONFILE */