Use smart pointer to pass ownership across functions.
authorTeemu Murtola <teemu.murtola@gmail.com>
Sat, 25 Feb 2012 05:40:38 +0000 (07:40 +0200)
committerRoland Schulz <roland@utk.edu>
Sat, 17 Mar 2012 18:48:06 +0000 (14:48 -0400)
Changed methods that take ownership of an object passed as a parameter
to take a gmx_unique_ptr instead of a plain pointer.
Changed methods that pass ownership of an object out as a return value
to return a gmx_unique_ptr instead of a plain pointer.

For all module pointers using boost::shared pointer because
caller of AbstractAnalysisData::addModule() should be able to keep
ownership but should not be required to keep it.

Conflicts:

src/gromacs/analysisdata/abstractdata-impl.h
src/gromacs/analysisdata/abstractdata.cpp
src/gromacs/options/options-impl.h

Change-Id: Ic5d00695d647a0ac8750edcbf585b801bf8b59ac

37 files changed:
share/template/template.cpp
src/gromacs/analysisdata/abstractdata-impl.h
src/gromacs/analysisdata/abstractdata.cpp
src/gromacs/analysisdata/abstractdata.h
src/gromacs/analysisdata/modules/average.h
src/gromacs/analysisdata/modules/displacement.cpp
src/gromacs/analysisdata/modules/displacement.h
src/gromacs/analysisdata/modules/histogram-impl.h
src/gromacs/analysisdata/modules/histogram.cpp
src/gromacs/analysisdata/modules/histogram.h
src/gromacs/analysisdata/modules/plot.cpp
src/gromacs/analysisdata/modules/plot.h
src/gromacs/analysisdata/tests/analysisdata.cpp
src/gromacs/analysisdata/tests/average.cpp
src/gromacs/analysisdata/tests/datatest.cpp
src/gromacs/analysisdata/tests/histogram.cpp
src/gromacs/analysisdata/tests/mock_module.h
src/gromacs/options/abstractoption.h
src/gromacs/options/basicoptions.cpp
src/gromacs/options/basicoptions.h
src/gromacs/options/options-impl.h
src/gromacs/options/options.cpp
src/gromacs/options/tests/abstractoptionstorage.cpp
src/gromacs/selection/selectionoption.cpp
src/gromacs/selection/selectionoption.h
src/gromacs/trajectoryanalysis/analysismodule.cpp
src/gromacs/trajectoryanalysis/analysismodule.h
src/gromacs/trajectoryanalysis/cmdlinerunner.cpp
src/gromacs/trajectoryanalysis/modules.cpp
src/gromacs/trajectoryanalysis/modules.h
src/gromacs/trajectoryanalysis/modules/angle.cpp
src/gromacs/trajectoryanalysis/modules/angle.h
src/gromacs/trajectoryanalysis/modules/distance.cpp
src/gromacs/trajectoryanalysis/modules/distance.h
src/gromacs/trajectoryanalysis/modules/select.cpp
src/gromacs/trajectoryanalysis/modules/select.h
src/programs/g_ana/g_ana.cpp

index 0efd239cb2ea51b584da1970244677476b2afd3f..a4bde5dd8add96bbec194cbe7f99703fb008be97 100644 (file)
@@ -47,7 +47,7 @@ class AnalysisTemplate : public TrajectoryAnalysisModule
         virtual void initAnalysis(const TrajectoryAnalysisSettings &settings,
                                   const TopologyInformation &top);
 
-        virtual TrajectoryAnalysisModuleData *startFrames(
+        virtual TrajectoryAnalysisModuleDataPointer startFrames(
                     const AnalysisDataParallelOptions &opt,
                     const SelectionCollection &selections);
         virtual void analyzeFrame(int frnr, const t_trxframe &fr, t_pbc *pbc,
@@ -59,13 +59,13 @@ class AnalysisTemplate : public TrajectoryAnalysisModule
     private:
         class ModuleData;
 
-        Options                      _options;
-        std::string                  _fnDist;
-        double                       _cutoff;
-        Selection                   *_refsel;
-        std::vector<Selection *>     _sel;
-        AnalysisData                 _data;
-        AnalysisDataAverageModule   *_avem;
+        Options                          _options;
+        std::string                      _fnDist;
+        double                           _cutoff;
+        Selection                       *_refsel;
+        std::vector<Selection *>         _sel;
+        AnalysisData                     _data;
+        AnalysisDataAverageModulePointer _avem;
 };
 
 /*! \brief
@@ -105,7 +105,7 @@ class AnalysisTemplate::ModuleData : public TrajectoryAnalysisModuleData
 
 AnalysisTemplate::AnalysisTemplate()
     : _options("template", "Template options"), _cutoff(0.0),
-      _refsel(NULL), _avem(NULL)
+      _refsel(NULL), _avem(new AnalysisDataAverageModule())
 {
 }
 
@@ -160,13 +160,12 @@ AnalysisTemplate::initAnalysis(const TrajectoryAnalysisSettings &settings,
     _data.setColumns(_sel.size());
     registerAnalysisDataset(&_data, "avedist");
 
-    _avem = new AnalysisDataAverageModule();
     _data.addModule(_avem);
 
     if (!_fnDist.empty())
     {
-        AnalysisDataPlotModule *plotm
-            = new AnalysisDataPlotModule(settings.plotSettings());
+        AnalysisDataPlotModulePointer plotm(
+            new AnalysisDataPlotModule(settings.plotSettings()));
         plotm->setFileName(_fnDist);
         plotm->setTitle("Average distance");
         plotm->setXAxisIsTime();
@@ -176,11 +175,12 @@ AnalysisTemplate::initAnalysis(const TrajectoryAnalysisSettings &settings,
 }
 
 
-TrajectoryAnalysisModuleData *
+TrajectoryAnalysisModuleDataPointer
 AnalysisTemplate::startFrames(const AnalysisDataParallelOptions &opt,
                               const SelectionCollection &selections)
 {
-    return new ModuleData(this, opt, selections, _cutoff, _refsel->posCount());
+    return TrajectoryAnalysisModuleDataPointer(
+            new ModuleData(this, opt, selections, _cutoff, _refsel->posCount()));
 }
 
 
index ef7737d60a9e543b86b9d71c8a41c1b0952d14a5..16a16e66eff0bbd4c93f7f2cc5b91406035f9abb 100644 (file)
@@ -58,10 +58,8 @@ namespace gmx
 class AbstractAnalysisData::Impl
 {
     public:
-        //! Shorthand for a smart pointer to a module.
-        typedef gmx_unique_ptr<AnalysisDataModuleInterface>::type ModulePointer;
         //! Shorthand for list of modules added to the data.
-        typedef std::vector<ModulePointer> ModuleList;
+        typedef std::vector<AnalysisDataModulePointer> ModuleList;
 
         Impl();
         ~Impl();
index 19639587494c37b49a13d585a5748ce334467a6f..8af05b29972e8bb0aad010d15e987e6f1bb12715 100644 (file)
@@ -37,8 +37,6 @@
  */
 #include "gromacs/analysisdata/abstractdata.h"
 
-#include <memory>
-
 #include "gromacs/fatalerror/exceptions.h"
 #include "gromacs/fatalerror/gmxassert.h"
 
@@ -149,9 +147,8 @@ AbstractAnalysisData::requestStorage(int nframes)
 
 
 void
-AbstractAnalysisData::addModule(AnalysisDataModuleInterface *module)
+AbstractAnalysisData::addModule(AnalysisDataModulePointer module)
 {
-    Impl::ModulePointer module_ptr(module);
     if ((columnCount() > 1 && !(module->flags() & AnalysisDataModuleInterface::efAllowMulticolumn))
         || (isMultipoint() && !(module->flags() & AnalysisDataModuleInterface::efAllowMultipoint))
         || (!isMultipoint() && (module->flags() & AnalysisDataModuleInterface::efOnlyMultipoint)))
@@ -163,21 +160,20 @@ AbstractAnalysisData::addModule(AnalysisDataModuleInterface *module)
     {
         GMX_RELEASE_ASSERT(!_impl->_bInFrame,
                            "Cannot add data modules in mid-frame");
-        _impl->presentData(this, module);
+        _impl->presentData(this, module.get());
     }
     if (!(module->flags() & AnalysisDataModuleInterface::efAllowMissing))
     {
         _impl->_bAllowMissing = false;
     }
-    _impl->_modules.push_back(move(module_ptr));
+    _impl->_modules.push_back(move(module));
 }
 
 
 void
 AbstractAnalysisData::addColumnModule(int col, int span,
-                                      AnalysisDataModuleInterface *module)
+                                      AnalysisDataModulePointer module)
 {
-    std::auto_ptr<AnalysisDataModuleInterface> module_ptr(module);
     GMX_RELEASE_ASSERT(col >= 0 && span >= 1 && col + span <= _ncol,
                        "Invalid columns specified for a column module");
     if (_impl->_bDataStart)
@@ -185,9 +181,10 @@ AbstractAnalysisData::addColumnModule(int col, int span,
         GMX_THROW(NotImplementedError("Cannot add column modules after data"));
     }
 
-    std::auto_ptr<AnalysisDataProxy> proxy(new AnalysisDataProxy(col, span, this));
-    proxy->addModule(module_ptr.release());
-    addModule(proxy.release());
+    boost::shared_ptr<AnalysisDataProxy> proxy(
+            new AnalysisDataProxy(col, span, this));
+    proxy->addModule(module);
+    addModule(proxy);
 }
 
 
