My Project
ReadSerializationFile.hh
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 */
 All Classes Functions Variables Friends