getfem-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Getfem-commits] r5140 - in /trunk/getfem: interface/src/gf_slice.cc src


From: Yves . Renard
Subject: [Getfem-commits] r5140 - in /trunk/getfem: interface/src/gf_slice.cc src/bgeot_convex_ref.cc src/getfem/dal_basic.h src/gmm/gmm_std.h
Date: Tue, 17 Nov 2015 17:02:27 -0000

Author: renard
Date: Tue Nov 17 18:02:26 2015
New Revision: 5140

URL: http://svn.gna.org/viewcvs/getfem?rev=5140&view=rev
Log:
more complete version of std::make_unique and some replacement of new by 
std::make_unique

Modified:
    trunk/getfem/interface/src/gf_slice.cc
    trunk/getfem/src/bgeot_convex_ref.cc
    trunk/getfem/src/getfem/dal_basic.h
    trunk/getfem/src/gmm/gmm_std.h

Modified: trunk/getfem/interface/src/gf_slice.cc
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/interface/src/gf_slice.cc?rev=5140&r1=5139&r2=5140&view=diff
==============================================================================
--- trunk/getfem/interface/src/gf_slice.cc      (original)
+++ trunk/getfem/interface/src/gf_slice.cc      Tue Nov 17 18:02:26 2015
@@ -219,74 +219,74 @@
 }
 
 static getfem::slicer_action*