index f2575512f473715d3c48a09f030cd1bd5123b682..654fffb228dfcb1b8dd278fb2440d8f90fd5ba7a 100644 (file)
@@ -39,6 +39,8 @@
 #ifndef GMX_ANALYSISDATA_ABSTRACTDATA_H
 #define GMX_ANALYSISDATA_ABSTRACTDATA_H
 
+#include <boost/shared_ptr.hpp>
+
 #include "../legacyheaders/types/simple.h"
 
 #include "../utility/common.h"
@@ -52,6 +54,9 @@ class AnalysisDataFrameRef;
 class AnalysisDataPointSetRef;
 class AnalysisDataStorage;
 
+//! Smart pointer for managing a generic analysis data module.
+typedef boost::shared_ptr<AnalysisDataModuleInterface> AnalysisDataModulePointer;
+
 /*! \brief
  * Abstract base class for all objects that provide data.
  *
@@ -196,15 +201,11 @@ class AbstractAnalysisData
          * immediately processes all existing data.  APIError is thrown
          * if all data is not available through getDataFrame().
          *
-         * When this function is entered, the data object takes ownership of the
-         * module, and automatically destructs it when the data object itself
-         * is destroyed.
-         *
-         * \todo
-         * Provide additional semantics that does not acquire ownership of the
-         * data object.
+         * By default, the data object takes ownership of the module, and
+         * automatically destructs it when the data object itself is destroyed.
+         * See keepOwnership() for a way to keep the ownership with the caller.
          */
-        void addModule(AnalysisDataModuleInterface *module);
+        void addModule(AnalysisDataModulePointer module);
         /*! \brief
          * Adds a module that processes only a subset of the columns.
          *
@@ -214,7 +215,7 @@ class AbstractAnalysisData
          *
          * \see addModule()
          */
-        void addColumnModule(int col, int span, AnalysisDataModuleInterface *module);
+        void addColumnModule(int col, int span, AnalysisDataModulePointer module);
         /*! \brief
          * Applies a module to process data that is ready.
          *
index 76eba26d520097f12a12330e0535bfece28fb1bd..661814a0cd113c5061c515b23cc23f478bc05700 100644 (file)
@@ -88,6 +88,10 @@ class AnalysisDataAverageModule : public AbstractAnalysisArrayData,
         // Copy and assign disallowed by base.
 };
 
+//! Smart pointer to manage an AnalysisDataAverageModule object.
+typedef boost::shared_ptr<AnalysisDataAverageModule>
+        AnalysisDataAverageModulePointer;
+
 } // namespace gmx
 
 #endif
index d269469bb87db49694ccf785f390d43df2b96ae1..642546d6209da1e6b7894264adefaaee2f7c5302 100644 (file)
@@ -96,10 +96,11 @@ AnalysisDataDisplacementModule::setMaxTime(real tmax)
 
 
 void
-AnalysisDataDisplacementModule::setMSDHistogram(AnalysisDataBinAverageModule *histm)
+AnalysisDataDisplacementModule::setMSDHistogram(
+        AnalysisDataBinAverageModulePointer histm)
 {
-    GMX_RELEASE_ASSERT(!_impl->histm, "Can only set MSD histogram once");
-    _impl->histm = histm;
+    GMX_RELEASE_ASSERT(_impl->histm == NULL, "Can only set MSD histogram once");
+    _impl->histm = histm.get();
     addModule(histm);
 }
 
index 4bbc3e2ae4a25ffdb5c3627be39233ceaa8a0789..10fd5f8de6abc26e4bd66b19456ca0e159138638 100644 (file)
@@ -39,7 +39,7 @@
 #ifndef GMX_ANALYSISDATA_MODULES_DISPLACEMENT_H
 #define GMX_ANALYSISDATA_MODULES_DISPLACEMENT_H
 
-#include "../analysisdata.h"
+#include "../abstractdata.h"
 #include "../datamodule.h"
 
 namespace gmx
@@ -77,7 +77,7 @@ class AnalysisDataDisplacementModule : public AbstractAnalysisData,
          *
          * If this function is not called, no histogram is calculated.
          */
-        void setMSDHistogram(AnalysisDataBinAverageModule *histm);
+        void setMSDHistogram(boost::shared_ptr<AnalysisDataBinAverageModule> histm);
 
         virtual int flags() const;
 
@@ -96,6 +96,10 @@ class AnalysisDataDisplacementModule : public AbstractAnalysisData,
         PrivateImplPointer<Impl> _impl;
 };
 
+//! Smart pointer to manage an AnalysisDataDisplacementModule object.
+typedef boost::shared_ptr<AnalysisDataDisplacementModule>
+        AnalysisDataDisplacementModulePointer;
+
 } // namespace gmx
 
 #endif
index b1362e87cc91bc1579089db032875b302553f75d..3d736b104a8370044e86d17df7da4cfe2ae9ce72 100644 (file)
@@ -63,6 +63,7 @@ class StaticAverageHistogram : public AbstractAverageHistogram
 {
     public:
         StaticAverageHistogram();
+        //! Creates an average histogram module with defined bin parameters.
         explicit StaticAverageHistogram(const AnalysisHistogramSettings &settings);
 
         // Copy and assign disallowed by base.
@@ -83,6 +84,8 @@ class BasicAverageHistogramModule : public AbstractAverageHistogram,
                                     public AnalysisDataModuleInterface
 {
     public:
+        BasicAverageHistogramModule();
+        //! Creates an average histogram module with defined bin parameters.
         explicit BasicAverageHistogramModule(const AnalysisHistogramSettings &settings);
 
         using AbstractAverageHistogram::init;
@@ -102,6 +105,9 @@ class BasicAverageHistogramModule : public AbstractAverageHistogram,
         // Copy and assign disallowed by base.
 };
 
+//! Smart pointer to manage an BasicAverageHistogramModule object.
+typedef boost::shared_ptr<BasicAverageHistogramModule>
+    BasicAverageHistogramModulePointer;
 
 /*! \internal \brief
  * Private implementation class for AnalysisDataSimpleHistogramModule and
@@ -113,6 +119,7 @@ class BasicHistogramImpl
 {
     public:
         BasicHistogramImpl();
+        //! Creates an histogram impl with defined bin parameters.
         explicit BasicHistogramImpl(const AnalysisHistogramSettings &settings);
         ~BasicHistogramImpl();
 
@@ -120,22 +127,17 @@ class BasicHistogramImpl
          * (Re)initializes the histogram from settings.
          */
         void init(const AnalysisHistogramSettings &settings);
-        /*! \brief
-         * Creates the averager and adds it as a module to \p data if it does
-         * not exist.
-         */
-        void ensureAveragerExists(AbstractAnalysisData *data);
         /*! \brief
          * Initializes data storage frame when a new frame starts.
          */
         void initFrame(AnalysisDataStorageFrame *frame);
 
         //! Storage implementation object.
-        AnalysisDataStorage             storage_;
+        AnalysisDataStorage                  storage_;
         //! Settings for the histogram object.
-        AnalysisHistogramSettings       settings_;
-        //! Averager module, or NULL if not yet allocated.
-        BasicAverageHistogramModule    *averager_;
+        AnalysisHistogramSettings            settings_;
+        //! Averager module.
+        BasicAverageHistogramModulePointer   averager_;
 };
 
 } // namespace internal
index ce545dcfee32837fbfa11a70cf2e85024459417e..0c3e88105fb3fa2ed37364c3993e5ec320abe99a 100644 (file)
@@ -40,7 +40,6 @@
 #include <cmath>
 
 #include <limits>
-#include <memory>
 
 #include "gromacs/basicmath.h"
 #include "gromacs/analysisdata/dataframe.h"
@@ -217,7 +216,7 @@ AbstractAverageHistogram::init(const AnalysisHistogramSettings &settings)
 }
 
 
-AbstractAverageHistogram *
+AverageHistogramPointer
 AbstractAverageHistogram::resampleDoubleBinWidth(bool bIntegerBins) const
 {
     int nbins;
@@ -231,7 +230,7 @@ AbstractAverageHistogram::resampleDoubleBinWidth(bool bIntegerBins) const
     }
 
     real minx = xstart();
-    std::auto_ptr<AbstractAverageHistogram> dest(
+    AverageHistogramPointer dest(
         new internal::StaticAverageHistogram(
             histogramFromBins(xstart(), nbins, 2*xstep())
                 .integerBins(bIntegerBins)));
@@ -273,17 +272,16 @@ AbstractAverageHistogram::resampleDoubleBinWidth(bool bIntegerBins) const
             j += 2;
         }
     }
-    return dest.release();
+    return dest;
 }
 
 
-AbstractAverageHistogram *
+AverageHistogramPointer
 AbstractAverageHistogram::clone() const
 {
-    std::auto_ptr<AbstractAverageHistogram> dest(
-            new internal::StaticAverageHistogram());
+    AverageHistogramPointer dest(new internal::StaticAverageHistogram());
     copyContents(this, dest.get());
-    return dest.release();
+    return dest;
 }
 
 
