From beaf5250357d5fc0da1f40f2bdd21c3ca62ba283 Mon Sep 17 00:00:00 2001 From: Uwe Klotz Date: Wed, 29 Sep 2021 11:38:38 +0200 Subject: Beats: Use std::make_shared --- src/track/beatgrid.cpp | 35 +++++++++++++++++++++-------------- src/track/beatgrid.h | 17 ++++++++++++++--- src/track/beatmap.cpp | 26 +++++++++++++++----------- src/track/beatmap.h | 21 ++++++++++++++++----- src/track/beats.h | 11 +++++++++++ 5 files changed, 77 insertions(+), 33 deletions(-) (limited to 'src') diff --git a/src/track/beatgrid.cpp b/src/track/beatgrid.cpp index 48de26c2b4..a63006511f 100644 --- a/src/track/beatgrid.cpp +++ b/src/track/beatgrid.cpp @@ -46,6 +46,7 @@ class BeatGridIterator : public BeatIterator { }; BeatGrid::BeatGrid( + MakeSharedTag, audio::SampleRate sampleRate, const QString& subVersion, const mixxx::track::io::BeatGrid& grid, @@ -56,17 +57,18 @@ BeatGrid::BeatGrid( m_beatLengthFrames(beatLengthFrames) { } -BeatGrid::BeatGrid(const BeatGrid& other, +BeatGrid::BeatGrid( + MakeSharedTag, + const BeatGrid& other, const mixxx::track::io::BeatGrid& grid, audio::FrameDiff_t beatLengthFrames) - : m_subVersion(other.m_subVersion), - m_sampleRate(other.m_sampleRate), - m_grid(grid), - m_beatLengthFrames(beatLengthFrames) { + : BeatGrid({}, other.m_sampleRate, other.m_subVersion, grid, beatLengthFrames) { } -BeatGrid::BeatGrid(const BeatGrid& other) - : BeatGrid(other, other.m_grid, other.m_beatLengthFrames) { +BeatGrid::BeatGrid( + MakeSharedTag, + const BeatGrid& other) + : BeatGrid({}, other, other.m_grid, other.m_beatLengthFrames) { } // static @@ -96,7 +98,8 @@ BeatsPointer BeatGrid::makeBeatGrid( // Calculate beat length as sample offsets const audio::FrameDiff_t beatLengthFrames = 60.0 * sampleRate / bpm.value(); - return BeatsPointer(new BeatGrid(sampleRate, subVersion, grid, beatLengthFrames)); + return std::make_shared( + MakeSharedTag{}, sampleRate, subVersion, grid, beatLengthFrames); } // static @@ -107,12 +110,16 @@ BeatsPointer BeatGrid::fromByteArray( mixxx::track::io::BeatGrid grid; if (grid.ParseFromArray(byteArray.constData(), byteArray.length())) { const audio::FrameDiff_t beatLengthFrames = (60.0 * sampleRate / grid.bpm().bpm()); - return BeatsPointer(new BeatGrid(sampleRate, subVersion, grid, beatLengthFrames)); + return std::make_shared(MakeSharedTag{}, + sampleRate, + subVersion, + grid, + beatLengthFrames); } // Legacy fallback for BeatGrid-1.0 if (byteArray.size() != sizeof(BeatGridData)) { - return BeatsPointer(new BeatGrid(sampleRate, QString(), grid, 0)); + return std::make_shared(MakeSharedTag{}, sampleRate, QString(), grid, 0); } const BeatGridData* blob = reinterpret_cast(byteArray.constData()); const auto firstBeat = mixxx::audio::FramePos(blob->firstBeat); @@ -259,7 +266,7 @@ BeatsPointer BeatGrid::translate(audio::FrameDiff_t offset) const { static_cast( newFirstBeatPosition.toLowerFrameBoundary().value())); - return BeatsPointer(new BeatGrid(*this, grid, m_beatLengthFrames)); + return std::make_shared(MakeSharedTag{}, *this, grid, m_beatLengthFrames); } BeatsPointer BeatGrid::scale(BpmScale scale) const { @@ -297,17 +304,17 @@ BeatsPointer BeatGrid::scale(BpmScale scale) const { bpm = BeatUtils::roundBpmWithinRange(bpm - kBpmScaleRounding, bpm, bpm + kBpmScaleRounding); grid.mutable_bpm()->set_bpm(bpm.value()); const mixxx::audio::FrameDiff_t beatLengthFrames = (60.0 * m_sampleRate / bpm.value()); - return BeatsPointer(new BeatGrid(*this, grid, beatLengthFrames)); + return std::make_shared(MakeSharedTag{}, *this, grid, beatLengthFrames); } BeatsPointer BeatGrid::setBpm(mixxx::Bpm bpm) const { VERIFY_OR_DEBUG_ASSERT(bpm.isValid()) { - return nullptr; + return clone(); } mixxx::track::io::BeatGrid grid = m_grid; grid.mutable_bpm()->set_bpm(bpm.value()); const mixxx::audio::FrameDiff_t beatLengthFrames = (60.0 * m_sampleRate / bpm.value()); - return BeatsPointer(new BeatGrid(*this, grid, beatLengthFrames)); + return std::make_shared(MakeSharedTag{}, *this, grid, beatLengthFrames); } } // namespace mixxx diff --git a/src/track/beatgrid.h b/src/track/beatgrid.h index 5b3374c40e..a2e5b117b1 100644 --- a/src/track/beatgrid.h +++ b/src/track/beatgrid.h @@ -66,16 +66,27 @@ class BeatGrid final : public Beats { BeatsPointer scale(BpmScale scale) const override; BeatsPointer setBpm(mixxx::Bpm bpm) const override; - private: + //////////////////////////////////////////////////////////////////////////// + // Hidden constructors + //////////////////////////////////////////////////////////////////////////// + BeatGrid( + MakeSharedTag, audio::SampleRate sampleRate, const QString& subVersion, const mixxx::track::io::BeatGrid& grid, double beatLength); // Constructor to update the beat grid - BeatGrid(const BeatGrid& other, const mixxx::track::io::BeatGrid& grid, double beatLength); - BeatGrid(const BeatGrid& other); + BeatGrid( + MakeSharedTag, + const BeatGrid& other, + const mixxx::track::io::BeatGrid& grid, + double beatLength); + BeatGrid( + MakeSharedTag, + const BeatGrid& other); + private: audio::FramePos firstBeatPosition() const; mixxx::Bpm bpm() const; diff --git a/src/track/beatmap.cpp b/src/track/beatmap.cpp index 4b5989d718..5f80ddf435 100644 --- a/src/track/beatmap.cpp +++ b/src/track/beatmap.cpp @@ -178,6 +178,7 @@ class BeatMapIterator : public BeatIterator { }; BeatMap::BeatMap( + MakeSharedTag, audio::SampleRate sampleRate, const QString& subVersion, BeatList beats, @@ -188,15 +189,18 @@ BeatMap::BeatMap( m_beats(std::move(beats)) { } -BeatMap::BeatMap(const BeatMap& other, BeatList beats, mixxx::Bpm nominalBpm) - : m_subVersion(other.m_subVersion), - m_sampleRate(other.m_sampleRate), - m_nominalBpm(nominalBpm), - m_beats(std::move(beats)) { +BeatMap::BeatMap( + MakeSharedTag, + const BeatMap& other, + BeatList beats, + mixxx::Bpm nominalBpm) + : BeatMap({}, other.m_sampleRate, other.m_subVersion, std::move(beats), nominalBpm) { } -BeatMap::BeatMap(const BeatMap& other) - : BeatMap(other, other.m_beats, other.m_nominalBpm) { +BeatMap::BeatMap( + MakeSharedTag, + const BeatMap& other) + : BeatMap({}, other, other.m_beats, other.m_nominalBpm) { } // static @@ -218,7 +222,7 @@ BeatsPointer BeatMap::fromByteArray( qDebug() << "ERROR: Could not parse BeatMap from QByteArray of size" << byteArray.size(); } - return BeatsPointer(new BeatMap(sampleRate, subVersion, beatList, nominalBpm)); + return std::make_shared(MakeSharedTag{}, sampleRate, subVersion, beatList, nominalBpm); } // static @@ -250,7 +254,7 @@ BeatsPointer BeatMap::makeBeatMap( previousBeatPos = beatPos; } const auto nominalBpm = calculateNominalBpm(beatList, sampleRate); - return BeatsPointer(new BeatMap(sampleRate, subVersion, beatList, nominalBpm)); + return std::make_shared(MakeSharedTag{}, sampleRate, subVersion, beatList, nominalBpm); } QByteArray BeatMap::toByteArray() const { @@ -543,7 +547,7 @@ BeatsPointer BeatMap::translate(audio::FrameDiff_t offset) const { } } - return BeatsPointer(new BeatMap(*this, beats, m_nominalBpm)); + return std::make_shared(MakeSharedTag{}, *this, beats, m_nominalBpm); } BeatsPointer BeatMap::scale(BpmScale scale) const { @@ -591,7 +595,7 @@ BeatsPointer BeatMap::scale(BpmScale scale) const { } mixxx::Bpm bpm = calculateNominalBpm(beats, m_sampleRate); - return BeatsPointer(new BeatMap(*this, beats, bpm)); + return std::make_shared(MakeSharedTag{}, *this, beats, bpm); } BeatsPointer BeatMap::setBpm(mixxx::Bpm bpm) const { diff --git a/src/track/beatmap.h b/src/track/beatmap.h index 6ada9fd907..1ad9232dcc 100644 --- a/src/track/beatmap.h +++ b/src/track/beatmap.h @@ -20,7 +20,6 @@ namespace mixxx { class BeatMap final : public Beats { public: - ~BeatMap() override = default; static BeatsPointer fromByteArray( @@ -69,15 +68,27 @@ class BeatMap final : public Beats { BeatsPointer scale(BpmScale scale) const override; BeatsPointer setBpm(mixxx::Bpm bpm) const override; - private: - BeatMap(audio::SampleRate sampleRate, + //////////////////////////////////////////////////////////////////////////// + // Hidden constructors + //////////////////////////////////////////////////////////////////////////// + + BeatMap( + MakeSharedTag, + audio::SampleRate sampleRate, const QString& subVersion, BeatList beats, mixxx::Bpm nominalBpm); // Constructor to update the beat map - BeatMap(const BeatMap& other, BeatList beats, mixxx::Bpm nominalBpm); - BeatMap(const BeatMap& other); + BeatMap( + MakeSharedTag, + const BeatMap& other, + BeatList beats, + mixxx::Bpm nominalBpm); + BeatMap( + MakeSharedTag, + const BeatMap& other); + private: bool isValid() const override; const QString m_subVersion; diff --git a/src/track/beats.h b/src/track/beats.h index 56e9387fe2..4add4a3578 100644 --- a/src/track/beats.h +++ b/src/track/beats.h @@ -176,7 +176,18 @@ class Beats : private std::enable_shared_from_this { virtual BeatsPointer setBpm(mixxx::Bpm bpm) const = 0; protected: + /// Type tag for making public constructors of derived classes inaccessible. + /// + /// The constructors must be public for using std::make_shared(). + struct MakeSharedTag {}; + + Beats() = default; + virtual bool isValid() const = 0; + + private: + Beats(const Beats&) = delete; + Beats(Beats&&) = delete; }; } // namespace mixxx -- cgit v1.2.3