-build_slicers(const getfem::mesh& m, 
dal::ptr_collection<getfem::slicer_action> & slicers,
+build_slicers(const getfem::mesh& m, 
std::vector<std::unique_ptr<getfem::slicer_action>> &slicers,
               const gfi_array *arg) {
   GMM_ASSERT1(gfi_array_get_class(arg) == GFI_CELL, "slices must be "
               "described as imbricated cell arrays");
   mexargs_in in(1, &arg, true);
   std::string cmd = in.pop().to_string();
   if (check_cmd(cmd, "none", in, 0, 0)) {
-    slicers.push_back(new getfem::slicer_none());
+    slicers.push_back(std::make_unique<getfem::slicer_none>());
   } else if (check_cmd(cmd, "planar", in, 3, 3)) {
     int orient = in.pop().to_integer(-1,2);
     getfem::base_node x0 = in.pop().to_base_node();
-    slicers.push_back(new getfem::slicer_half_space(x0, 
in.pop().to_base_node(), orient));
+    slicers.push_back(std::make_unique<getfem::slicer_half_space>(x0, 
in.pop().to_base_node(), orient));
   } else if (check_cmd(cmd, "ball", in, 3, 3)) {
     int orient = in.pop().to_integer(-1,2);
     getfem::base_node x0 = in.pop().to_base_node();
-    slicers.push_back(new getfem::slicer_sphere(x0, in.pop().to_scalar(1e-5), 
orient));
+    slicers.push_back(std::make_unique<getfem::slicer_sphere>(x0, 
in.pop().to_scalar(1e-5), orient));
   } else if (check_cmd(cmd, "cylinder", in, 4, 4)) {
     int orient = in.pop().to_integer(-1,2);
     getfem::base_node x0 = in.pop().to_base_node();
     getfem::base_node x1 = in.pop().to_base_node();
-    slicers.push_back(new getfem::slicer_cylinder(x0, x1, 
in.pop().to_scalar(1e-5), orient));
+    slicers.push_back(std::make_unique<getfem::slicer_cylinder>(x0, x1, 
in.pop().to_scalar(1e-5), orient));
   } else if (check_cmd(cmd, "isovalues", in, 4, 4)) {
     int orient = in.pop().to_integer(-1,2);
     const getfem::mesh_fem &mf = *in.pop().to_const_mesh_fem();
     darray U = in.pop().to_darray(int(mf.nb_dof()));
-    slicers.push_back(new 
getfem::slicer_isovalues(getfem::mesh_slice_cv_dof_data<darray>(mf,U),
+    
slicers.push_back(std::make_unique<getfem::slicer_isovalues>(getfem::mesh_slice_cv_dof_data<darray>(mf,U),
                                                    in.pop().to_scalar(), 
orient));
   } else if (check_cmd(cmd, "boundary", in, 0, 1)) {
     getfem::slicer_action *s1 = 0;
     if (in.remaining()) {
       s1 = build_slicers(m, slicers, in.pop().arg);
     } else {
-      slicers.push_back(new getfem::slicer_none());
-      s1 = slicers.back();
+      slicers.push_back(std::make_unique<getfem::slicer_none>());
+      s1 = slicers.back().get();
     }
     getfem::mesh_region cvflst;
     getfem::outer_faces_of_mesh(m, m.convex_index(), cvflst);
-    slicers.push_back(new getfem::slicer_boundary(m,*s1,cvflst));
+    slicers.push_back(std::make_unique<getfem::slicer_boundary>(m,*s1,cvflst));
   } else if (check_cmd(cmd, "explode", in, 1, 1)) {
     scalar_type c = in.pop().to_scalar();
-    slicers.push_back(new getfem::slicer_explode(c));
+    slicers.push_back(std::make_unique<getfem::slicer_explode>(c));
   } else if (check_cmd(cmd, "union", in, 1, -1)) {
     getfem::slicer_action *s1 = build_slicers(m, slicers, in.pop().arg);
     while (in.remaining()) {
       getfem::slicer_action *s2 = build_slicers(m, slicers, in.pop().arg);
-      slicers.push_back(new getfem::slicer_union(*s1,*s2));
-      s1 = slicers.back();
+      slicers.push_back(std::make_unique<getfem::slicer_union>(*s1,*s2));
+      s1 = slicers.back().get();
     }
   } else if (check_cmd(cmd, "intersection", in, 1, -1)) {
     getfem::slicer_action *s1 = build_slicers(m, slicers, in.pop().arg);
     while (in.remaining()) {
       getfem::slicer_action *s2 = build_slicers(m, slicers, in.pop().arg);
-      slicers.push_back(new getfem::slicer_intersect(*s1,*s2));
-      s1 = slicers.back();
+      slicers.push_back(std::make_unique<getfem::slicer_intersect>(*s1,*s2));
+      s1 = slicers.back().get();
     }
   } else if (check_cmd(cmd, "diff", in, 2, 2)) {
     getfem::slicer_action *s1 = build_slicers(m, slicers, in.pop().arg);
     getfem::slicer_action *s2 = build_slicers(m, slicers, in.pop().arg);
-    slicers.push_back(new getfem::slicer_complementary(*s2));
-    slicers.push_back(new getfem::slicer_intersect(*s1, *slicers.back()));
+    slicers.push_back(std::make_unique<getfem::slicer_complementary>(*s2));
+    slicers.push_back(std::make_unique<getfem::slicer_intersect>(*s1, 
*slicers.back()));
   } else if (check_cmd(cmd, "comp", in, 1, 1)) {
     getfem::slicer_action *s = build_slicers(m, slicers, in.pop().arg);
-    slicers.push_back(new getfem::slicer_complementary(*s));
+    slicers.push_back(std::make_unique<getfem::slicer_complementary>(*s));
   } else if (check_cmd(cmd, "mesh", in, 1, 1)) {
     const getfem::mesh &m2 = *in.pop().to_const_mesh();
-    slicers.push_back(new getfem::slicer_mesh_with_mesh(m2));
+    slicers.push_back(std::make_unique<getfem::slicer_mesh_with_mesh>(m2));
   } else bad_cmd(cmd);
-  return slicers.back();
+  return slicers.back().get();
 }
 
 
@@ -419,7 +419,7 @@
       id_type id; in.pop().to_const_mesh(id); mm = 
object_to_mesh(workspace().object(id));
     }
 
-    dal::ptr_collection<getfem::slicer_action> slicers;
+    std::vector<std::unique_ptr<getfem::slicer_action>> slicers;
     getfem::slicer_action * s = build_slicers(mm->mesh(), slicers, arg);
 
     /* build the slice */

Modified: trunk/getfem/src/bgeot_convex_ref.cc
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/bgeot_convex_ref.cc?rev=5140&r1=5139&r2=5140&view=diff
==============================================================================
--- trunk/getfem/src/bgeot_convex_ref.cc        (original)
+++ trunk/getfem/src/bgeot_convex_ref.cc        Tue Nov 17 18:02:26 2015
@@ -87,9 +87,6 @@
     dal::add_stored_object(psp, p, dal::AUTODELETE_STATIC_OBJECT);
     return p;
   }
-
-  //  struct cleanup_simplexified_convexes
-  //   : public dal::ptr_collection<mesh_structure> {};
 
   /* should be called on the basic_convex_ref */
   const mesh_structure* convex_of_reference::simplexified_convex() const {    

Modified: trunk/getfem/src/getfem/dal_basic.h
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem/dal_basic.h?rev=5140&r1=5139&r2=5140&view=diff
==============================================================================
--- trunk/getfem/src/getfem/dal_basic.h (original)
+++ trunk/getfem/src/getfem/dal_basic.h Tue Nov 17 18:02:26 2015
@@ -36,13 +36,6 @@
 */
 #ifndef DAL_BASIC_H__
 #define DAL_BASIC_H__
-
-/* *********************************************************************** */
-/* Remarks for future improvements:                                        */
-/*                                                                        */
-/* - For the moment, the allocation is made by new and delete[].           */
-/*                                                                        */
-/* *********************************************************************** */
 
 #include <vector>
 #include "dal_config.h"
@@ -205,7 +198,7 @@
     typedef size_t               size_type;
     typedef ptrdiff_t            difference_type;
     typedef unsigned char        pack_size_type;
-    typedef std::vector<pointer> pointer_array;
+    typedef std::vector<std::unique_ptr<T[]>> pointer_array;
     typedef dna_iterator<T, pks> iterator;
     typedef dna_const_iterator<T, pks> const_iterator;
     typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
@@ -303,15 +296,14 @@
   
   template<class T, unsigned char pks>
   void dynamic_array<T,pks>::clear(void) { 
-    typename pointer_array::iterator it  = array.begin();
-    typename pointer_array::iterator ite = it+ ((last_ind + DNAMPKS__) >> pks);
-    while (it != ite) delete[] *it++;
+    // typename pointer_array::iterator it  = array.begin();
+    // typename pointer_array::iterator ite = it+ ((last_ind + DNAMPKS__) >> 
pks);
+    // while (it != ite) delete[] *it++;
     array.clear(); init();
   }
   
   template<class T, unsigned char pks> dynamic_array<T,pks>
   &dynamic_array<T,pks>::operator = (const dynamic_array<T,pks> &da) {
-    clear(); /* evitable ... ? */
     array.resize(da.array.size());
     last_ind = da.last_ind;
     last_accessed = da.last_accessed;
@@ -320,9 +312,10 @@
     typename pointer_array::const_iterator ita = da.array.begin();
     typename pointer_array::iterator ite = it+ ((last_ind + DNAMPKS__) >> pks);
     while (it != ite) {
-      register pointer p = *it++ = new T[DNAMPKS__+1];
+      *it = std::make_unique<T[]>(DNAMPKS__+1);
+      register pointer p = it->get(); ++it;
       register pointer pe = p + (DNAMPKS__+1);
-      register const_pointer pa = *ita++;
+      register const_pointer pa = (ita++)->get();
       while (p != pe) *p++ = *pa++;
     }
     return *this;
@@ -332,7 +325,7 @@
     typename dynamic_array<T,pks>::const_reference
       dynamic_array<T,pks>::operator [](size_type ii) const { 
         DEFINE_STATIC_THREAD_LOCAL_INITIALIZED(std::shared_ptr<T>,pf,NULL);
-        if (pf.get() == NULL) { pf.reset(new T()); }
+        if (pf.get() == NULL) { pf = std::make_shared<T>(); }
         return (ii<last_ind) ? (array[ii>>pks])[ii&DNAMPKS__] : *pf;
   }
 
@@ -349,7 +342,7 @@
        }
        for (size_type jj = (last_ind >> pks); ii >= last_ind;
             jj++, last_ind += (DNAMPKS__ + 1))
-         { array[jj] = new T[DNAMPKS__ + 1]; }
+         { array[jj] = std::make_unique<T[]>(DNAMPKS__ + 1); }
       }
     }
     return (array[ii >> pks])[ii & DNAMPKS__];