@@ -344,6 +342,13 @@ StaticAverageHistogram::StaticAverageHistogram(
  * BasicAverageHistogramModule
  */
 
+BasicAverageHistogramModule::BasicAverageHistogramModule()
+    : frameCount_(0)
+{
+    setColumnCount(2);
+}
+
+
 BasicAverageHistogramModule::BasicAverageHistogramModule(
         const AnalysisHistogramSettings &settings)
     : AbstractAverageHistogram(settings), frameCount_(0)
@@ -412,13 +417,13 @@ BasicAverageHistogramModule::dataFinished()
  */
 
 BasicHistogramImpl::BasicHistogramImpl()
-    : averager_(NULL)
+    : averager_(new BasicAverageHistogramModule())
 {
 }
 
 
 BasicHistogramImpl::BasicHistogramImpl(const AnalysisHistogramSettings &settings)
-    : settings_(settings), averager_(NULL)
+    : settings_(settings), averager_(new BasicAverageHistogramModule(settings))
 {
 }
 
@@ -431,21 +436,7 @@ BasicHistogramImpl::~BasicHistogramImpl()
 void BasicHistogramImpl::init(const AnalysisHistogramSettings &settings)
 {
     settings_ = settings;
-    if (averager_ != NULL)
-    {
-        averager_->init(settings);
-    }
-}
-
-
-void
-BasicHistogramImpl::ensureAveragerExists(AbstractAnalysisData *data)
-{
-    if (averager_ == NULL)
-    {
-        averager_ = new BasicAverageHistogramModule(settings_);
-        data->addModule(averager_);
-    }
+    averager_->init(settings);
 }
 
 
@@ -489,11 +480,10 @@ void AnalysisDataSimpleHistogramModule::init(const AnalysisHistogramSettings &se
 }
 
 
-AbstractAverageHistogram *
+AbstractAverageHistogram &
 AnalysisDataSimpleHistogramModule::averager()
 {
-    impl_->ensureAveragerExists(this);
-    return impl_->averager_;
+    return *impl_->averager_;
 }
 
 
@@ -514,7 +504,7 @@ AnalysisDataSimpleHistogramModule::flags() const
 void
 AnalysisDataSimpleHistogramModule::dataStarted(AbstractAnalysisData *data)
 {
-    impl_->ensureAveragerExists(this);
+    addModule(impl_->averager_);
     setColumnCount(settings().binCount());
     notifyDataStart();
     impl_->storage_.startDataStorage(this);
@@ -601,11 +591,10 @@ void AnalysisDataWeightedHistogramModule::init(const AnalysisHistogramSettings &
 }
 
 
-AbstractAverageHistogram *
+AbstractAverageHistogram &
 AnalysisDataWeightedHistogramModule::averager()
 {
-    impl_->ensureAveragerExists(this);
-    return impl_->averager_;
+    return *impl_->averager_;
 }
 
 
@@ -626,7 +615,7 @@ AnalysisDataWeightedHistogramModule::flags() const
 void
 AnalysisDataWeightedHistogramModule::dataStarted(AbstractAnalysisData *data)
 {
-    impl_->ensureAveragerExists(this);
+    addModule(impl_->averager_);
     setColumnCount(settings().binCount());
     notifyDataStart();
     impl_->storage_.startDataStorage(this);
index 8d817ed35b6704b34bbbcb171b27c281203783e6..7971386e1b5dec6d50e3d8697fde00d0e5827d12 100644 (file)
 #ifndef GMX_ANALYSISDATA_MODULES_HISTOGRAM_H
 #define GMX_ANALYSISDATA_MODULES_HISTOGRAM_H
 
-#include "../analysisdata.h"
+#include "../abstractdata.h"
 #include "../arraydata.h"
 #include "../datamodule.h"
+#include "../../utility/uniqueptr.h"
 
 namespace gmx
 {
@@ -230,6 +231,11 @@ class BasicHistogramImpl;
 
 } // namespace internal
 
+class AbstractAverageHistogram;
+
+//! Smart pointer to manage an AbstractAverageHistogram object.
+typedef gmx_unique_ptr<AbstractAverageHistogram>::type
+        AverageHistogramPointer;
 
 /*! \brief
  * Base class for representing histograms averaged over frames.
@@ -257,7 +263,7 @@ class AbstractAverageHistogram : public AbstractAnalysisArrayData
          *
          * The caller is responsible of deleting the returned object.
          */
-        AbstractAverageHistogram *resampleDoubleBinWidth(bool bIntegerBins) const;
+        AverageHistogramPointer resampleDoubleBinWidth(bool bIntegerBins) const;
         /*! \brief
          * Creates a deep copy of the histogram.
          *
@@ -267,7 +273,7 @@ class AbstractAverageHistogram : public AbstractAnalysisArrayData
          *
          * The caller is responsible of deleting the returned object.
          */
-        AbstractAverageHistogram *clone() const;
+        AverageHistogramPointer clone() const;
         //! Normalizes the histogram such that the integral over it is one.
         void normalizeProbability();
         //! Scales the value of each bin by an uniform scaling factor.
@@ -344,7 +350,7 @@ class AnalysisDataSimpleHistogramModule : public AbstractAnalysisData,
          *
          * \see AbstractAverageHistogram
          */
-        AbstractAverageHistogram *averager();
+        AbstractAverageHistogram &averager();
 
         //! Returns bin properties for the histogram.
         const AnalysisHistogramSettings &settings() const;
@@ -395,7 +401,7 @@ class AnalysisDataWeightedHistogramModule : public AbstractAnalysisData,
         void init(const AnalysisHistogramSettings &settings);
 
         //! \copydoc AnalysisDataSimpleHistogramModule::averager()
-        AbstractAverageHistogram *averager();
+        AbstractAverageHistogram &averager();
 
         //! \copydoc AnalysisDataSimpleHistogramModule::settings()
         const AnalysisHistogramSettings &settings() const;
@@ -464,6 +470,16 @@ class AnalysisDataBinAverageModule : public AbstractAnalysisArrayData,
         // Copy and assign disallowed by base.
 };
 
+//! Smart pointer to manage an AnalysisDataSimpleHistogramModule object.
+typedef boost::shared_ptr<AnalysisDataSimpleHistogramModule>
+        AnalysisDataSimpleHistogramModulePointer;
+//! Smart pointer to manage an AnalysisDataWeightedHistogramModule object.
+typedef boost::shared_ptr<AnalysisDataWeightedHistogramModule>
+        AnalysisDataWeightedHistogramModulePointer;
+//! Smart pointer to manage an AnalysisDataBinAverageModule object.
+typedef boost::shared_ptr<AnalysisDataBinAverageModule>
+        AnalysisDataBinAverageModulePointer;
+
 } // namespace gmx
 
 #endif
index 0f9325d44b827fedcd55be8c1370ca1667c17008..ab537be1823735d44b93d5e8294040342549df44 100644 (file)
@@ -137,18 +137,31 @@ AbstractPlotModule::Impl::closeFile()
 /********************************************************************
  * AbstractPlotModule
  */
+/*! \cond libapi */
+AbstractPlotModule::AbstractPlotModule()
+    : _impl(new Impl(AnalysisDataPlotSettings()))
+{
+}
+
 
 AbstractPlotModule::AbstractPlotModule(const AnalysisDataPlotSettings &settings)
     : _impl(new Impl(settings))
 {
 }
-
+//! \endcond
 
 AbstractPlotModule::~AbstractPlotModule()
 {
 }
 
 
+void
+AbstractPlotModule::setSettings(const AnalysisDataPlotSettings &settings)
+{
+    _impl->settings = settings;
+}
+
+
 void
 AbstractPlotModule::setFileName(const std::string &fnm)
 {
@@ -334,7 +347,7 @@ AbstractPlotModule::dataFinished()
     _impl->closeFile();
 }
 
-
+/*! \cond libapi */
 bool
 AbstractPlotModule::isFileOpen() const
 {
@@ -348,12 +361,16 @@ AbstractPlotModule::writeValue(real value) const
     GMX_ASSERT(isFileOpen(), "File not opened, but write attempted");
     std::fprintf(_impl->fp, _impl->yfmt, value);
 }
-
+//! \endcond
 
 /********************************************************************
  * DataPlotModule
  */
 
+AnalysisDataPlotModule::AnalysisDataPlotModule()
+{
+}
+
 AnalysisDataPlotModule::AnalysisDataPlotModule(
         const AnalysisDataPlotSettings &settings)
     : AbstractPlotModule(settings)
@@ -379,6 +396,16 @@ AnalysisDataPlotModule::pointsAdded(const AnalysisDataPointSetRef &points)
  * DataVectorPlotModule
  */
 
+AnalysisDataVectorPlotModule::AnalysisDataVectorPlotModule()
+{
+    for (int i = 0; i < DIM; ++i)
+    {
+        _bWrite[i] = true;
+    }
+    _bWrite[DIM] = false;
+}
+
+
 AnalysisDataVectorPlotModule::AnalysisDataVectorPlotModule(
         const AnalysisDataPlotSettings &settings)
     : AbstractPlotModule(settings)
index 632e9a81d6abeaf623abe5a5b91ded961fd65830..235dfc0daed224aa3532ded2a59246f2f73a4007 100644 (file)
@@ -41,6 +41,8 @@
 
 #include <string>
 
+#include <boost/shared_ptr.hpp>
+
 #include "../datamodule.h"
 #include "../../options/timeunitmanager.h"
 #include "../../utility/common.h"
@@ -135,6 +137,10 @@ class AbstractPlotModule : public AnalysisDataModuleInterface
     public:
         virtual ~AbstractPlotModule();
 
+        /*! \brief
+         * Set common settings for the plotting.
+         */
+        void setSettings(const AnalysisDataPlotSettings &settings);
         /*! \brief
          * Set the output file name.
          *
@@ -211,6 +217,8 @@ class AbstractPlotModule : public AnalysisDataModuleInterface
 
     protected:
         /*! \cond libapi */
+        AbstractPlotModule();
+        //! Creates AbstractPlotModule and assign common settings for the plotting
         explicit AbstractPlotModule(const AnalysisDataPlotSettings &settings);
 
         bool isFileOpen() const;
@@ -235,6 +243,8 @@ class AbstractPlotModule : public AnalysisDataModuleInterface
 class AnalysisDataPlotModule : public AbstractPlotModule
 {
     public:
+        AnalysisDataPlotModule();
+        //! Creates AnalysisDataPlotModule and assign common settings for the plotting
         explicit AnalysisDataPlotModule(const AnalysisDataPlotSettings &settings);
 
         virtual void pointsAdded(const AnalysisDataPointSetRef &points);
@@ -254,6 +264,8 @@ class AnalysisDataPlotModule : public AbstractPlotModule
 class AnalysisDataVectorPlotModule : public AbstractPlotModule
 {
     public:
+        AnalysisDataVectorPlotModule();
+        //! Creates AnalysisDataVectorPlotModule and assign common settings for the plotting
         explicit AnalysisDataVectorPlotModule(const AnalysisDataPlotSettings &settings);
 
         /*! \brief
@@ -285,6 +297,13 @@ class AnalysisDataVectorPlotModule : public AbstractPlotModule
         // Copy and assign disallowed by base.
 };
 
+//! Smart pointer to manage an AnalysisDataPlotModule object.
+typedef boost::shared_ptr<AnalysisDataPlotModule>
+        AnalysisDataPlotModulePointer;
+//! Smart pointer to manage an AnalysisDataVectorPlotModule object.
+typedef boost::shared_ptr<AnalysisDataVectorPlotModule>
+        AnalysisDataVectorPlotModulePointer;
+
 } // namespace gmx
 
 #endif
index b4b1b4e339a6f31f2093f5a147622542691d50b8..15437c8da3bc205cf67f8579d93b9e78091fff9c 100644 (file)
@@ -41,8 +41,6 @@
  * \author Teemu Murtola <teemu.murtola@cbr.su.se>
  * \ingroup module_analysisdata
  */
-#include <memory>
-
 #include <gmock/gmock.h>
 #include <gtest/gtest.h>
 
@@ -54,6 +52,7 @@
 #include "mock_module.h"
 
 using gmx::test::MockAnalysisModule;
+using gmx::test::MockAnalysisModulePointer;
 
 namespace
 {
@@ -94,11 +93,12 @@ TEST(AnalysisDataInitializationTest, ChecksMultiColumnModules)
     gmx::AnalysisData data;
     data.setColumns(2);
 
-    std::auto_ptr<MockAnalysisModule> mod(new MockAnalysisModule(0));
-    EXPECT_THROW(data.addModule(mod.release()), gmx::APIError);
+    MockAnalysisModulePointer mod1(new MockAnalysisModule(0));
+    EXPECT_THROW(data.addModule(mod1), gmx::APIError);
 
-    mod.reset(new MockAnalysisModule(gmx::AnalysisDataModuleInterface::efAllowMulticolumn));
-    EXPECT_NO_THROW(data.addModule(mod.release()));
+    MockAnalysisModulePointer mod2(
+            new MockAnalysisModule(gmx::AnalysisDataModuleInterface::efAllowMulticolumn));
+    EXPECT_NO_THROW(data.addModule(mod2));
 }
 
 /*
@@ -110,11 +110,12 @@ TEST(AnalysisDataInitializationTest, ChecksMultiPointModules)
     gmx::AnalysisData data;
     data.setColumns(1, true);
 
-    std::auto_ptr<MockAnalysisModule> mod(new MockAnalysisModule(0));
-    EXPECT_THROW(data.addModule(mod.release()), gmx::APIError);
+    MockAnalysisModulePointer mod1(new MockAnalysisModule(0));
+    EXPECT_THROW(data.addModule(mod1), gmx::APIError);
 
-    mod.reset(new MockAnalysisModule(gmx::AnalysisDataModuleInterface::efAllowMultipoint));
-    EXPECT_NO_THROW(data.addModule(mod.release()));
+    MockAnalysisModulePointer mod2(
+            new MockAnalysisModule(gmx::AnalysisDataModuleInterface::efAllowMultipoint));
+    EXPECT_NO_THROW(data.addModule(mod2));
 }
 
 
index 4bd3bc13e4e19fd8d3ea69cb72baa2f6bb80157a..61a41c30b754fb76247e0c88a4e61e7b99c45936 100644 (file)
@@ -72,13 +72,13 @@ TEST_F(AverageModuleTest, BasicTest)
     gmx::test::AnalysisDataTestInput input(inputdata);
     gmx::AnalysisData data;
     data.setColumns(input.columnCount());
-    gmx::AnalysisDataAverageModule *module =
-        new gmx::AnalysisDataAverageModule();
+    gmx::AnalysisDataAverageModulePointer module(
+            new gmx::AnalysisDataAverageModule);
     data.addModule(module);
 
     ASSERT_NO_THROW(addStaticCheckerModule(input, &data));
     ASSERT_NO_THROW(addReferenceCheckerModule("InputData", &data));
-    ASSERT_NO_THROW(addReferenceCheckerModule("Average", module));
+    ASSERT_NO_THROW(addReferenceCheckerModule("Average", module.get()));
     ASSERT_NO_THROW(presentAllData(input, &data));
 }
 
@@ -87,14 +87,13 @@ TEST_F(AverageModuleTest, CanCustomizeXAxis)
     gmx::test::AnalysisDataTestInput input(inputdata);
     gmx::AnalysisData data;
     data.setColumns(input.columnCount());
-    gmx::AnalysisDataAverageModule *module =
-        new gmx::AnalysisDataAverageModule();
+    gmx::AnalysisDataAverageModulePointer module(new gmx::AnalysisDataAverageModule());
     data.addModule(module);
     module->setXAxis(0.5, 0.5);
 
     ASSERT_NO_THROW(addStaticCheckerModule(input, &data));
     ASSERT_NO_THROW(addReferenceCheckerModule("InputData", &data));
-    ASSERT_NO_THROW(addReferenceCheckerModule("Average", module));
+    ASSERT_NO_THROW(addReferenceCheckerModule("Average", module.get()));
     ASSERT_NO_THROW(presentAllData(input, &data));
 }
 
index 02b454db59ed9af50a2de765f3143ec8e7608d80..7f4c44461c9dd80518a1d5b73812e72e96debcc4 100644 (file)
@@ -37,8 +37,6 @@
  */
 #include "datatest.h"
 
-#include <memory>
-
 #include <gmock/gmock.h>
 #include <gtest/gtest.h>
 
@@ -186,9 +184,9 @@ void
 AnalysisDataTestFixture::addStaticCheckerModule(const AnalysisDataTestInput &data,
                                                 AbstractAnalysisData *source)
 {
-    std::auto_ptr<MockAnalysisModule> module(new MockAnalysisModule(0));
+    MockAnalysisModulePointer module(new MockAnalysisModule(0));
     module->setupStaticCheck(data, source);
-    source->addModule(module.release());
+    source->addModule(module);
 }
 
 
@@ -197,9 +195,9 @@ AnalysisDataTestFixture::addStaticColumnCheckerModule(const AnalysisDataTestInpu
                                                       int firstcol, int n,
                                                       AbstractAnalysisData *source)
 {
-    std::auto_ptr<MockAnalysisModule> module(new MockAnalysisModule(0));
+    MockAnalysisModulePointer module(new MockAnalysisModule(0));
     module->setupStaticColumnCheck(data, firstcol, n, source);
-    source->addColumnModule(firstcol, n, module.release());
+    source->addColumnModule(firstcol, n, module);
 }
 
 
@@ -208,9 +206,9 @@ AnalysisDataTestFixture::addStaticStorageCheckerModule(const AnalysisDataTestInp
                                                        int storageCount,
                                                        AbstractAnalysisData *source)
 {
-    std::auto_ptr<MockAnalysisModule> module(new MockAnalysisModule(0));
+    MockAnalysisModulePointer module(new MockAnalysisModule(0));
     module->setupStaticStorageCheck(data, storageCount, source);
-    source->addModule(module.release());
+    source->addModule(module);
 }
 
 
@@ -218,9 +216,9 @@ void
 AnalysisDataTestFixture::addReferenceCheckerModule(const TestReferenceChecker &checker,
                                                    AbstractAnalysisData *source)
 {
-    std::auto_ptr<MockAnalysisModule> module(new MockAnalysisModule(0));
+    MockAnalysisModulePointer module(new MockAnalysisModule(0));
     module->setupReferenceCheck(checker, source);
-    source->addModule(module.release());
+    source->addModule(module);
 }
 
 
index be12dd55b88564c74889722e5b85db6bdebac1cb..3ca4f3f528390a32e1181b2442b49265d33e5768 100644 (file)
@@ -42,8 +42,6 @@
  * \author Teemu Murtola <teemu.murtola@cbr.su.se>
  * \ingroup module_analysisdata
  */
-#include <memory>
-
 #include <gtest/gtest.h>
 
 #include "gromacs/analysisdata/analysisdata.h"
@@ -161,18 +159,18 @@ TEST_F(SimpleHistogramModuleTest, ComputesCorrectly)
     gmx::test::AnalysisDataTestInput input(simpleinputdata);
     gmx::AnalysisData data;
     data.setColumns(input.columnCount(), true);
-    gmx::AnalysisDataSimpleHistogramModule *module =
+    gmx::AnalysisDataSimpleHistogramModulePointer module(
         new gmx::AnalysisDataSimpleHistogramModule(
-                gmx::histogramFromRange(1.0, 3.0).binCount(4));
+                gmx::histogramFromRange(1.0, 3.0).binCount(4)));
     data.addModule(module);
 
     ASSERT_NO_THROW(addStaticCheckerModule(input, &data));
     ASSERT_NO_THROW(addReferenceCheckerModule("InputData", &data));
-    ASSERT_NO_THROW(addReferenceCheckerModule("Histogram", module));
+    ASSERT_NO_THROW(addReferenceCheckerModule("Histogram", module.get()));
     ASSERT_NO_THROW(addReferenceCheckerModule("HistogramAverage",
-                                              module->averager()));
+                                              &module->averager()));
     ASSERT_NO_THROW(presentAllData(input, &data));
