]> SALOME platform Git repositories - tools/medcoupling.git/commitdiff
Salome HOME
*** empty log message ***
authorageay <ageay>
Thu, 30 Jun 2011 16:49:19 +0000 (16:49 +0000)
committerageay <ageay>
Thu, 30 Jun 2011 16:49:19 +0000 (16:49 +0000)
src/MEDCoupling/MEDCouplingMemArray.cxx
src/MEDCoupling/MEDCouplingMemArray.hxx
src/MEDCoupling/Test/MEDCouplingBasicsTest.hxx
src/MEDCoupling/Test/MEDCouplingBasicsTest4.cxx

index aba8e7a37e19f8643139da8ca762a47ea2565780..7d4d14bb9e40330bbc2c8a97cee1d6d4fdebd893 100644 (file)
@@ -3511,6 +3511,61 @@ void DataArrayInt::computeOffsets() throw(INTERP_KERNEL::Exception)
   declareAsNew();
 }
 
+/*!
+ * This method works on array with number of component equal to one and allocated. If not an exception is thrown.
+ * 'offsets' should be monotic ascendently. If not, an exception will be thrown.
+ * This method retrives a newly created DataArrayInt instance with 1 component and this->getNumberOfTuples()-1 tuples.
+ * If 'this' contains [0,2,3] and 'offsets' [0,3,6,10,14,20] the returned array will contain [0,1,2,6,7,8,9,10,11,12,13]
+ */
+DataArrayInt *DataArrayInt::buildExplicitArrByRanges(const DataArrayInt *offsets) const throw(INTERP_KERNEL::Exception)
+{
+  checkAllocated();
+  if(getNumberOfComponents()!=1)
+     throw INTERP_KERNEL::Exception("DataArrayInt::buildExplicitArrByRanges : only single component allowed !");
+  offsets->checkAllocated();
+  if(offsets->getNumberOfComponents()!=1)
+     throw INTERP_KERNEL::Exception("DataArrayInt::buildExplicitArrByRanges : input array should have only single component !");
+  int othNbTuples=offsets->getNumberOfTuples()-1;
+  int nbOfTuples=getNumberOfTuples();
+  int retNbOftuples=0;
+  const int *work=getConstPointer();
+  const int *offPtr=offsets->getConstPointer();
+  for(int i=0;i<nbOfTuples;i++)
+    {
+      int val=work[i];
+      if(val>=0 && val<othNbTuples)
+        {
+          int delta=offPtr[val+1]-offPtr[val];
+          if(delta>=0)
+            retNbOftuples+=delta;
+          else
+            {
+              std::ostringstream oss; oss << "DataArrayInt::buildExplicitArrByRanges : Tuple #" << val << " of offset array has a delta < 0 !";
+              throw INTERP_KERNEL::Exception(oss.str().c_str());
+            }
+        }
+      else
+        {
+          std::ostringstream oss; oss << "DataArrayInt::buildExplicitArrByRanges : Tuple #" << i << " in this contains " << val;
+          oss << " whereas offsets array is of size " << othNbTuples+1 << " !";
+          throw INTERP_KERNEL::Exception(oss.str().c_str());
+        }
+    }
+  MEDCouplingAutoRefCountObjectPtr<DataArrayInt> ret=DataArrayInt::New();
+  ret->alloc(retNbOftuples,1);
+  int *retPtr=ret->getPointer();
+  for(int i=0;i<nbOfTuples;i++)
+    {
+      int val=work[i];
+      int start=offPtr[val];
+      int off=offPtr[val+1]-start;
+      for(int j=0;j<off;j++,retPtr++)
+        *retPtr=start+j;
+    }
+  ret->incrRef();
+  return ret;
+}
+
 /*!
  * This method returns all different values found in 'this'.
  */
index 1fedd0fa3aa62e7589f1c0f00c2348310cfab3e9..907ff0e5bd712e3f679ff3cb53f926502eddf4f5 100644 (file)
@@ -340,6 +340,7 @@ namespace ParaMEDMEM
     MEDCOUPLING_EXPORT DataArrayInt *buildIntersection(const DataArrayInt *other) const throw(INTERP_KERNEL::Exception);
     MEDCOUPLING_EXPORT DataArrayInt *deltaShiftIndex() const throw(INTERP_KERNEL::Exception);
     MEDCOUPLING_EXPORT void computeOffsets() throw(INTERP_KERNEL::Exception);
+    MEDCOUPLING_EXPORT DataArrayInt *buildExplicitArrByRanges(const DataArrayInt *offsets) const throw(INTERP_KERNEL::Exception);
     MEDCOUPLING_EXPORT std::set<int> getDifferentValues() const throw(INTERP_KERNEL::Exception);
     MEDCOUPLING_EXPORT void useArray(const int *array, bool ownership, DeallocType type, int nbOfTuple, int nbOfCompo);
     MEDCOUPLING_EXPORT void writeOnPlace(int id, int element0, const int *others, int sizeOfOthers) { _mem.writeOnPlace(id,element0,others,sizeOfOthers); }
index 8add2d0d37da1f844cf73dd38277de91a9704bd4..c80798630ed74f652c74b413a4f9a7b9166ebe0b 100644 (file)
@@ -225,6 +225,7 @@ namespace ParaMEDMEM
     CPPUNIT_TEST( testDAITransformWithIndArrR1 );
     CPPUNIT_TEST( testDAISplitByValueRange1 );
     CPPUNIT_TEST( testUMeshSplitProfilePerType1 );
+    CPPUNIT_TEST( testDAIBuildExplicitArrByRanges1 );
     //MEDCouplingBasicsTestInterp.cxx
     CPPUNIT_TEST( test2DInterpP0P0_1 );
     CPPUNIT_TEST( test2DInterpP0P0PL_1 );
@@ -476,6 +477,7 @@ namespace ParaMEDMEM
     void testDAITransformWithIndArrR1();
     void testDAISplitByValueRange1();
     void testUMeshSplitProfilePerType1();
+    void testDAIBuildExplicitArrByRanges1();
     //MEDCouplingBasicsTestInterp.cxx
     void test2DInterpP0P0_1();
     void test2DInterpP0P0PL_1();
index dbaf613f04f6a4409c9cf85f42243abda1e51d85..b7d2ce94f51f41d70b9bf8a43c4c5b367b912da5 100644 (file)
@@ -1431,3 +1431,26 @@ void MEDCouplingBasicsTest::testUMeshSplitProfilePerType1()
   //
   m->decrRef();
 }
+
+void MEDCouplingBasicsTest::testDAIBuildExplicitArrByRanges1()
+{
+  DataArrayInt *d=DataArrayInt::New();
+  d->alloc(3,1);
+  const int vals1[3]={0,2,3};
+  std::copy(vals1,vals1+3,d->getPointer());
+  DataArrayInt *e=DataArrayInt::New();
+  e->alloc(6,1);
+  const int vals2[6]={0,3,6,10,14,20};
+  std::copy(vals2,vals2+6,e->getPointer());
+  //
+  DataArrayInt *f=d->buildExplicitArrByRanges(e);
+  CPPUNIT_ASSERT_EQUAL(11,f->getNumberOfTuples());
+  CPPUNIT_ASSERT_EQUAL(1,f->getNumberOfComponents());
+  const int expected1[11]={0,1,2,6,7,8,9,10,11,12,13};
+  for(int i=0;i<11;i++)
+    CPPUNIT_ASSERT_EQUAL(expected1[i],f->getIJ(i,0));
+  //
+  f->decrRef();
+  e->decrRef();
+  d->decrRef();
+}