@@ -383,20 +376,5 @@
     void swap(const dynamic_array<T,pks> &x, const dynamic_array<T,pks> &y)
   { x.swap(y); }
 
-
-  /** 
-   *  A very simple pointer collection
-   *  which destroys the content of its pointers 
-   */
-  template<class T> class ptr_collection : public std::vector<T*> {
-  public:
-    typedef typename std::vector<T*>::size_type size_type;
-    typedef typename std::vector<T*>::iterator iterator;
-    typedef typename std::vector<T*>::const_iterator const_iterator;
-    ptr_collection() : std::vector<T*>() {}
-    ptr_collection(size_type sz) : std::vector<T*>(sz) { 
std::fill(this->begin(),this->end(),0); }
-    ~ptr_collection() { for (iterator i=this->begin(); i != this->end(); ++i) 
{ if (*i) delete *i; *i = 0; } }
-  };
-
 }
 #endif /* DAL_BASIC_H__  */

Modified: trunk/getfem/src/gmm/gmm_std.h
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/gmm/gmm_std.h?rev=5140&r1=5139&r2=5140&view=diff
==============================================================================
--- trunk/getfem/src/gmm/gmm_std.h      (original)
+++ trunk/getfem/src/gmm/gmm_std.h      Tue Nov 17 18:02:26 2015
@@ -94,8 +94,8 @@
 */
 
 #if defined(__GNUC__)
