]> SALOME platform Git repositories - tools/medcoupling.git/commitdiff
Salome HOME
DataArrayInt::buildUnique
authorageay <ageay>
Wed, 31 Oct 2012 11:38:33 +0000 (11:38 +0000)
committerageay <ageay>
Wed, 31 Oct 2012 11:38:33 +0000 (11:38 +0000)
src/MEDCoupling/MEDCouplingMemArray.cxx
src/MEDCoupling/MEDCouplingMemArray.hxx
src/MEDCoupling/Test/MEDCouplingBasicsTest5.cxx
src/MEDCoupling/Test/MEDCouplingBasicsTest5.hxx
src/MEDCoupling_Swig/MEDCouplingBasicsTest.py
src/MEDCoupling_Swig/MEDCouplingCommon.i

index c7f0a8fb91f23f27278aa3d08f7ad6c1bdb46e36..d765f7ab4aa79922e5dbe5bfce7cc7e550dbe05d 100644 (file)
@@ -28,6 +28,7 @@
 #include <cmath>
 #include <limits>
 #include <numeric>
+#include <algorithm>
 #include <functional>
 
 typedef double (*MYFUNCPTR)(double);
@@ -5510,6 +5511,30 @@ DataArrayInt *DataArrayInt::buildIntersection(const DataArrayInt *other) const t
   return BuildIntersection(arrs);
 }
 