-    ASSERT_NO_THROW(module->averager()->done());
+    ASSERT_NO_THROW(module->averager().done());
 }
 
 
@@ -181,18 +179,18 @@ TEST_F(SimpleHistogramModuleTest, ComputesCorrectlyWithAll)
     gmx::test::AnalysisDataTestInput input(simpleinputdata);
     gmx::AnalysisData data;
     data.setColumns(input.columnCount(), true);
-    gmx::AnalysisDataSimpleHistogramModule *module =
-        new gmx::AnalysisDataSimpleHistogramModule(
-                gmx::histogramFromRange(1.0, 3.0).binCount(4).includeAll());
+    gmx::AnalysisDataSimpleHistogramModulePointer module(
+            new gmx::AnalysisDataSimpleHistogramModule(
+                    gmx::histogramFromRange(1.0, 3.0).binCount(4).includeAll()));
     data.addModule(module);
 
     ASSERT_NO_THROW(addStaticCheckerModule(input, &data));
     ASSERT_NO_THROW(addReferenceCheckerModule("InputData", &data));
-    ASSERT_NO_THROW(addReferenceCheckerModule("Histogram", module));
+    ASSERT_NO_THROW(addReferenceCheckerModule("Histogram", module.get()));
     ASSERT_NO_THROW(addReferenceCheckerModule("HistogramAverage",
-                                              module->averager()));
+                                              &module->averager()));
     ASSERT_NO_THROW(presentAllData(input, &data));