-#  if (__GNUC__ < 3)
-#    error : PLEASE UPDATE g++ TO AT LEAST 3.0 VERSION
+#  if (__GNUC__ < 4)
+#    error : PLEASE UPDATE g++ TO AT LEAST 4.8 VERSION
 #  endif
 #endif
 
@@ -129,15 +129,37 @@
 #include <memory>
 #include <locale.h>
 
-#if defined(__GNUC__) || defined(__GNUG__)
+
+#if defined(__GNUC__) && (__cplusplus <= 201103L)
 namespace std {
-  template<typename T, typename ...Args>
-  unique_ptr<T> make_unique( Args&& ...args )
-  { return std::unique_ptr<T>( new T( std::forward<Args>(args)... ) ); }
+  template<typename _Tp>
+    struct _MakeUniq
+    { typedef unique_ptr<_Tp> __single_object; };
+  template<typename _Tp>
+    struct _MakeUniq<_Tp[]>
+    { typedef unique_ptr<_Tp[]> __array; };
+  template<typename _Tp, size_t _Bound>
+    struct _MakeUniq<_Tp[_Bound]>
+    { struct __invalid_type { }; };
+  /// std::make_unique for single objects
+  template<typename _Tp, typename... _Args>
+    inline typename _MakeUniq<_Tp>::__single_object
+    make_unique(_Args&&... __args)
+    { return unique_ptr<_Tp>(new _Tp(std::forward<_Args>(__args)...)); }
+  /// std::make_unique for arrays of unknown bound
+  template<typename _Tp>
+    inline typename _MakeUniq<_Tp>::__array
+    make_unique(size_t __num)
+    { return unique_ptr<_Tp>(new typename remove_extent<_Tp>::type[__num]()); }
+  /// Disable std::make_unique for arrays of known bound
+  template<typename _Tp, typename... _Args>
+    inline typename _MakeUniq<_Tp>::__invalid_type
+    make_unique(_Args&&...) = delete;
 }
 #endif
 
 #ifdef GETFEM_HAVE_OPENMP
+
 #include <omp.h>
        /**number of OpenMP threads*/
        inline size_t num_threads(){return omp_get_max_threads();}
@@ -376,4 +398,4 @@
 #  endif
 #endif
 
-#endif /* GMM_STD_H__ */
+#endif /* GMM_STD_H__ */




reply via email to

[Prev in Thread] Current Thread [Next in Thread]