+/*!
+ * This method can be applied on allocated with one component DataArrayInt instance.
+ * This method is typically relevant for sorted arrays. All consecutive duplicated items in \a this will appear only once in returned DataArrayInt instance.
+ * Example : if \a this contains [1,2,2,3,3,3,3,4,5,5,7,7,7,19] the returned array will contain [1,2,3,4,5,7,19]
+ * 
+ * \return a newly allocated array that contain the result of the unique operation applied on \a this.
+ * \throw if \a this is not allocated or if \a this has not exactly one component.
+ */
+DataArrayInt *DataArrayInt::buildUnique() const throw(INTERP_KERNEL::Exception)
+{
+  checkAllocated();
+  if(getNumberOfComponents()!=1)
+     throw INTERP_KERNEL::Exception("DataArrayInt::buildUnique : only single component allowed !");
+  int nbOfTuples=getNumberOfTuples();
+  MEDCouplingAutoRefCountObjectPtr<DataArrayInt> tmp=deepCpy();
+  int *data=tmp->getPointer();
+  int *last=std::unique(data,data+nbOfTuples);
+  MEDCouplingAutoRefCountObjectPtr<DataArrayInt> ret=DataArrayInt::New();
+  ret->alloc(std::distance(data,last),1);
+  std::copy(data,last,ret->getPointer());
+  ret->incrRef();
+  return ret;
+}
+
 /*!
  * This method could be usefull for returned DataArrayInt marked as index. Some methods that generate such DataArrayInt instances:
  * - ParaMEDMEM::MEDCouplingUMesh::buildDescendingConnectivity
index 603156745dd26e4cf4fe858356c4f07dae1a75ad..8b009d0477734a0f56cd471eb5474d83e0ee4db0 100644 (file)
@@ -459,6 +459,7 @@ namespace ParaMEDMEM
     MEDCOUPLING_EXPORT DataArrayInt *buildSubstraction(const DataArrayInt *other) const throw(INTERP_KERNEL::Exception);
     MEDCOUPLING_EXPORT DataArrayInt *buildUnion(const DataArrayInt *other) const throw(INTERP_KERNEL::Exception);
     MEDCOUPLING_EXPORT DataArrayInt *buildIntersection(const DataArrayInt *other) const throw(INTERP_KERNEL::Exception);
+    MEDCOUPLING_EXPORT DataArrayInt *buildUnique() const throw(INTERP_KERNEL::Exception);
     MEDCOUPLING_EXPORT DataArrayInt *deltaShiftIndex() const throw(INTERP_KERNEL::Exception);
     MEDCOUPLING_EXPORT void computeOffsets() throw(INTERP_KERNEL::Exception);
     MEDCOUPLING_EXPORT void computeOffsets2() throw(INTERP_KERNEL::Exception);
index 352212aed5d3ec77acbf81a1ee17636ba0569660..1068b74c043bac990c91372811beb82229696391 100644 (file)
@@ -1620,3 +1620,21 @@ void MEDCouplingBasicsTest5::testIntersect2DMeshesTmp5()
   m2->decrRef();
   m1->decrRef();
 }
+
+void MEDCouplingBasicsTest5::testDAIBuildUnique1()
+{
+  DataArrayInt *d=DataArrayInt::New();
+  const int dData[14]={1,2,2,3,3,3,3,4,5,5,7,7,7,19};
+  d->useArray(dData,false,CPP_DEALLOC,14,1);
+  const int expectedData[7]={1,2,3,4,5,7,19};
+  //
+  DataArrayInt *e=d->buildUnique();
+  CPPUNIT_ASSERT_EQUAL(7,e->getNumberOfTuples());
+  CPPUNIT_ASSERT_EQUAL(1,e->getNumberOfComponents());
+  for(int i=0;i<7;i++)
+    CPPUNIT_ASSERT_EQUAL(expectedData[i],e->getIJ(i,0));
+  //
+  e->decrRef();
+  d->decrRef();
+}
+
index 70337a7ccce2d7222b7effdbbe27781bff513eaf..8f4607cc9a23eb8f8a816d3213f9e868179e748c 100644 (file)
@@ -67,6 +67,7 @@ namespace ParaMEDMEM
     CPPUNIT_TEST( testKrSpatialDiscretization1 );
     CPPUNIT_TEST( testDuplicateEachTupleNTimes1 );
     CPPUNIT_TEST( testIntersect2DMeshesTmp5 );
+    CPPUNIT_TEST( testDAIBuildUnique1 );
     CPPUNIT_TEST_SUITE_END();
   public:
     void testUMeshTessellate2D1();
@@ -100,6 +101,7 @@ namespace ParaMEDMEM
     void testKrSpatialDiscretization1();
     void testDuplicateEachTupleNTimes1();
     void testIntersect2DMeshesTmp5();
+    void testDAIBuildUnique1();
   };
 }
 
index 8a89f9a652fcec061aa8973550d7341f6b4a0171..0d4461be34fbbb47f70423acab491488a4e73d0d 100644 (file)
@@ -10265,6 +10265,12 @@ class MEDCouplingBasicsTest(unittest.TestCase):
         self.assertEqual(expected2,d2.getValues())
         pass
 
+    def testDAIBuildUnique1(self):
+        d=DataArrayInt([1,2,2,3,3,3,3,4,5,5,7,7,7,19])
+        e=d.buildUnique()
+        self.assertTrue(e.isEqual(DataArrayInt([1,2,3,4,5,7,19])))
+        pass
+
     def setUp(self):
         pass
     pass
index 51afd5e27d536f25feb7d4683e6898f64873ed67..d7ab7e4a195f9d7db537faa7c5da745bdd394fc4 100644 (file)
@@ -162,6 +162,7 @@ using namespace INTERP_KERNEL;
 %newobject ParaMEDMEM::DataArrayInt::buildUnion;
 %newobject ParaMEDMEM::DataArrayInt::buildSubstraction;
 %newobject ParaMEDMEM::DataArrayInt::buildIntersection;
+%newobject ParaMEDMEM::DataArrayInt::buildUnique;
 %newobject ParaMEDMEM::DataArrayInt::deltaShiftIndex;
 %newobject ParaMEDMEM::DataArrayInt::buildExplicitArrByRanges;
 %newobject ParaMEDMEM::DataArrayInt::findRangeIdForEachTuple;