diff -dNur a/src/analyserwaveform.cpp b/src/analyserwaveform.cpp --- a/src/analyserwaveform.cpp 2017-02-04 21:14:33.266016824 +0100 +++ b/src/analyserwaveform.cpp 2017-02-04 21:19:09.205671982 +0100 @@ -11,8 +11,8 @@ AnalyserWaveform::AnalyserWaveform(ConfigObject* pConfig) : m_skipProcessing(false), - m_waveformData(NULL), - m_waveformSummaryData(NULL), + m_waveformData(nullptr), + m_waveformSummaryData(nullptr), m_stride(0, 0), m_currentStride(0), m_currentSummaryStride(0) { @@ -37,14 +37,13 @@ } } - m_analysisDao = new AnalysisDao(m_database, pConfig); + m_pAnalysisDao = std::make_unique(m_database, pConfig); } AnalyserWaveform::~AnalyserWaveform() { qDebug() << "AnalyserWaveform::~AnalyserWaveform()"; destroyFilters(); m_database.close(); - delete m_analysisDao; } bool AnalyserWaveform::initialise(TrackPointer tio, int sampleRate, int totalSamples) { @@ -115,7 +114,7 @@ if (trackId != -1 && (missingWaveform || missingWavesummary)) { QList analyses = - m_analysisDao->getAnalysesForTrack(trackId); + m_pAnalysisDao->getAnalysesForTrack(trackId); QListIterator it(analyses); while (it.hasNext()) { @@ -130,7 +129,7 @@ missingWaveform = false; } else if (vc != WaveformFactory::VC_KEEP) { // remove all other Analysis except that one we should keep - m_analysisDao->deleteAnalysis(analysis.analysisId); + m_pAnalysisDao->deleteAnalysis(analysis.analysisId); } } if (analysis.type == AnalysisDao::TYPE_WAVESUMMARY) { vc = WaveformFactory::waveformSummaryVersionToVersionClass(analysis.version); @@ -140,7 +139,7 @@ missingWavesummary = false; } else if (vc != WaveformFactory::VC_KEEP) { // remove all other Analysis except that one we should keep - m_analysisDao->deleteAnalysis(analysis.analysisId); + m_pAnalysisDao->deleteAnalysis(analysis.analysisId); } } } @@ -273,13 +272,13 @@ tio->setWaveform(ConstWaveformPointer()); // Since clear() could delete the waveform, clear our pointer to the // waveform's vector data first. - m_waveformData = NULL; + m_waveformData = nullptr; m_waveform.clear(); tio->setWaveformSummary(ConstWaveformPointer()); // Since clear() could delete the waveform, clear our pointer to the // waveform's vector data first. - m_waveformSummaryData = NULL; + m_waveformSummaryData = nullptr; m_waveformSummary.clear(); } @@ -295,7 +294,7 @@ m_waveform->setDescription(WaveformFactory::currentWaveformDescription()); // Since clear() could delete the waveform, clear our pointer to the // waveform's vector data first. - m_waveformData = NULL; + m_waveformData = nullptr; m_waveform.clear(); } @@ -306,7 +305,7 @@ m_waveformSummary->setDescription(WaveformFactory::currentWaveformSummaryDescription()); // Since clear() could delete the waveform, clear our pointer to the // waveform's vector data first. - m_waveformSummaryData = NULL; + m_waveformSummaryData = nullptr; m_waveformSummary.clear(); } diff -dNur a/src/analyserwaveform.h b/src/analyserwaveform.h --- a/src/analyserwaveform.h 2017-02-04 21:14:33.266016824 +0100 +++ b/src/analyserwaveform.h 2017-02-04 21:20:17.308598419 +0100 @@ -4,12 +4,14 @@ #include #include #include + #include #include "configobject.h" #include "analyser.h" #include "waveform/waveform.h" #include "util/math.h" +#include "util/memory.h" //NOTS vrince some test to segment sound, to apply color in the waveform //#define TEST_HEAT_MAP @@ -173,7 +175,7 @@ QTime m_timer; QSqlDatabase m_database; - AnalysisDao* m_analysisDao; + std::unique_ptr m_pAnalysisDao; #ifdef TEST_HEAT_MAP QImage* test_heatMap; diff -dNur a/src/util/memory.h b/src/util/memory.h --- a/src/util/memory.h 1970-01-01 01:00:00.000000000 +0100 +++ b/src/util/memory.h 2017-02-04 22:19:41.846922929 +0100 @@ -0,0 +1,149 @@ +// Taken from https://github.com/bstreiff/cppbits +// Thank you Brandon Streiff! + +// Implementation of C++14's make_unique for C++11 compilers. +// +// This has been tested with: +// - MSVC 11.0 (Visual Studio 2012) +// - gcc 4.6.3 +// - Xcode 4.4 (with clang "4.0") +// +// It is based off an implementation proposed by Stephan T. Lavavej for +// inclusion in the C++14 standard: +// http://isocpp.org/files/papers/N3656.txt +// Where appropriate, it borrows the use of MSVC's _VARIADIC_EXPAND_0X macro +// machinery to compensate for lack of variadic templates. +// +// This file injects make_unique into the std namespace, which I acknowledge is +// technically forbidden ([C++11: 17.6.4.2.2.1/1]), but is necessary in order +// to have syntax compatibility with C++14. +// +// I perform compiler version checking for MSVC, gcc, and clang to ensure that +// we don't add make_unique if it is already there (instead, we include +// to get the compiler-provided one). You can override the compiler +// version checking by defining the symbol COMPILER_SUPPORTS_MAKE_UNIQUE. +// +// +// =============================================================================== +// This file is released into the public domain. See LICENCE for more information. +// =============================================================================== + +#ifndef MIXXX_UTIL_MEMORY_H +#define MIXXX_UTIL_MEMORY_H + +// If user hasn't specified COMPILER_SUPPORTS_MAKE_UNIQUE then try to figure out +// based on compiler version if std::make_unique is provided. +#if !defined(COMPILER_SUPPORTS_MAKE_UNIQUE) + // Compiling with -std=c++11 sets __cplusplus=201103L and disables + // std::make_unique() from C++14! We need to take this into account. + #define CPLUSPLUS_SUPPORTS_MAKE_UNIQUE (__cplusplus > 201103L) + #if defined(_MSC_VER) + // std::make_unique was added in MSVC 12.0 + #if _MSC_VER >= 1800 // MSVC 12.0 (Visual Studio 2013) + #define COMPILER_SUPPORTS_MAKE_UNIQUE + #endif + #elif defined(__clang__) + // std::make_unique was added in clang 3.4, but not until Xcode 6. + // Annoyingly, Apple makes the clang version defines match the version + // of Xcode, not the version of clang. + #define CLANG_VERSION (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) + #if defined(__APPLE__) && CLANG_VERSION >= 60000 && CPLUSPLUS_SUPPORTS_MAKE_UNIQUE + #define COMPILER_SUPPORTS_MAKE_UNIQUE + #elif !defined(__APPLE__) && CLANG_VERSION >= 30400 && CPLUSPLUS_SUPPORTS_MAKE_UNIQUE + #define COMPILER_SUPPORTS_MAKE_UNIQUE + #endif + #elif defined(__GNUC__) + // std::make_unique was added in gcc 4.9 + #define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) + #if GCC_VERSION >= 40900 && CPLUSPLUS_SUPPORTS_MAKE_UNIQUE + #define COMPILER_SUPPORTS_MAKE_UNIQUE + #endif + #endif +#endif + +#if defined(COMPILER_SUPPORTS_MAKE_UNIQUE) + +// If the compiler supports std::make_unique, then pull in to get it. +#include + +#else + +// Otherwise, the compiler doesn't provide it, so implement it ourselves. + +#include +#include +#include +#include + +namespace std { + +template struct _Unique_if { + typedef unique_ptr<_Ty> _Single_object; +}; + +template struct _Unique_if<_Ty[]> { + typedef unique_ptr<_Ty[]> _Unknown_bound; +}; + +template struct _Unique_if<_Ty[N]> { + typedef void _Known_bound; +}; + +// +// template< class T, class... Args > +// unique_ptr make_unique( Args&&... args); +// + +#if defined(_MSC_VER) && (_MSC_VER < 1800) + +// Macro machinery because MSVC 11.0 doesn't support variadic templates. +// The _VARIADIC_EXPAND_0X stuff is defined in +#define _MAKE_UNIQUE( \ + TEMPLATE_LIST, PADDING_LIST, LIST, COMMA, X1, X2, X3, X4) \ + template inline \ + typename _Unique_if<_Ty>::_Single_object make_unique(LIST(_TYPE_REFREF_ARG)) \ + { \ + return unique_ptr<_Ty>(new _Ty(LIST(_FORWARD_ARG))); \ + } \ + +_VARIADIC_EXPAND_0X(_MAKE_UNIQUE, , , , ) +#undef _MAKE_UNIQUE + +#else // not MSVC 11.0 or earlier + +template + typename _Unique_if<_Ty>::_Single_object + make_unique(Args&&... args) { + return unique_ptr<_Ty>(new _Ty(std::forward(args)...)); + } + +#endif + +// template< class T > +// unique_ptr make_unique( std::size_t size ); + +template + typename _Unique_if<_Ty>::_Unknown_bound + make_unique(size_t n) { + typedef typename remove_extent<_Ty>::type U; + return unique_ptr<_Ty>(new U[n]()); + } + +// template< class T, class... Args > +// /* unspecified */ make_unique( Args&&... args ) = delete; + +// MSVC 11.0 doesn't support deleted functions, so the best we can do +// is simply not define the function. +#if !(defined(_MSC_VER) && (_MSC_VER < 1800)) + +template + typename _Unique_if::_Known_bound + make_unique(Args&&...) = delete; + +#endif + +} // namespace std + +#endif // !COMPILER_SUPPORTS_MAKE_UNIQUE + +#endif /* MIXXX_UTIL_MEMORY_H */