-    ASSERT_NO_THROW(module->averager()->done());
+    ASSERT_NO_THROW(module->averager().done());
 }
 
 
@@ -215,18 +213,18 @@ TEST_F(WeightedHistogramModuleTest, ComputesCorrectly)
     gmx::test::AnalysisDataTestInput input(weightedinputdata);
     gmx::AnalysisData data;
     data.setColumns(input.columnCount(), true);
-    gmx::AnalysisDataWeightedHistogramModule *module =
+    gmx::AnalysisDataWeightedHistogramModulePointer module(
         new gmx::AnalysisDataWeightedHistogramModule(
-                gmx::histogramFromRange(1.0, 3.0).binCount(4));
+                gmx::histogramFromRange(1.0, 3.0).binCount(4)));
     data.addModule(module);
 
     ASSERT_NO_THROW(addStaticCheckerModule(input, &data));
     ASSERT_NO_THROW(addReferenceCheckerModule("InputData", &data));
-    ASSERT_NO_THROW(addReferenceCheckerModule("Histogram", module));
+    ASSERT_NO_THROW(addReferenceCheckerModule("Histogram", module.get()));
     ASSERT_NO_THROW(addReferenceCheckerModule("HistogramAverage",
-                                              module->averager()));
+                                              &module->averager()));
     ASSERT_NO_THROW(presentAllData(input, &data));
-    ASSERT_NO_THROW(module->averager()->done());
+    ASSERT_NO_THROW(module->averager().done());
 }
 
 
@@ -235,18 +233,18 @@ TEST_F(WeightedHistogramModuleTest, ComputesCorrectlyWithAll)
     gmx::test::AnalysisDataTestInput input(weightedinputdata);
     gmx::AnalysisData data;
     data.setColumns(input.columnCount(), true);
-    gmx::AnalysisDataWeightedHistogramModule *module =
-        new gmx::AnalysisDataWeightedHistogramModule(
-                gmx::histogramFromRange(1.0, 3.0).binCount(4).includeAll());
+    gmx::AnalysisDataWeightedHistogramModulePointer module(
+            new gmx::AnalysisDataWeightedHistogramModule(
+                    gmx::histogramFromRange(1.0, 3.0).binCount(4).includeAll()));
     data.addModule(module);
 
     ASSERT_NO_THROW(addStaticCheckerModule(input, &data));
     ASSERT_NO_THROW(addReferenceCheckerModule("InputData", &data));
-    ASSERT_NO_THROW(addReferenceCheckerModule("Histogram", module));
+    ASSERT_NO_THROW(addReferenceCheckerModule("Histogram", module.get()));
     ASSERT_NO_THROW(addReferenceCheckerModule("HistogramAverage",
-                                              module->averager()));
+                                              &module->averager()));
     ASSERT_NO_THROW(presentAllData(input, &data));
-    ASSERT_NO_THROW(module->averager()->done());
+    ASSERT_NO_THROW(module->averager().done());
 }
 
 
@@ -261,14 +259,14 @@ TEST_F(BinAverageModuleTest, ComputesCorrectly)
     gmx::test::AnalysisDataTestInput input(weightedinputdata);
     gmx::AnalysisData data;
     data.setColumns(input.columnCount(), true);
-    gmx::AnalysisDataBinAverageModule *module =
+    gmx::AnalysisDataBinAverageModulePointer module(
         new gmx::AnalysisDataBinAverageModule(
-                gmx::histogramFromRange(1.0, 3.0).binCount(4));
+                gmx::histogramFromRange(1.0, 3.0).binCount(4)));
     data.addModule(module);
 
     ASSERT_NO_THROW(addStaticCheckerModule(input, &data));
     ASSERT_NO_THROW(addReferenceCheckerModule("InputData", &data));
-    ASSERT_NO_THROW(addReferenceCheckerModule("HistogramAverage", module));
+    ASSERT_NO_THROW(addReferenceCheckerModule("HistogramAverage", module.get()));
     ASSERT_NO_THROW(presentAllData(input, &data));
 }
 
@@ -278,14 +276,14 @@ TEST_F(BinAverageModuleTest, ComputesCorrectlyWithAll)
     gmx::test::AnalysisDataTestInput input(weightedinputdata);
     gmx::AnalysisData data;
     data.setColumns(input.columnCount(), true);
-    gmx::AnalysisDataBinAverageModule *module =
-        new gmx::AnalysisDataBinAverageModule(
-                gmx::histogramFromRange(1.0, 3.0).binCount(4).includeAll());
+    gmx::AnalysisDataBinAverageModulePointer module(
+            new gmx::AnalysisDataBinAverageModule(
+                    gmx::histogramFromRange(1.0, 3.0).binCount(4).includeAll()));
     data.addModule(module);
 
     ASSERT_NO_THROW(addStaticCheckerModule(input, &data));
     ASSERT_NO_THROW(addReferenceCheckerModule("InputData", &data));
-    ASSERT_NO_THROW(addReferenceCheckerModule("HistogramAverage", module));
+    ASSERT_NO_THROW(addReferenceCheckerModule("HistogramAverage", module.get()));
     ASSERT_NO_THROW(presentAllData(input, &data));
 }
 
@@ -342,11 +340,11 @@ TEST_F(AbstractAverageHistogramTest, ClonesCorrectly)
     setupArrayData(input, &data);
 
     ASSERT_NO_THROW(addStaticCheckerModule(input, &data));
-    std::auto_ptr<gmx::AbstractAverageHistogram> copy(data.clone());
+    gmx::AverageHistogramPointer copy(data.clone());
     ASSERT_NO_THROW(addStaticCheckerModule(input, copy.get()));
     ASSERT_NO_THROW(copy->done());
     ASSERT_NO_THROW(data.done());
-    std::auto_ptr<gmx::AbstractAverageHistogram> copy2(data.clone());
+    gmx::AverageHistogramPointer copy2(data.clone());
     ASSERT_NO_THROW(addStaticCheckerModule(input, copy2.get()));
     ASSERT_NO_THROW(copy2->done());
 }
@@ -361,8 +359,7 @@ TEST_F(AbstractAverageHistogramTest, ResamplesAtDoubleBinWidth)
 
     ASSERT_NO_THROW(addStaticCheckerModule(input, &data));
     ASSERT_NO_THROW(addReferenceCheckerModule("InputData", &data));
-    std::auto_ptr<gmx::AbstractAverageHistogram> resampled(
-            data.resampleDoubleBinWidth(false));
+    gmx::AverageHistogramPointer resampled(data.resampleDoubleBinWidth(false));
     ASSERT_NO_THROW(addReferenceCheckerModule("ResampledHistogram", resampled.get()));
     ASSERT_NO_THROW(data.done());
     ASSERT_NO_THROW(resampled->done());
@@ -378,8 +375,7 @@ TEST_F(AbstractAverageHistogramTest, ResamplesAtDoubleBinWidthWithIntegerBins)
 
     ASSERT_NO_THROW(addStaticCheckerModule(input, &data));
     ASSERT_NO_THROW(addReferenceCheckerModule("InputData", &data));
