From c23bae39d9c4d688ab65ea4043c5b0666d961600 Mon Sep 17 00:00:00 2001
From: Giovanni Bussi <giovanni.bussi@gmail.com>
Date: Mon, 18 Sep 2017 19:26:01 +0200
Subject: [PATCH] unique_ptr: gridtools

Not complete yet
---
 src/analysis/Histogram.cpp        | 2 +-
 src/gridtools/HistogramOnGrid.cpp | 7 +++----
 src/gridtools/HistogramOnGrid.h   | 3 ++-
 3 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/src/analysis/Histogram.cpp b/src/analysis/Histogram.cpp
index 0654a3255..b645ec7a7 100644
--- a/src/analysis/Histogram.cpp
+++ b/src/analysis/Histogram.cpp
@@ -401,7 +401,7 @@ void Histogram::prepareForAveraging() {
     std::vector<double> point( getNumberOfArguments() );
     for(unsigned i=0; i<point.size(); ++i) point[i]=getArgument(i);
     unsigned num_neigh; std::vector<unsigned> neighbors(1);
-    kernel.reset(myhist->getKernelAndNeighbors( point, num_neigh, neighbors ));
+    kernel=myhist->getKernelAndNeighbors( point, num_neigh, neighbors );
 
     if( num_neigh>1 ) {
       // Activate relevant tasks
diff --git a/src/gridtools/HistogramOnGrid.cpp b/src/gridtools/HistogramOnGrid.cpp
index 00a0a3b25..2644fd4af 100644
--- a/src/gridtools/HistogramOnGrid.cpp
+++ b/src/gridtools/HistogramOnGrid.cpp
@@ -74,13 +74,13 @@ void HistogramOnGrid::setBounds( const std::vector<std::string>& smin, const std
   }
 }
 
-KernelFunctions* HistogramOnGrid::getKernelAndNeighbors( std::vector<double>& point, unsigned& num_neigh, std::vector<unsigned>& neighbors ) const {
+std::unique_ptr<KernelFunctions> HistogramOnGrid::getKernelAndNeighbors( std::vector<double>& point, unsigned& num_neigh, std::vector<unsigned>& neighbors ) const {
   if( discrete ) {
     plumed_assert( getType()=="flat" );
     num_neigh=1; for(unsigned i=0; i<dimension; ++i) point[i] += 0.5*dx[i];
     neighbors[0] = getIndex( point ); return NULL;
   } else if( getType()=="flat" ) {
-    KernelFunctions* kernel = new KernelFunctions( point, bandwidths, kerneltype, "DIAGONAL", 1.0 );
+    std::unique_ptr<KernelFunctions> kernel(new KernelFunctions( point, bandwidths, kerneltype, "DIAGONAL", 1.0 ));
     kernel->normalize( getVectorOfValues() ); getNeighbors( kernel->getCenter(), nneigh, num_neigh, neighbors );
     return kernel;
   } else if( getType()=="fibonacci" ) {
@@ -116,7 +116,7 @@ void HistogramOnGrid::calculate( const unsigned& current, MultiValue& myvals, st
     // Get the kernel
     unsigned num_neigh; std::vector<unsigned> neighbors;
     std::vector<double> der( dimension );
-    KernelFunctions* kernel=getKernelAndNeighbors( point, num_neigh, neighbors );
+    std::unique_ptr<KernelFunctions> kernel=getKernelAndNeighbors( point, num_neigh, neighbors );
 
     if( !kernel && getType()=="flat" ) {
       plumed_dbg_assert( num_neigh==1 ); der.resize(0);
@@ -169,7 +169,6 @@ void HistogramOnGrid::calculate( const unsigned& current, MultiValue& myvals, st
           buffer[ bufstart + gridbuf + nder + 1 + kder ] += myvals.getDerivative( 0, kder );
         }
       }
-      if( kernel ) delete kernel;
       for(unsigned i=0; i<dimension; ++i) delete vv[i];
     }
   }
diff --git a/src/gridtools/HistogramOnGrid.h b/src/gridtools/HistogramOnGrid.h
index 44d698812..30af6d633 100644
--- a/src/gridtools/HistogramOnGrid.h
+++ b/src/gridtools/HistogramOnGrid.h
@@ -23,6 +23,7 @@
 #define __PLUMED_gridtools_HistogramOnGrid_h
 
 #include "GridVessel.h"
+#include <memory>
 
 namespace PLMD {
 
@@ -51,7 +52,7 @@ public:
   virtual void accumulate( const unsigned& ipoint, const double& weight, const double& dens, const std::vector<double>& der, std::vector<double>& buffer ) const ;
   virtual void accumulateForce( const unsigned& ipoint, const double& weight, const std::vector<double>& der, std::vector<double>& intforce ) const ;
   unsigned getNumberOfBufferPoints() const ;
-  KernelFunctions* getKernelAndNeighbors( std::vector<double>& point, unsigned& num_neigh, std::vector<unsigned>& neighbors ) const;
+  std::unique_ptr<KernelFunctions> getKernelAndNeighbors( std::vector<double>& point, unsigned& num_neigh, std::vector<unsigned>& neighbors ) const;
   std::vector<Value*> getVectorOfValues() const ;
   void addOneKernelEachTimeOnly() { addOneKernelAtATime=true; }
   virtual void getFinalForces( const std::vector<double>& buffer, std::vector<double>& finalForces );
-- 
GitLab