Salome HOME
Some factorization before integration of ParaMEDMEM into medcoupling python module
[tools/medcoupling.git] / src / MEDCoupling / MEDCouplingMultiFields.cxx
index d261867686ec8fbb85741bc74a69fe90e443b66c..039c8ca29dabeae3a09b3b0c93ab08223e55e428 100644 (file)
@@ -1,9 +1,9 @@
-// Copyright (C) 2007-2012  CEA/DEN, EDF R&D
+// Copyright (C) 2007-2016  CEA/DEN, EDF R&D
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 // License as published by the Free Software Foundation; either
-// version 2.1 of the License.
+// version 2.1 of the License, or (at your option) any later version.
 //
 // This library is distributed in the hope that it will be useful,
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
 #include "MEDCouplingFieldTemplate.hxx"
 #include "MEDCouplingFieldDouble.hxx"
 #include "MEDCouplingMesh.hxx"
-#include "MEDCouplingAutoRefCountObjectPtr.hxx"
+#include "MCAuto.hxx"
 
 #include <sstream>
 #include <algorithm>
 
-using namespace ParaMEDMEM;
+using namespace MEDCoupling;
 
-MEDCouplingMultiFields *MEDCouplingMultiFields::New(const std::vector<MEDCouplingFieldDouble *>& fs) throw(INTERP_KERNEL::Exception)
+MEDCouplingMultiFields *MEDCouplingMultiFields::New(const std::vector<MEDCouplingFieldDouble *>& fs)
 {
   return new MEDCouplingMultiFields(fs);
 }
@@ -39,7 +39,7 @@ MEDCouplingMultiFields *MEDCouplingMultiFields::New()
   return new MEDCouplingMultiFields;
 }
 
-MEDCouplingMultiFields *MEDCouplingMultiFields::deepCpy() const
+MEDCouplingMultiFields *MEDCouplingMultiFields::deepCopy() const
 {
   return new MEDCouplingMultiFields(*this);
 }