-    std::auto_ptr<gmx::AbstractAverageHistogram> resampled(
-            data.resampleDoubleBinWidth(true));
+    gmx::AverageHistogramPointer resampled(data.resampleDoubleBinWidth(true));
     ASSERT_NO_THROW(addReferenceCheckerModule("ResampledHistogram", resampled.get()));
     ASSERT_NO_THROW(data.done());
     ASSERT_NO_THROW(resampled->done());
index c49b132d6f81051cdf119e30ecdcc9db98f174eb..30717a893f375f5534a4f7acbb28a9cf57594855 100644 (file)
@@ -40,6 +40,7 @@
 #ifndef GMX_ANALYSISDATA_TESTS_MOCK_MODULE_H
 #define GMX_ANALYSISDATA_TESTS_MOCK_MODULE_H
 
+#include <boost/shared_ptr.hpp>
 #include <gmock/gmock.h>
 
 #include "gromacs/analysisdata/dataframe.h"
@@ -85,6 +86,9 @@ class MockAnalysisModule : public AnalysisDataModuleInterface
         PrivateImplPointer<Impl> impl_;
 };
 
+//! Smart pointer to manage an MockAnalysisModule object.
+typedef boost::shared_ptr<MockAnalysisModule> MockAnalysisModulePointer;
+
 } // namespace test
 } // namespace gmx
 
index 58aaaeeea54eebfe859b9a5026e917988b14e114..f0218711b5a1de18ba985cfa0efccf21d8ffb1ef 100644 (file)
@@ -53,6 +53,8 @@
 #include <string>
 #include <vector>
 
+#include "../utility/uniqueptr.h"
+
 #include "optionflags.h"
 
 namespace gmx
@@ -62,6 +64,10 @@ class AbstractOptionStorage;
 template <typename T> class OptionStorageTemplate;
 class Options;
 
+//! Smart pointer for managing an AbstractOptionStorage object.
+typedef gmx_unique_ptr<AbstractOptionStorage>::type
+        AbstractOptionStoragePointer;
+
 /*! \brief
  * Abstract base class for specifying option properties.
  *
@@ -107,7 +113,7 @@ class AbstractOption
          *
          * Should only be called by Options::addOption().
          */
-        virtual AbstractOptionStorage *createDefaultStorage(Options *options) const = 0;
+        virtual AbstractOptionStoragePointer createDefaultStorage(Options *options) const = 0;
 
         /*! \brief
          * Creates the description string for the option.
index 31d06dea2a260fe194e769c8e4706326da0f1e6d..5bcb5416e11d1c8a2db8d52b6a092b25dfc69a9e 100644 (file)
@@ -107,9 +107,9 @@ BooleanOptionInfo::BooleanOptionInfo(BooleanOptionStorage *option)
  * BooleanOption
  */
 
-AbstractOptionStorage *BooleanOption::createDefaultStorage(Options *options) const
+AbstractOptionStoragePointer BooleanOption::createDefaultStorage(Options *options) const
 {
-    return new BooleanOptionStorage(*this, options);
+    return AbstractOptionStoragePointer(new BooleanOptionStorage(*this, options));
 }
 
 
@@ -156,9 +156,9 @@ IntegerOptionInfo::IntegerOptionInfo(IntegerOptionStorage *option)
  * IntegerOption
  */
 
-AbstractOptionStorage *IntegerOption::createDefaultStorage(Options *options) const
+AbstractOptionStoragePointer IntegerOption::createDefaultStorage(Options *options) const
 {
-    return new IntegerOptionStorage(*this, options);
+    return AbstractOptionStoragePointer(new IntegerOptionStorage(*this, options));
 }
 
 
@@ -254,9 +254,9 @@ void DoubleOptionInfo::setScaleFactor(double factor)
  * DoubleOption
  */
 
-AbstractOptionStorage *DoubleOption::createDefaultStorage(Options *options) const
+AbstractOptionStoragePointer DoubleOption::createDefaultStorage(Options *options) const
 {
-    return new DoubleOptionStorage(*this, options);
+    return AbstractOptionStoragePointer(new DoubleOptionStorage(*this, options));
 }
 
 
@@ -387,9 +387,9 @@ StringOptionInfo::StringOptionInfo(StringOptionStorage *option)
  * StringOption
  */
 
-AbstractOptionStorage *StringOption::createDefaultStorage(Options *options) const
+AbstractOptionStoragePointer StringOption::createDefaultStorage(Options *options) const
 {
-    return new StringOptionStorage(*this, options);
+    return AbstractOptionStoragePointer(new StringOptionStorage(*this, options));
 }
 
 std::string StringOption::createDescription() const
@@ -472,9 +472,9 @@ bool FileNameOptionInfo::isLibraryFile() const
  * FileNameOption
  */
 
-AbstractOptionStorage *FileNameOption::createDefaultStorage(Options *options) const
+AbstractOptionStoragePointer FileNameOption::createDefaultStorage(Options *options) const
 {
-    return new FileNameOptionStorage(*this, options);
+    return AbstractOptionStoragePointer(new FileNameOptionStorage(*this, options));
 }
 
 } // namespace gmx
index cd620616282f9faec598193999af9ba4845bfc28..aaec5d52dc425e84cd7902bf0a8dbf05b2d4d5a7 100644 (file)
@@ -84,7 +84,7 @@ class BooleanOption : public OptionTemplate<bool, BooleanOption>
 
     private:
         //! Creates a BooleanOptionStorage object.
-        virtual AbstractOptionStorage *createDefaultStorage(Options *options) const;
+        virtual AbstractOptionStoragePointer createDefaultStorage(Options *options) const;
 };
 
 /*! \brief
@@ -123,7 +123,7 @@ class IntegerOption : public OptionTemplate<int, IntegerOption>
 
     private:
         //! Creates an IntegerOptionStorage object.
-        virtual AbstractOptionStorage *createDefaultStorage(Options *options) const;
+        virtual AbstractOptionStoragePointer createDefaultStorage(Options *options) const;
 
         /*! \brief
          * Needed to initialize IntegerOptionStorage from this class without
@@ -165,7 +165,7 @@ class DoubleOption : public OptionTemplate<double, DoubleOption>
 
     private:
         //! Creates a DoubleOptionStorage object.
-        virtual AbstractOptionStorage *createDefaultStorage(Options *options) const;
+        virtual AbstractOptionStoragePointer createDefaultStorage(Options *options) const;
 
         bool _bTime;
 
@@ -252,7 +252,7 @@ class StringOption : public OptionTemplate<std::string, StringOption>
 
     private:
         //! Creates a StringOptionStorage object.
-        virtual AbstractOptionStorage *createDefaultStorage(Options *options) const;
+        virtual AbstractOptionStoragePointer createDefaultStorage(Options *options) const;
         virtual std::string createDescription() const;
 
         const char *const      *_enumValues;
@@ -312,7 +312,7 @@ class FileNameOption : public OptionTemplate<std::string, FileNameOption>
 
     private:
         //! Creates a FileNameOptionStorage object.
-        virtual AbstractOptionStorage *createDefaultStorage(Options *options) const;
+        virtual AbstractOptionStoragePointer createDefaultStorage(Options *options) const;
 
         OptionFileType          filetype_;
         bool                    bRead_;
index 74ba36f4df43d0677141e6b17fab1f44c2c740fd..15e6d925e0d6f24eb5da19929fd599050bf4728a 100644 (file)
@@ -41,8 +41,7 @@
 #include <string>
 #include <vector>
 
-#include "gromacs/utility/uniqueptr.h"
-
+#include "abstractoption.h"
 #include "options.h"
 
 namespace gmx
@@ -61,12 +60,10 @@ class AbstractOptionStorage;
 class Options::Impl
 {
     public:
-        //! Shorthand for a smart pointer to an option storage object.
-        typedef gmx_unique_ptr<AbstractOptionStorage>::type OptionPointer;
         //! Convenience type for list of sections.
         typedef std::vector<Options *> SubSectionList;
         //! Convenience type for list of options.
-        typedef std::vector<OptionPointer> OptionList;
+        typedef std::vector<AbstractOptionStoragePointer> OptionList;
 
         //! Sets the name and title.
         Impl(const char *name, const char *title);
index 5ccd54f841b50ec5eca0de018aedc7c8d85f9fb0..d4204d06f065b7e6ddeedd8ff036775f1994dc55 100644 (file)
@@ -175,7 +175,7 @@ void Options::addSubSection(Options *section)
 
 void Options::addOption(const AbstractOption &settings)
 {
-    Impl::OptionPointer option(settings.createDefaultStorage(this));
+    AbstractOptionStoragePointer option(settings.createDefaultStorage(this));
     if (_impl->findOption(option->name().c_str()) != NULL)
     {
         GMX_THROW(APIError("Duplicate option: " + option->name()));
index a2c7d973bbb92e91b349cd57d66bc83c07470483..71797a7777b15ecf1d8d5443805205f4c667fdb3 100644 (file)
@@ -133,14 +133,14 @@ class MockOption : public gmx::OptionTemplate<std::string, MockOption>
         { _storagePtr = storagePtr; return me(); }
 
     private:
-        virtual gmx::AbstractOptionStorage *createDefaultStorage(gmx::Options *options) const
+        virtual gmx::AbstractOptionStoragePointer createDefaultStorage(gmx::Options *options) const
         {
             MockOptionStorage *storage = new MockOptionStorage(*this, options);
             if (_storagePtr != NULL)
             {
                 *_storagePtr = storage;
             }
-            return storage;
+            return gmx::AbstractOptionStoragePointer(storage);
         }
 
         MockOptionStorage     **_storagePtr;
index c107e640b14011a86e910c76407b052b90671551..e18e3971693f39d19cb31742cba33176bb123d56 100644 (file)
@@ -250,9 +250,9 @@ void SelectionOptionInfo::setDynamicOnlyWhole(bool bEnabled)
  * SelectionOption
  */
 
