Back to home page

EIC code displayed by LXR

 
 

    


Warning, /include/Geant4/toolx/mpi/wrmpi is written in an unsupported language. File is not indexed.

0001 // Copyright (C) 2010, Guy Barrand. All rights reserved.
0002 // See the file tools.license for terms.
0003 
0004 #ifndef toolx_mpi_wrmpi
0005 #define toolx_mpi_wrmpi
0006 
0007 #include "wait_buffer"
0008 
0009 #include <tools/impi>
0010 #include <tools/cmemT>
0011 #include <tools/mnmx>
0012 
0013 // the below must be in sync with tools/typedefs
0014 #if defined(_MSC_VER) || defined(__MINGW32__)
0015 #define TOOLX_MPI_UINT64 MPI_UNSIGNED_LONG_LONG
0016 #define TOOLX_MPI_INT64  MPI_LONG_LONG
0017 #elif defined(_LP64)
0018 // 64 Bit Platforms
0019 #define TOOLX_MPI_UINT64 MPI_UNSIGNED_LONG
0020 #define TOOLX_MPI_INT64  MPI_LONG
0021 #else
0022 // 32-Bit Platforms
0023 #define TOOLX_MPI_UINT64 MPI_UNSIGNED_LONG_LONG
0024 #define TOOLX_MPI_INT64  MPI_LONG_LONG
0025 #endif
0026 
0027 namespace toolx {
0028 namespace mpi {
0029 
0030 class wrmpi : public virtual tools::impi {
0031   typedef tools::impi parent;
0032 public:
0033   typedef unsigned int num_t;
0034 protected:
0035   static const std::string& s_class() {
0036     static const std::string s_v("toolx::mpi::wrmpi");
0037     return s_v;
0038   }
0039 public: //tools::impi
0040   virtual bool pack(char a_val) {
0041     tools::uint32 sz = tools::uint32(sizeof(char));
0042     if(m_pos+sz>m_max) {if(!expand2(m_size+sz)) return false;}
0043     if(::MPI_Pack(&a_val,1,MPI_CHAR,m_buffer,m_size,&m_ipos,m_comm)!=MPI_SUCCESS) {
0044       m_out << "toolx::mpi::wrmpi : MPI_Pack(char) failed." << std::endl;
0045       return false;
0046     }
0047     m_pos += sz;
0048     return true;
0049   }
0050   virtual bool pack(short a_val) {
0051     tools::uint32 sz = tools::uint32(sizeof(short));
0052     if(m_pos+sz>m_max) {if(!expand2(m_size+sz)) return false;}
0053     if(::MPI_Pack(&a_val,1,MPI_SHORT,m_buffer,m_size,&m_ipos,m_comm)!=MPI_SUCCESS) {
0054       m_out << "toolx::mpi::wrmpi : MPI_Pack(short) failed." << std::endl;
0055       return false;
0056     }
0057     m_pos += sz;
0058     return true;
0059   }
0060   virtual bool pack(int a_val) {
0061     tools::uint32 sz = tools::uint32(sizeof(int));
0062     if(m_pos+sz>m_max) {if(!expand2(m_size+sz)) return false;}
0063     if(::MPI_Pack(&a_val,1,MPI_INT,m_buffer,m_size,&m_ipos,m_comm)!=MPI_SUCCESS) {
0064       m_out << "toolx::mpi::wrmpi : MPI_Pack(int) failed." << std::endl;
0065       return false;
0066     }
0067     m_pos += sz;
0068     return true;
0069   }
0070   virtual bool pack(unsigned int a_val) {
0071     tools::uint32 sz = tools::uint32(sizeof(unsigned int));
0072     if(m_pos+sz>m_max) {if(!expand2(m_size+sz)) return false;}
0073     if(::MPI_Pack(&a_val,1,MPI_UNSIGNED,m_buffer,m_size,&m_ipos,m_comm)!=MPI_SUCCESS) {
0074       m_out << "toolx::mpi::wrmpi : MPI_Pack(unsigned int) failed." << std::endl;
0075       return false;
0076     }
0077     m_pos += sz;
0078     return true;
0079   }
0080   virtual bool pack(tools::uint64 a_val) {
0081     tools::uint32 sz = tools::uint32(sizeof(tools::uint64));
0082     if(m_pos+sz>m_max) {if(!expand2(m_size+sz)) return false;}
0083     if(::MPI_Pack(&a_val,1,TOOLX_MPI_UINT64,m_buffer,m_size,&m_ipos,m_comm)!=MPI_SUCCESS) {
0084       m_out << "toolx::mpi::wrmpi : MPI_Pack(uint64) failed." << std::endl;
0085       return false;
0086     }
0087     m_pos += sz;
0088     return true;
0089   }
0090   virtual bool pack(tools::int64 a_val) {
0091     tools::uint32 sz = tools::uint32(sizeof(tools::int64));
0092     if(m_pos+sz>m_max) {if(!expand2(m_size+sz)) return false;}
0093     if(::MPI_Pack(&a_val,1,TOOLX_MPI_INT64,m_buffer,m_size,&m_ipos,m_comm)!=MPI_SUCCESS) {
0094       m_out << "toolx::mpi::wrmpi : MPI_Pack(int64) failed." << std::endl;
0095       return false;
0096     }
0097     m_pos += sz;
0098     return true;
0099   }
0100   virtual bool pack(float a_val) {
0101     tools::uint32 sz = tools::uint32(sizeof(float));
0102     if(m_pos+sz>m_max) {if(!expand2(m_size+sz)) return false;}
0103     if(::MPI_Pack(&a_val,1,MPI_FLOAT,m_buffer,m_size,&m_ipos,m_comm)!=MPI_SUCCESS) {
0104       m_out << "toolx::mpi::wrmpi : MPI_Pack(float) failed." << std::endl;
0105       return false;
0106     }
0107     m_pos += sz;
0108     return true;
0109   }
0110   virtual bool pack(double a_val) {
0111     tools::uint32 sz = tools::uint32(sizeof(double));
0112     if(m_pos+sz>m_max) {if(!expand2(m_size+sz)) return false;}
0113     if(::MPI_Pack(&a_val,1,MPI_DOUBLE,m_buffer,m_size,&m_ipos,m_comm)!=MPI_SUCCESS) {
0114       m_out << "toolx::mpi::wrmpi : MPI_Pack(double) failed." << std::endl;
0115       return false;
0116     }
0117     m_pos += sz;
0118     return true;
0119   }
0120   virtual bool bpack(bool a_val) {
0121     tools::uint32 sz = tools::uint32(sizeof(unsigned char));
0122     if(m_pos+sz>m_max) {if(!expand2(m_size+sz)) return false;}
0123     unsigned char val = a_val?1:0;
0124     if(::MPI_Pack(&val,1,MPI_UNSIGNED_CHAR,m_buffer,m_size,&m_ipos,m_comm)!=MPI_SUCCESS) {
0125       m_out << "toolx::mpi::wrmpi : MPI_Pack(bool) failed." << std::endl;
0126       return false;
0127     }
0128     m_pos += sz;
0129     return true;
0130   }
0131   virtual bool spack(const std::string& a_s) {
0132     if(!pack((num_t)a_s.size())) return false;
0133     tools::uint32 sz = (tools::uint32)a_s.size();
0134     if((m_pos+sz)>m_max) {if(!expand2(m_size+sz)) return false;}
0135 #if defined(TOOLX_USE_MPI_PACK_NOT_CONST) || defined(TOOLS_USE_MPI_PACK_NOT_CONST)
0136     if(::MPI_Pack(const_cast<char*>(a_s.c_str()),a_s.size(),MPI_CHAR,m_buffer,m_size,&m_ipos,m_comm)!=MPI_SUCCESS) {
0137 #else
0138     if(::MPI_Pack(a_s.c_str(),a_s.size(),MPI_CHAR,m_buffer,m_size,&m_ipos,m_comm)!=MPI_SUCCESS) {
0139 #endif
0140       m_out << "toolx::mpi::wrmpi : MPI_Pack(std::string) failed." << std::endl;
0141       return false;
0142     }
0143     m_pos += sz;
0144     return true;
0145   }
0146   virtual bool vpack(const std::vector<unsigned int>& a_v) {
0147     if(!pack((num_t)a_v.size())) return false;
0148     tools::uint32 sz = (tools::uint32)(a_v.size()*sizeof(unsigned int));
0149     if((m_pos+sz)>m_max) {if(!expand2(m_size+sz)) return false;}
0150 #if defined(TOOLX_USE_MPI_PACK_NOT_CONST) || defined(TOOLS_USE_MPI_PACK_NOT_CONST)
0151     if(::MPI_Pack(const_cast<unsigned int*>(a_v.data()),a_v.size(),
0152                   MPI_UNSIGNED,m_buffer,m_size,&m_ipos,m_comm)!=MPI_SUCCESS) {
0153 #else
0154     if(::MPI_Pack(a_v.data(),a_v.size(),MPI_UNSIGNED,m_buffer,m_size,&m_ipos,m_comm)!=MPI_SUCCESS) {
0155 #endif
0156       m_out << "toolx::mpi::wrmpi : MPI_Pack(std::vector<unsigned int>) failed." << std::endl;
0157       return false;
0158     }
0159     m_pos += sz;
0160     return true;
0161   }
0162   virtual bool vpack(const std::vector<int>& a_v) {
0163     if(!pack((num_t)a_v.size())) return false;
0164     tools::uint32 sz = (tools::uint32)(a_v.size()*sizeof(int));
0165     if((m_pos+sz)>m_max) {if(!expand2(m_size+sz)) return false;}
0166 #if defined(TOOLX_USE_MPI_PACK_NOT_CONST) || defined(TOOLS_USE_MPI_PACK_NOT_CONST)
0167     if(::MPI_Pack(const_cast<int*>(a_v.data()),a_v.size(),MPI_INT,m_buffer,m_size,&m_ipos,m_comm)!=MPI_SUCCESS) {
0168 #else
0169     if(::MPI_Pack(a_v.data(),a_v.size(),MPI_INT,m_buffer,m_size,&m_ipos,m_comm)!=MPI_SUCCESS) {
0170 #endif
0171       m_out << "toolx::mpi::wrmpi : MPI_Pack(std::vector<int>) failed." << std::endl;
0172       return false;
0173     }
0174     m_pos += sz;
0175     return true;
0176   }
0177   virtual bool vpack(const std::vector<double>& a_v) {
0178     if(!pack((num_t)a_v.size())) return false;
0179     tools::uint32 sz = (tools::uint32)(a_v.size()*sizeof(double));
0180     if((m_pos+sz)>m_max) {if(!expand2(m_size+sz)) return false;}
0181 #if defined(TOOLX_USE_MPI_PACK_NOT_CONST) || defined(TOOLS_USE_MPI_PACK_NOT_CONST)
0182     if(::MPI_Pack(const_cast<double*>(a_v.data()),a_v.size(),MPI_DOUBLE,m_buffer,m_size,&m_ipos,m_comm)!=MPI_SUCCESS) {
0183 #else
0184     if(::MPI_Pack(a_v.data(),a_v.size(),MPI_DOUBLE,m_buffer,m_size,&m_ipos,m_comm)!=MPI_SUCCESS) {
0185 #endif
0186       m_out << "toolx::mpi::wrmpi : MPI_Pack(std::vector<double>) failed." << std::endl;
0187       return false;
0188     }
0189     m_pos += sz;
0190     return true;
0191   }
0192   virtual bool pack(tools::uint32 a_size,const char* a_buffer) {
0193     if(!pack((num_t)a_size)) return false;
0194     tools::uint32 sz = (tools::uint32)(a_size*sizeof(char));
0195     if((m_pos+sz)>m_max) {if(!expand2(m_size+sz)) return false;}
0196 #if defined(TOOLX_USE_MPI_PACK_NOT_CONST) || defined(TOOLS_USE_MPI_PACK_NOT_CONST)
0197     if(::MPI_Pack(const_cast<char*>(a_buffer),a_size,MPI_CHAR,m_buffer,m_size,&m_ipos,m_comm)!=MPI_SUCCESS) {
0198 #else
0199     if(::MPI_Pack(a_buffer,a_size,MPI_CHAR,m_buffer,m_size,&m_ipos,m_comm)!=MPI_SUCCESS) {
0200 #endif
0201       m_out << "toolx::mpi::wrmpi : MPI_Pack(char*) failed." << std::endl;
0202       return false;
0203     }
0204     m_pos += sz;
0205     return true;
0206   }
0207 
0208   virtual bool pack(tools::uint32 a_size,const int* a_buffer) {
0209     if(!pack((num_t)a_size)) return false;
0210     tools::uint32 sz = (tools::uint32)(a_size*sizeof(int));
0211     if((m_pos+sz)>m_max) {if(!expand2(m_size+sz)) return false;}
0212 #if defined(TOOLX_USE_MPI_PACK_NOT_CONST) || defined(TOOLS_USE_MPI_PACK_NOT_CONST)
0213     if(::MPI_Pack(const_cast<int*>(a_buffer),a_size,MPI_INT,m_buffer,m_size,&m_ipos,m_comm)!=MPI_SUCCESS) {
0214 #else
0215     if(::MPI_Pack(a_buffer,a_size,MPI_INT,m_buffer,m_size,&m_ipos,m_comm)!=MPI_SUCCESS) {
0216 #endif
0217       m_out << "toolx::mpi::wrmpi : MPI_Pack(int*) failed." << std::endl;
0218       return false;
0219     }
0220     m_pos += sz;
0221     return true;
0222   }
0223 public: //tools::impi
0224   virtual bool unpack(char& a_val) {
0225     if(::MPI_Unpack(m_buffer,m_size,&m_ipos,&a_val,1,MPI_CHAR,m_comm)!=MPI_SUCCESS) {
0226       m_out << "toolx::mpi::wrmpi : MPI_Unpack(char) failed." << std::endl;
0227       a_val = 0;
0228       return false;
0229     }
0230     return true;
0231   }
0232   virtual bool unpack(short& a_val) {
0233     if(::MPI_Unpack(m_buffer,m_size,&m_ipos,&a_val,1,MPI_SHORT,m_comm)!=MPI_SUCCESS) {
0234       m_out << "toolx::mpi::wrmpi : MPI_Unpack(short) failed." << std::endl;
0235       a_val = 0;
0236       return false;
0237     }
0238     return true;
0239   }
0240   virtual bool unpack(int& a_val) {
0241     if(::MPI_Unpack(m_buffer,m_size,&m_ipos,&a_val,1,MPI_INT,m_comm)!=MPI_SUCCESS) {
0242       m_out << "toolx::mpi::wrmpi : MPI_Unpack(int) failed." << std::endl;
0243       a_val = 0;
0244       return false;
0245     }
0246     return true;
0247   }
0248   virtual bool unpack(unsigned int& a_val) {
0249     if(::MPI_Unpack(m_buffer,m_size,&m_ipos,&a_val,1,MPI_UNSIGNED,m_comm)!=MPI_SUCCESS) {
0250       m_out << "toolx::mpi::wrmpi : MPI_Unpack(unsigned int) failed." << std::endl;
0251       a_val = 0;
0252       return false;
0253     }
0254     return true;
0255   }
0256   virtual bool unpack(tools::uint64& a_val) {
0257     if(::MPI_Unpack(m_buffer,m_size,&m_ipos,&a_val,1,TOOLX_MPI_UINT64,m_comm)!=MPI_SUCCESS) {
0258       m_out << "toolx::mpi::wrmpi : MPI_Unpack(uint64) failed." << std::endl;
0259       a_val = 0;
0260       return false;
0261     }
0262     return true;
0263   }
0264   virtual bool unpack(tools::int64& a_val) {
0265     if(::MPI_Unpack(m_buffer,m_size,&m_ipos,&a_val,1,TOOLX_MPI_INT64,m_comm)!=MPI_SUCCESS) {
0266       m_out << "toolx::mpi::wrmpi : MPI_Unpack(int64) failed." << std::endl;
0267       a_val = 0;
0268       return false;
0269     }
0270     return true;
0271   }
0272   virtual bool unpack(float& a_val) {
0273     if(::MPI_Unpack(m_buffer,m_size,&m_ipos,&a_val,1,MPI_FLOAT,m_comm)!=MPI_SUCCESS) {
0274       m_out << "toolx::mpi::wrmpi : MPI_Unpack(float) failed." << std::endl;
0275       a_val = 0;
0276       return false;
0277     }
0278     return true;
0279   }
0280   virtual bool unpack(double& a_val) {
0281     if(::MPI_Unpack(m_buffer,m_size,&m_ipos,&a_val,1,MPI_DOUBLE,m_comm)!=MPI_SUCCESS) {
0282       m_out << "toolx::mpi::wrmpi : MPI_Unpack(double) failed." << std::endl;
0283       a_val = 0;
0284       return false;
0285     }
0286     return true;
0287   }
0288   virtual bool bunpack(bool& a_val) {
0289     typedef unsigned char bool_t;
0290     bool_t val;
0291     if(::MPI_Unpack(m_buffer,m_size,&m_ipos,&val,1,MPI_UNSIGNED_CHAR,m_comm)!=MPI_SUCCESS) {
0292       m_out << "toolx::mpi::wrmpi : MPI_Unpack(bool) failed." << std::endl;
0293       a_val = false;
0294       return false;
0295     }
0296     a_val = val==1?true:false;
0297     return true;
0298   }
0299   virtual bool vunpack(std::vector<unsigned int>& a_v) {
0300     num_t num;
0301     if(!unpack(num)) {a_v.clear();return false;}
0302     a_v.resize(num);
0303     if(::MPI_Unpack(m_buffer,m_size,&m_ipos,a_v.data(),a_v.size(),MPI_UNSIGNED,m_comm)!=MPI_SUCCESS) {
0304       m_out << "toolx::mpi::wrmpi : MPI_Unpack(std::vector<unsigned int>) failed." << std::endl;
0305       a_v.clear();
0306       return false;
0307     }
0308     return true;
0309   }
0310   virtual bool vunpack(std::vector<int>& a_v) {
0311     num_t num;
0312     if(!unpack(num)) {a_v.clear();return false;}
0313     a_v.resize(num);
0314     if(::MPI_Unpack(m_buffer,m_size,&m_ipos,a_v.data(),a_v.size(),MPI_INT,m_comm)!=MPI_SUCCESS) {
0315       m_out << "toolx::mpi::wrmpi : MPI_Unpack(std::vector<int>) failed." << std::endl;
0316       a_v.clear();
0317       return false;
0318     }
0319     return true;
0320   }
0321   virtual bool vunpack(std::vector<double>& a_v) {
0322     num_t num;
0323     if(!unpack(num)) {a_v.clear();return false;}
0324     a_v.resize(num);
0325     if(::MPI_Unpack(m_buffer,m_size,&m_ipos,a_v.data(),a_v.size(),MPI_DOUBLE,m_comm)!=MPI_SUCCESS) {
0326       m_out << "toolx::mpi::wrmpi : MPI_Unpack(std::vector<double>) failed." << std::endl;
0327       a_v.clear();
0328       return false;
0329     }
0330     return true;
0331   }
0332   virtual bool sunpack(std::string& a_s) {
0333     num_t num;
0334     if(!unpack(num)) {a_s.clear();return false;}
0335     a_s.resize(num);
0336     if(::MPI_Unpack(m_buffer,m_size,&m_ipos,const_cast<char*>(a_s.c_str()),a_s.size(),MPI_CHAR,m_comm)!=MPI_SUCCESS) {
0337       m_out << "toolx::mpi::wrmpi : MPI_Unpack(std::string) failed." << std::endl;
0338       a_s.clear();
0339       return false;
0340     }
0341     return true;
0342   }
0343   virtual bool unpack(tools::uint32& a_size,char*& a_buffer) {
0344     num_t num;
0345     if(!unpack(num)) {a_size = 0;a_buffer = 0;return false;}
0346     a_buffer = new char[num];
0347     if(::MPI_Unpack(m_buffer,m_size,&m_ipos,a_buffer,num,MPI_CHAR,m_comm)!=MPI_SUCCESS) {
0348       m_out << "toolx::mpi::wrmpi : MPI_Unpack(char*) failed." << std::endl;
0349       delete [] a_buffer;
0350       a_size = 0;
0351       a_buffer = 0;
0352       return false;
0353     }
0354     a_size = num;
0355     return true;
0356   }
0357   virtual bool unpack(tools::uint32& a_size,int*& a_buffer) {
0358     num_t num;
0359     if(!unpack(num)) {a_size = 0;a_buffer = 0;return false;}
0360     a_buffer = new int[num];
0361     if(::MPI_Unpack(m_buffer,m_size,&m_ipos,a_buffer,num,MPI_INT,m_comm)!=MPI_SUCCESS) {
0362       m_out << "toolx::mpi::wrmpi : MPI_Unpack(int*) failed." << std::endl;
0363       delete [] a_buffer;
0364       a_size = 0;
0365       a_buffer = 0;
0366       return false;
0367     }
0368     a_size = num;
0369     return true;
0370   }
0371 
0372   virtual void pack_reset() {
0373     delete [] m_buffer;
0374     m_size = 128;
0375     m_buffer = new char[m_size];
0376     m_max = m_buffer+m_size;
0377     m_pos = m_buffer;
0378     m_ipos = 0; //IMPORTANT
0379   }
0380 
0381   virtual bool send_buffer(int a_dest,int a_tag) { // used in tools/mpi/pntuple.
0382     if(::MPI_Send(m_buffer,m_ipos,MPI_CHAR,a_dest,a_tag,m_comm)!=MPI_SUCCESS) {
0383       m_out << "toolx::mpi::wrmpi::send_buffer : MPI_Send() failed for rank destination " << a_dest << "." << std::endl;
0384       return false;
0385     }
0386     return true;
0387   }
0388 
0389   virtual bool wait_buffer(int a_rank,int a_src,int a_tag,int& a_probe_src,bool a_verbose = false) {
0390     int buffer_size = 0;
0391     char* _buffer = 0;
0392     if (!mpi::wait_buffer(m_out,a_rank,a_src,a_tag,m_comm,buffer_size,_buffer,a_probe_src,a_verbose)) {
0393       m_out << "toolx::mpi::wrmpi::wait_buffer : failed for rank " << a_rank << " and source " << a_src <<"." << std::endl;
0394       return false;
0395     }
0396     // we take ownership of buffer :
0397     delete [] m_buffer;
0398     m_size = buffer_size;
0399     m_buffer = _buffer;
0400     m_max = m_buffer+m_size;
0401     m_pos = m_buffer;
0402     m_ipos = 0; //IMPORTANT
0403     return true;
0404   }
0405 
0406   virtual bool wait_buffer(int a_rank,int a_tag,int& a_probe_src,bool a_verbose = false) {
0407     return wait_buffer(a_rank,MPI_ANY_SOURCE,a_tag,a_probe_src,a_verbose);
0408   }
0409 
0410 public:
0411   wrmpi(std::ostream& a_out,const MPI_Comm& a_comm,tools::uint32 a_size = 128) // we expect a_size!=0
0412   :m_out(a_out)
0413   ,m_comm(a_comm)
0414   ,m_size(0)
0415   ,m_buffer(0)
0416   ,m_max(0)
0417   ,m_pos(0)
0418   ,m_ipos(0)
0419   {
0420     m_size = a_size;
0421     m_buffer = new char[m_size];
0422     //if(!m_buffer) {}
0423     m_max = m_buffer+m_size;
0424     m_pos = m_buffer;
0425   }
0426    wrmpi(std::ostream& a_out,const MPI_Comm& a_comm,tools::uint32 a_size,char* a_buffer) //we take ownership of a_buffer.
0427   :m_out(a_out)
0428   ,m_comm(a_comm)
0429   ,m_size(a_size)
0430   ,m_buffer(a_buffer)
0431   ,m_max(0)
0432   ,m_pos(0)
0433   ,m_ipos(0)
0434   {
0435     m_max = m_buffer+m_size;
0436     m_pos = m_buffer;
0437   }
0438   virtual ~wrmpi(){
0439     delete [] m_buffer;
0440   }
0441 protected:
0442   wrmpi(const wrmpi& a_from)
0443   :parent(a_from)
0444   ,m_out(a_from.m_out)
0445   ,m_comm(a_from.m_comm)
0446   ,m_size(0)
0447   ,m_buffer(0)
0448   ,m_max(0)
0449   ,m_pos(0)
0450   ,m_ipos(0)
0451   {
0452   }
0453   wrmpi& operator=(const wrmpi&){return *this;}
0454 public:
0455   int ipos() const {return m_ipos;}
0456 #if defined(TOOLX_USE_MPI_PACK_NOT_CONST) || defined(TOOLS_USE_MPI_PACK_NOT_CONST)
0457   char* buffer() {return m_buffer;}
0458 #else
0459   const char* buffer() const {return m_buffer;}
0460 #endif
0461 
0462 protected:
0463   bool expand2(tools::uint32 a_new_size) {return expand(tools::max_of<tools::uint32>(2*m_size,a_new_size));} //CERN-ROOT logic.
0464 
0465   bool expand(tools::uint32 a_new_size) {
0466     tools::diff_pointer_t len = m_pos-m_buffer;
0467     if(!tools::cmem_realloc<char>(m_buffer,a_new_size,m_size)) {
0468       m_out << "toolx::mpi::wrmpi::expand :"
0469             << " can't realloc " << a_new_size << " bytes."
0470             << std::endl;
0471       m_size = 0;
0472       m_max = 0;
0473       m_pos = 0;
0474       return false;
0475     }
0476     m_size = a_new_size;
0477     m_max = m_buffer + m_size;
0478     m_pos = m_buffer + len;
0479     return true;
0480   }
0481 
0482 protected:
0483   std::ostream& m_out;
0484   const MPI_Comm& m_comm;
0485   tools::uint32 m_size;
0486   char* m_buffer;
0487   char* m_max;
0488   char* m_pos;
0489   //
0490   int m_ipos;
0491 };
0492 
0493 }}
0494 
0495 #ifdef TOOLX_MPI_UINT64
0496 #undef TOOLX_MPI_UINT64
0497 #endif
0498 
0499 #ifdef TOOLX_MPI_INT64
0500 #undef TOOLX_MPI_INT64
0501 #endif
0502 
0503 #endif