@@ -80,7 +80,7 @@ bool MEDCouplingMultiFields::isEqual(const MEDCouplingMultiFields *other, double
 
 std::string MEDCouplingMultiFields::getName() const
 {
-  std::vector< MEDCouplingAutoRefCountObjectPtr<MEDCouplingFieldDouble> >::const_iterator it=_fs.begin();
+  std::vector< MCAuto<MEDCouplingFieldDouble> >::const_iterator it=_fs.begin();
   for(;it!=_fs.end();it++)
     if((const MEDCouplingFieldDouble *)(*it))
       return (*it)->getName();
@@ -89,7 +89,7 @@ std::string MEDCouplingMultiFields::getName() const
 
 std::string MEDCouplingMultiFields::getDescription() const
 {
-  std::vector< MEDCouplingAutoRefCountObjectPtr<MEDCouplingFieldDouble> >::const_iterator it=_fs.begin();
+  std::vector< MCAuto<MEDCouplingFieldDouble> >::const_iterator it=_fs.begin();
   for(;it!=_fs.end();it++)
     if((const MEDCouplingFieldDouble *)(*it))
       return (*it)->getDescription();
@@ -98,16 +98,16 @@ std::string MEDCouplingMultiFields::getDescription() const
 
 std::string MEDCouplingMultiFields::getTimeUnit() const
 {
-  std::vector< MEDCouplingAutoRefCountObjectPtr<MEDCouplingFieldDouble> >::const_iterator it=_fs.begin();
+  std::vector< MCAuto<MEDCouplingFieldDouble> >::const_iterator it=_fs.begin();
   for(;it!=_fs.end();it++)
     if((const MEDCouplingFieldDouble *)(*it))
       return (*it)->getTimeUnit();
   return std::string();
 }
 
-double MEDCouplingMultiFields::getTimeResolution() const throw(INTERP_KERNEL::Exception)
+double MEDCouplingMultiFields::getTimeResolution() const
 {
-  std::vector< MEDCouplingAutoRefCountObjectPtr<MEDCouplingFieldDouble> >::const_iterator it=_fs.begin();
+  std::vector< MCAuto<MEDCouplingFieldDouble> >::const_iterator it=_fs.begin();
   for(;it!=_fs.end();it++)
     if((const MEDCouplingFieldDouble *)(*it))
       return (*it)->getTimeTolerance();
@@ -124,12 +124,12 @@ std::string MEDCouplingMultiFields::simpleRepr() const
   std::vector<MEDCouplingMesh *> ms;
   std::vector<int> refms;
   try
-    {
+  {
       ms=getDifferentMeshes(refms);
       ret << ms.size() << "\n";
-    }
-  catch(INTERP_KERNEL::Exception& e)
-    { ret << "Current instance is INVALID !\n"; }
+  }
+  catch(INTERP_KERNEL::Exception& /*e*/)
+  { ret << "Current instance is INVALID !\n"; }
   return ret.str();
 }
 
@@ -149,7 +149,7 @@ bool MEDCouplingMultiFields::isEqualWithoutConsideringStr(const MEDCouplingMulti
   return true;
 }
 
-const MEDCouplingFieldDouble *MEDCouplingMultiFields::getFieldWithId(int id) const throw(INTERP_KERNEL::Exception)
+const MEDCouplingFieldDouble *MEDCouplingMultiFields::getFieldWithId(int id) const
 {
   if(id>=(int)_fs.size() || id < 0)
     throw INTERP_KERNEL::Exception("MEDCouplingMultiFields::getFieldWithId : invalid id outside boundaries !");
@@ -168,7 +168,7 @@ int MEDCouplingMultiFields::getNumberOfFields() const
   return (int)_fs.size();
 }
 
-const MEDCouplingFieldDouble *MEDCouplingMultiFields::getFieldAtPos(int id) const throw(INTERP_KERNEL::Exception)
+const MEDCouplingFieldDouble *MEDCouplingMultiFields::getFieldAtPos(int id) const
 {
   if(id<0 || id>=(int)_fs.size())
     {
@@ -180,7 +180,7 @@ const MEDCouplingFieldDouble *MEDCouplingMultiFields::getFieldAtPos(int id) cons
 
 void MEDCouplingMultiFields::updateTime() const
 {
-  std::vector< MEDCouplingAutoRefCountObjectPtr<MEDCouplingFieldDouble> >::const_iterator it=_fs.begin();
+  std::vector< MCAuto<MEDCouplingFieldDouble> >::const_iterator it=_fs.begin();
   for(;it!=_fs.end();it++)
     if((const MEDCouplingFieldDouble *)(*it))
       (*it)->updateTime();
@@ -190,26 +190,23 @@ void MEDCouplingMultiFields::updateTime() const
       updateTimeWith(*(*it));
 }
 
-std::size_t MEDCouplingMultiFields::getHeapMemorySize() const
+std::size_t MEDCouplingMultiFields::getHeapMemorySizeWithoutChildren() const
+{
+  return 0;
+}
+
+std::vector<const BigMemoryObject *> MEDCouplingMultiFields::getDirectChildrenWithNull() const
 {
-  std::vector<int> tmp;
-  std::vector< std::vector<int> > tmp2;
-  std::vector<MEDCouplingMesh *> ms=getDifferentMeshes(tmp);
-  std::vector<DataArrayDouble *> arrs=getDifferentArrays(tmp2);
-  std::size_t ret=0;
-  for(std::vector<MEDCouplingMesh *>::const_iterator it=ms.begin();it!=ms.end();it++)
-    if(*it)
-      ret+=(*it)->getHeapMemorySize();
-  for(std::vector<DataArrayDouble *>::const_iterator it=arrs.begin();it!=arrs.end();it++)
-    if(*it)
-      ret+=(*it)->getHeapMemorySize();
+  std::vector<const BigMemoryObject *> ret;
+  for(std::vector< MCAuto<MEDCouplingFieldDouble> >::const_iterator it=_fs.begin();it!=_fs.end();it++)
+    ret.push_back((const MEDCouplingFieldDouble *)*it);
   return ret;
 }
 
-std::vector<MEDCouplingMesh *> MEDCouplingMultiFields::getMeshes() const throw(INTERP_KERNEL::Exception)
+std::vector<MEDCouplingMesh *> MEDCouplingMultiFields::getMeshes() const
 {
   std::vector<MEDCouplingMesh *> ms;
-  for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDCouplingFieldDouble> >::const_iterator it=_fs.begin();it!=_fs.end();it++)
+  for(std::vector< MCAuto<MEDCouplingFieldDouble> >::const_iterator it=_fs.begin();it!=_fs.end();it++)
     {
       const MEDCouplingMesh *m=0;
       if((const MEDCouplingFieldDouble *)(*it))
@@ -219,12 +216,12 @@ std::vector<MEDCouplingMesh *> MEDCouplingMultiFields::getMeshes() const throw(I
   return ms;
 }
 
-std::vector<MEDCouplingMesh *> MEDCouplingMultiFields::getDifferentMeshes(std::vector<int>& refs) const throw(INTERP_KERNEL::Exception)
+std::vector<MEDCouplingMesh *> MEDCouplingMultiFields::getDifferentMeshes(std::vector<int>& refs) const
 {
   refs.resize(_fs.size());
   std::vector<MEDCouplingMesh *> ms;
   int id=0;
-  for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDCouplingFieldDouble> >::const_iterator it=_fs.begin();it!=_fs.end();it++,id++)
+  for(std::vector< MCAuto<MEDCouplingFieldDouble> >::const_iterator it=_fs.begin();it!=_fs.end();it++,id++)
     {
       const MEDCouplingMesh *m=0;
       if((const MEDCouplingFieldDouble *)(*it))
@@ -246,10 +243,10 @@ std::vector<MEDCouplingMesh *> MEDCouplingMultiFields::getDifferentMeshes(std::v
   return ms;
 }
 
-std::vector<DataArrayDouble *> MEDCouplingMultiFields::getArrays() const throw(INTERP_KERNEL::Exception)
+std::vector<DataArrayDouble *> MEDCouplingMultiFields::getArrays() const
 {
   std::vector<DataArrayDouble *> tmp;
-  for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDCouplingFieldDouble> >::const_iterator it=_fs.begin();it!=_fs.end();it++)
+  for(std::vector< MCAuto<MEDCouplingFieldDouble> >::const_iterator it=_fs.begin();it!=_fs.end();it++)
     {
       std::vector<DataArrayDouble *> tmp2=(*it)->getArrays();
       tmp.insert(tmp.end(),tmp2.begin(),tmp2.end());
@@ -257,12 +254,12 @@ std::vector<DataArrayDouble *> MEDCouplingMultiFields::getArrays() const throw(I
   return tmp;
 }
 
-std::vector<DataArrayDouble *> MEDCouplingMultiFields::getDifferentArrays(std::vector< std::vector<int> >& refs) const throw(INTERP_KERNEL::Exception)
+std::vector<DataArrayDouble *> MEDCouplingMultiFields::getDifferentArrays(std::vector< std::vector<int> >& refs) const
 {
   refs.resize(_fs.size());
   int id=0;
   std::vector<DataArrayDouble *> ret;
-  for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDCouplingFieldDouble> >::const_iterator it=_fs.begin();it!=_fs.end();it++,id++)
+  for(std::vector< MCAuto<MEDCouplingFieldDouble> >::const_iterator it=_fs.begin();it!=_fs.end();it++,id++)
     {
       std::vector<DataArrayDouble *> tmp2;
       if((const MEDCouplingFieldDouble *)(*it))
@@ -293,18 +290,18 @@ std::vector<DataArrayDouble *> MEDCouplingMultiFields::getDifferentArrays(std::v
   return ret;
 }
 
-void MEDCouplingMultiFields::checkCoherency() const throw(INTERP_KERNEL::Exception)
+void MEDCouplingMultiFields::checkConsistencyLight() const
 {
-  std::vector< MEDCouplingAutoRefCountObjectPtr<MEDCouplingFieldDouble> >::const_iterator it=_fs.begin();
+  std::vector< MCAuto<MEDCouplingFieldDouble> >::const_iterator it=_fs.begin();
   for(;it!=_fs.end();it++)
     {
       if((const MEDCouplingFieldDouble *)(*it)==0)
-        throw INTERP_KERNEL::Exception("MEDCouplingMultiFields::checkCoherency : There is an empty Field in array...");
-      (*it)->checkCoherency();
+        throw INTERP_KERNEL::Exception("MEDCouplingMultiFields::checkConsistencyLight : There is an empty Field in array...");
+      (*it)->checkConsistencyLight();
     }
 }
 
-MEDCouplingMultiFields::MEDCouplingMultiFields(const std::vector<MEDCouplingFieldDouble *>& fs) throw(INTERP_KERNEL::Exception):_fs(fs.size())
+MEDCouplingMultiFields::MEDCouplingMultiFields(const std::vector<MEDCouplingFieldDouble *>& fs):_fs(fs.size())
 {
   int id=0;
   for(std::vector< MEDCouplingFieldDouble * >::const_iterator it=fs.begin();it!=fs.end();it++,id++)
@@ -313,16 +310,16 @@ MEDCouplingMultiFields::MEDCouplingMultiFields(const std::vector<MEDCouplingFiel
         (*it)->incrRef();
       else
         throw INTERP_KERNEL::Exception("MEDCouplingMultiFields constructor : empty field found in vector !");
-      (*it)->checkCoherency();
+      (*it)->checkConsistencyLight();
       _fs[id]=*it;
     }
 }
 
 
 /*!
- * Performs deepCpy.
+ * Performs deepCopy.
  */
-MEDCouplingMultiFields::MEDCouplingMultiFields(const MEDCouplingMultiFields& other)
+MEDCouplingMultiFields::MEDCouplingMultiFields(const MEDCouplingMultiFields& other):RefCountObject(other)
 {
   std::size_t sz=other._fs.size();
   _fs.resize(sz);
@@ -330,20 +327,20 @@ MEDCouplingMultiFields::MEDCouplingMultiFields(const MEDCouplingMultiFields& oth
   std::vector< std::vector<int> > refs2;
   std::vector<MEDCouplingMesh *> ms=other.getDifferentMeshes(refs);
   std::size_t msLgh=ms.size();
-  std::vector< MEDCouplingAutoRefCountObjectPtr<MEDCouplingMesh> > ms2(msLgh);
+  std::vector< MCAuto<MEDCouplingMesh> > ms2(msLgh);
   for(std::size_t i=0;i<msLgh;i++)
-    ms2[i]=ms[i]->deepCpy();
+    ms2[i]=ms[i]->deepCopy();
   std::vector<DataArrayDouble *> das=other.getDifferentArrays(refs2);
   std::size_t dasLgth=das.size();
-  std::vector< MEDCouplingAutoRefCountObjectPtr<DataArrayDouble> > das2(dasLgth);
+  std::vector< MCAuto<DataArrayDouble> > das2(dasLgth);
   for(std::size_t i=0;i<dasLgth;i++)
-    das2[i]=das[i]->deepCpy();
+    das2[i]=das[i]->deepCopy();
   for(std::size_t i=0;i<sz;i++)
     {
       if((const MEDCouplingFieldDouble *)other._fs[i])
         {
-          MEDCouplingFieldTemplate *tmp=MEDCouplingFieldTemplate::New(other._fs[i]);
-          _fs[i]=MEDCouplingFieldDouble::New(tmp,other._fs[i]->getTimeDiscretization());
+          MEDCouplingFieldTemplate *tmp=MEDCouplingFieldTemplate::New(*other._fs[i]);
+          _fs[i]=MEDCouplingFieldDouble::New(*tmp,other._fs[i]->getTimeDiscretization());
           tmp->decrRef();
           if(refs[i]!=-1)
             _fs[i]->setMesh(ms2[refs[i]]);
@@ -437,7 +434,7 @@ void MEDCouplingMultiFields::finishUnserialization(const std::vector<int>& tinyI
   int offD=0;
   for(int i=0;i<sz;i++)
     {
-      _fs[i]=MEDCouplingFieldDouble::New(ft[i],(TypeOfTimeDiscretization)tinyInfoI[2*sz+3+i]);
+      _fs[i]=MEDCouplingFieldDouble::New(*ft[i],(TypeOfTimeDiscretization)tinyInfoI[2*sz+3+i]);
       int sz3=tinyInfoI[sz+i+3];
       std::vector<DataArrayDouble *> tmp(sz3);
       for(int j=0;j<sz3;j++,k++)