-AbstractOptionStorage *SelectionOption::createDefaultStorage(Options *options) const
+AbstractOptionStoragePointer SelectionOption::createDefaultStorage(Options *options) const
 {
-    return new SelectionOptionStorage(*this, options);
+    return AbstractOptionStoragePointer(new SelectionOptionStorage(*this, options));
 }
 
 
index b19a2abda385b3cc8e73261ca6980456b4f2c441..84d2e573ad7cd59364d0b0c4e258649a8842e232 100644 (file)
@@ -115,7 +115,7 @@ class SelectionOption : public OptionTemplate<Selection *, SelectionOption>
         using MyBase::defaultValue;
         using MyBase::defaultValueIfSet;
 
-        virtual AbstractOptionStorage *createDefaultStorage(Options *options) const;
+        virtual AbstractOptionStoragePointer createDefaultStorage(Options *options) const;
 
         SelectionFlags          _selectionFlags;
         SelectionOptionInfo   **_infoPtr;
index 3c2f3532ba11201c1b1f3a51a444423f4b0a5e5a..48d042813d199885baca2686840bcd085f7ef8d9 100644 (file)
@@ -182,11 +182,12 @@ void TrajectoryAnalysisModule::initAfterFirstFrame(const t_trxframe &/*fr*/)
 }
 
 
-TrajectoryAnalysisModuleData *
+TrajectoryAnalysisModuleDataPointer
 TrajectoryAnalysisModule::startFrames(const AnalysisDataParallelOptions &opt,
                                       const SelectionCollection &selections)
 {
-    return new TrajectoryAnalysisModuleDataBasic(this, opt, selections);
+    return TrajectoryAnalysisModuleDataPointer(
+            new TrajectoryAnalysisModuleDataBasic(this, opt, selections));
 }
 
 
index c34bff24893496efffb92a74334de3907b340aef..37ce5dfc5ecb90bd48b2aab93f4ab14a5bb76aac 100644 (file)
@@ -46,6 +46,7 @@
 #include "../legacyheaders/typedefs.h"
 
 #include "../utility/common.h"
+#include "../utility/uniqueptr.h"
 
 namespace gmx
 {
@@ -134,6 +135,9 @@ class TrajectoryAnalysisModuleData
         PrivateImplPointer<Impl> _impl;
 };
 
+//! Smart pointer to manage a TrajectoryAnalysisModuleData object.
+typedef gmx_unique_ptr<TrajectoryAnalysisModuleData>::type
+        TrajectoryAnalysisModuleDataPointer;
 
 /*! \brief
  * Base class for trajectory analysis methods.
@@ -226,7 +230,7 @@ class TrajectoryAnalysisModule
          *
          * \see TrajectoryAnalysisModuleData
          */
-        virtual TrajectoryAnalysisModuleData *startFrames(
+        virtual TrajectoryAnalysisModuleDataPointer startFrames(
                 const AnalysisDataParallelOptions &opt,
                 const SelectionCollection &selections);
         /*! \brief
@@ -350,6 +354,10 @@ class TrajectoryAnalysisModule
         friend class TrajectoryAnalysisModuleData;
 };
 
+//! Smart pointer to manage a TrajectoryAnalysisModule.
+typedef gmx_unique_ptr<TrajectoryAnalysisModule>::type
+        TrajectoryAnalysisModulePointer;
+
 } // namespace gmx
 
 #endif
index 2b86bcba068128778b09c1114ea8aa711bc5e507..e68bac37f2cbb0ce2a52208ece14451e54915fd9 100644 (file)
@@ -39,8 +39,6 @@
 #include <config.h>
 #endif
 
-#include <memory>
-
 #include <copyrite.h>
 #include <pbc.h>
 #include <rmpbc.h>
@@ -234,8 +232,8 @@ TrajectoryAnalysisCommandLineRunner::run(int argc, char *argv[])
 
     int nframes = 0;
     AnalysisDataParallelOptions dataOptions;
-    std::auto_ptr<TrajectoryAnalysisModuleData>
-        pdata(module->startFrames(dataOptions, selections));
+    TrajectoryAnalysisModuleDataPointer pdata(
+            module->startFrames(dataOptions, selections));
     do
     {
         common.initFrame();
index 1c53aca444b8183b8f41640088d3bc7c0ba59241..075e3e976ff67f70122b7e307d724de85472fc20 100644 (file)
@@ -39,6 +39,9 @@
 
 #include <string2.h>
 
+#include "gromacs/fatalerror/exceptions.h"
+#include "gromacs/utility/format.h"
+
 #include "modules/angle.h"
 #include "modules/distance.h"
 #include "modules/select.h"
@@ -50,8 +53,8 @@ using namespace gmx::analysismodules;
 
 struct module_map_t
 {
-    const char                         *name;
-    gmx::TrajectoryAnalysisModule      *(*creator)(void);
+    const char                            *name;
+    gmx::TrajectoryAnalysisModulePointer (*creator)(void);
 };
 
 const module_map_t modules[] =
@@ -67,7 +70,8 @@ const module_map_t modules[] =
 namespace gmx
 {
 
-TrajectoryAnalysisModule *createTrajectoryAnalysisModule(const char *name)
+TrajectoryAnalysisModulePointer
+createTrajectoryAnalysisModule(const char *name)
 {
     size_t len = strlen(name);
     int match_i = -1;
@@ -87,7 +91,8 @@ TrajectoryAnalysisModule *createTrajectoryAnalysisModule(const char *name)
             }
             else
             {
-                return NULL;
+                GMX_THROW(InvalidInputError(
+                            gmx::formatString("Requested analysis module '%s' is ambiguous", name)));
             }
         }
     }
@@ -95,7 +100,8 @@ TrajectoryAnalysisModule *createTrajectoryAnalysisModule(const char *name)
     {
         return modules[match_i].creator();
     }
-    return NULL;
+    GMX_THROW(InvalidInputError(
+                gmx::formatString("Unknown analysis module: %s", name)));
 }
 
 } // namespace gmx
index 0ee6c8f0bcd7ac5ec958e74ae2f67dbc504b027f..170a73db92a03af6ca6260e0ed36afd6045d89c8 100644 (file)
 #ifndef GMX_TRAJECTORYANALYSIS_MODULES_H
 #define GMX_TRAJECTORYANALYSIS_MODULES_H
 
+#include "analysismodule.h"
+
 namespace gmx
 {
 
-class TrajectoryAnalysisModule;
-
 /*! \brief
  * Creates a TrajectoryAnalysisModule object corresponding to a name.
  *
  * \param[in]  name  Name of the module to create (recognized names are
  *      defined in modules.h).
- * \returns  An allocated TrajectoryAnalysisModule object, or NULL if \p name
- *      is not valid.
+ * \returns  An allocated TrajectoryAnalysisModule object.
+ * \throws   InvalidInputError if \p name is not recognized.
  *
  * This function should be used to instantiate selection methods defined in the
  * library.
@@ -61,7 +61,8 @@ class TrajectoryAnalysisModule;
  *
  * \inpublicapi
  */
-TrajectoryAnalysisModule *createTrajectoryAnalysisModule(const char *name);
+TrajectoryAnalysisModulePointer
+createTrajectoryAnalysisModule(const char *name);
 
 namespace analysismodules
 {
index 09c8c26268f67449451680bca00f5fe95ce16c70..fc3d016d5f1f40c8e60b9c44e381a9d75d82655e 100644 (file)
@@ -357,8 +357,8 @@ Angle::initAnalysis(const TrajectoryAnalysisSettings &settings,
 
     registerAnalysisDataset(&_data, "angle");
 
-    AnalysisDataPlotModule *plotm
-        = new AnalysisDataPlotModule(settings.plotSettings());
+    AnalysisDataPlotModulePointer plotm(
+        new AnalysisDataPlotModule(settings.plotSettings()));
     plotm->setFileName(_fnAngle);
     plotm->setTitle("Angle");
     plotm->setXAxisIsTime();
@@ -590,10 +590,10 @@ Angle::writeOutput()
 }
 
 
-TrajectoryAnalysisModule *
+TrajectoryAnalysisModulePointer
 Angle::create()
 {
-    return new Angle();
+    return TrajectoryAnalysisModulePointer(new Angle());
 }
 
 } // namespace modules
index 30835c0ca2559e9d300a10952d2549209cadfe28..12901f33ae4b21a250cac26652f127423a9d8b03 100644 (file)
@@ -60,7 +60,7 @@ class Angle : public TrajectoryAnalysisModule
         Angle();
         virtual ~Angle();
 
-        static TrajectoryAnalysisModule *create();
+        static TrajectoryAnalysisModulePointer create();
 
         virtual Options &initOptions(TrajectoryAnalysisSettings *settings);
         virtual void initOptionsDone(TrajectoryAnalysisSettings *settings);
index 7c1cc94ca0a4796ae0d4fe89fb2989df833e38dc..f16b6637402fe4c6d755fef416ee3baa9863559a 100644 (file)
@@ -45,7 +45,6 @@
 #include <vec.h>
 
 #include "gromacs/analysisdata/analysisdata.h"
-#include "gromacs/analysisdata/modules/average.h"
 #include "gromacs/analysisdata/modules/plot.h"
 #include "gromacs/fatalerror/exceptions.h"
 #include "gromacs/options/basicoptions.h"
@@ -61,7 +60,7 @@ namespace analysismodules
 {
 
 Distance::Distance()
-    : _options("distance", "Distance calculation")
+    : _options("distance", "Distance calculation"), _avem(new AnalysisDataAverageModule())
 {
     _sel[0] = _sel[1] = NULL;
 }
@@ -107,10 +106,9 @@ Distance::initAnalysis(const TrajectoryAnalysisSettings &settings,
     _data.setColumns(4);
     registerAnalysisDataset(&_data, "distance");
 
-    _avem = new AnalysisDataAverageModule();
     _data.addModule(_avem);
-
-    _plotm = new AnalysisDataPlotModule(settings.plotSettings());
+    AnalysisDataPlotModulePointer _plotm(new AnalysisDataPlotModule());
+    _plotm->setSettings(settings.plotSettings());
     _plotm->setFileName(_fnDist);
     _plotm->setTitle("Distance");
     _plotm->setXAxisIsTime();
@@ -161,10 +159,10 @@ Distance::writeOutput()
 }
 
 
-TrajectoryAnalysisModule *
+TrajectoryAnalysisModulePointer
 Distance::create()
 {
-    return new Distance();
+    return TrajectoryAnalysisModulePointer(new Distance());
 }
 
 } // namespace analysismodules
index 35be8ed6cf7b3ecfcc34bddcf179754b358c27ad..081fdb50b1b5a6ea9fb111e4322fdc188c2b7b49 100644 (file)
 
 #include "../analysismodule.h"
 #include "gromacs/analysisdata/analysisdata.h"
+#include "gromacs/analysisdata/modules/average.h"
 #include "gromacs/options/options.h"
 
 namespace gmx
 {
 
-class AnalysisDataAverageModule;
-class AnalysisDataPlotModule;
 class Selection;
 
 namespace analysismodules
@@ -61,7 +60,7 @@ class Distance : public TrajectoryAnalysisModule
         Distance();
         virtual ~Distance();
 
-        static TrajectoryAnalysisModule *create();
+        static TrajectoryAnalysisModulePointer create();
 
         virtual Options &initOptions(TrajectoryAnalysisSettings *settings);
         virtual void initAnalysis(const TrajectoryAnalysisSettings &settings,
@@ -74,12 +73,11 @@ class Distance : public TrajectoryAnalysisModule
         virtual void writeOutput();
 
     private:
-        Options                         _options;
-        std::string                     _fnDist;
-        Selection                      *_sel[2];
-        AnalysisData                    _data;
-        AnalysisDataAverageModule      *_avem;
-        AnalysisDataPlotModule         *_plotm;
+        Options                          _options;
+        std::string                      _fnDist;
+        Selection                       *_sel[2];
+        AnalysisData                     _data;
+        AnalysisDataAverageModulePointer _avem;
 
         // Copy and assign disallowed by base.
 };
index 5ba48861abdaa64ad865f16ccea13ee8b5550ff9..f76582c5fbcbe8a15a35044e264269f81768a3c8 100644 (file)
@@ -383,8 +383,8 @@ Select::initAnalysis(const TrajectoryAnalysisSettings &settings,
     }
     if (!_fnSize.empty())
     {
-        AnalysisDataPlotModule *plot
-            = new AnalysisDataPlotModule(settings.plotSettings());
+        AnalysisDataPlotModulePointer plot(
+            new AnalysisDataPlotModule(settings.plotSettings()));
         plot->setFileName(_fnSize);
         plot->setTitle("Selection size");
         plot->setXAxisIsTime();
@@ -396,8 +396,8 @@ Select::initAnalysis(const TrajectoryAnalysisSettings &settings,
     registerAnalysisDataset(&_cdata, "cfrac");
     if (!_fnFrac.empty())
     {
-        AnalysisDataPlotModule *plot
-            = new AnalysisDataPlotModule(settings.plotSettings());
+        AnalysisDataPlotModulePointer plot(
+            new AnalysisDataPlotModule(settings.plotSettings()));
         plot->setFileName(_fnFrac);
         plot->setTitle("Covered fraction");
         plot->setXAxisIsTime();
@@ -411,8 +411,8 @@ Select::initAnalysis(const TrajectoryAnalysisSettings &settings,
     registerAnalysisDataset(&_idata, "index");
     if (!_fnIndex.empty())
     {
-        AnalysisDataPlotModule *plot
-            = new AnalysisDataPlotModule(settings.plotSettings());
+        AnalysisDataPlotModulePointer plot(
+            new AnalysisDataPlotModule(settings.plotSettings()));
         plot->setFileName(_fnIndex);
         plot->setPlainOutput(true);
         plot->setYFormat(4, 0);
@@ -428,7 +428,7 @@ Select::initAnalysis(const TrajectoryAnalysisSettings &settings,
     }
     if (!_fnNdx.empty())
     {
-        IndexFileWriterModule *writer = new IndexFileWriterModule();
+        boost::shared_ptr<IndexFileWriterModule> writer(new IndexFileWriterModule());
         writer->setFileName(_fnNdx);
         for (size_t g = 0; g < _sel.size(); ++g)
         {
@@ -451,8 +451,8 @@ Select::initAnalysis(const TrajectoryAnalysisSettings &settings,
         }
         else
         {
-            AnalysisDataPlotModule *plot
-                = new AnalysisDataPlotModule(settings.plotSettings());
+            AnalysisDataPlotModulePointer plot(
+                new AnalysisDataPlotModule(settings.plotSettings()));
             plot->setFileName(_fnMask);
             plot->setPlainOutput(_bDump);
             plot->setOmitX(_bDump);
@@ -468,7 +468,7 @@ Select::initAnalysis(const TrajectoryAnalysisSettings &settings,
 }
 
 
-TrajectoryAnalysisModuleData *
+TrajectoryAnalysisModuleDataPointer
 Select::startFrames(const AnalysisDataParallelOptions &opt,
                     const SelectionCollection &selections)
 {
@@ -476,7 +476,7 @@ Select::startFrames(const AnalysisDataParallelOptions &opt,
     snew(pdata->_mmap, 1);
     gmx_ana_indexmap_init(pdata->_mmap, pdata->parallelSelection(_sel[0])->indexGroup(),
                           _top, _sel[0]->type());
-    return pdata;
+    return TrajectoryAnalysisModuleDataPointer(pdata);
 }
 
 
@@ -550,10 +550,10 @@ Select::writeOutput()
 }
 
 
-TrajectoryAnalysisModule *
+TrajectoryAnalysisModulePointer
 Select::create()
 {
-    return new Select();
+    return TrajectoryAnalysisModulePointer(new Select());
 }
 
 } // namespace analysismodules
index 2a57c32b24641c6ed7a834eee6836e1e83fae970..3f58b93cc9df7fdb90de2da723809e63543f131e 100644 (file)
@@ -60,13 +60,13 @@ class Select : public TrajectoryAnalysisModule
         Select();
         virtual ~Select();
 
-        static TrajectoryAnalysisModule *create();
+        static TrajectoryAnalysisModulePointer create();
 
         virtual Options &initOptions(TrajectoryAnalysisSettings *settings);
         virtual void initAnalysis(const TrajectoryAnalysisSettings &settings,
                                   const TopologyInformation &top);
 
-        virtual TrajectoryAnalysisModuleData *startFrames(
+        virtual TrajectoryAnalysisModuleDataPointer startFrames(
                     const AnalysisDataParallelOptions &opt,
                     const SelectionCollection &selections);
         virtual void analyzeFrame(int frnr, const t_trxframe &fr, t_pbc *pbc,
index c2227d36ce2340995f2dcfc2fad9a38daf4c35cf..140f626f5013b513228543814b4304f470cf40a1 100644 (file)
@@ -33,8 +33,6 @@
  *
  * \author Teemu Murtola <teemu.murtola@cbr.su.se>
  */
-#include <memory>
-
 #include <copyrite.h>
 
 #include "gromacs/fatalerror.h"
 int
 main(int argc, char *argv[])
 {
+    bool bPrintCopyrightOnError = true;
+
     try
     {
         if (argc < 2)
         {
-            CopyRight(stderr, argv[0]);
             GMX_THROW(gmx::InvalidInputError("Not enough command-line arguments"));
         }
 
-        std::auto_ptr<gmx::TrajectoryAnalysisModule>
+        gmx::TrajectoryAnalysisModulePointer
             mod(gmx::createTrajectoryAnalysisModule(argv[1]));
-        if (mod.get() == NULL)
-        {
-            CopyRight(stderr, argv[0]);
-            GMX_THROW(gmx::InvalidInputError(
-                      "Unknown analysis module given as the first command-line argument"));
-        }
         --argc;
         ++argv;
 
         gmx::TrajectoryAnalysisCommandLineRunner runner(mod.get());
+        bPrintCopyrightOnError = false;
         return runner.run(argc, argv);
     }
     catch (const std::exception &ex)
     {
+        if (bPrintCopyrightOnError)
+        {
+            CopyRight(stderr, argv[0]);
+        }
         fprintf(stderr, "%s", gmx::formatErrorMessage(ex).c_str());
         return 1;
     }