Line data Source code
1 : /*
2 : * SPDX-License-Identifier: GPL-3.0-only
3 : * MuseScore-Studio-CLA-applies
4 : *
5 : * MuseScore Studio
6 : * Music Composition & Notation
7 : *
8 : * Copyright (C) 2021 MuseScore Limited and others
9 : *
10 : * This program is free software: you can redistribute it and/or modify
11 : * it under the terms of the GNU General Public License version 3 as
12 : * published by the Free Software Foundation.
13 : *
14 : * This program is distributed in the hope that it will be useful,
15 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 : * GNU General Public License for more details.
18 : *
19 : * You should have received a copy of the GNU General Public License
20 : * along with this program. If not, see <https://www.gnu.org/licenses/>.
21 : */
22 :
23 : #pragma once
24 :
25 : #include <map>
26 :
27 : #include "measurebase.h"
28 :
29 : namespace mu::engraving {
30 : class RangeLock
31 : {
32 : public:
33 114 : RangeLock(MeasureBase* start, MeasureBase* end)
34 114 : : m_startMB(start), m_endMB(end)
35 : {
36 114 : assert(m_startMB->isBefore(m_endMB) || m_startMB == m_endMB);
37 114 : }
38 :
39 2819 : MeasureBase* startMB() const { return m_startMB; }
40 2009 : MeasureBase* endMB() const { return m_endMB; }
41 :
42 : bool contains(const MeasureBase* mb) const;
43 :
44 : private:
45 : MeasureBase* m_startMB;
46 : MeasureBase* m_endMB;
47 : };
48 :
49 : class RangeLocks
50 : {
51 : public:
52 : void add(const RangeLock* lock);
53 : void remove(const RangeLock* lock);
54 : void removeLockStartingAt(const MeasureBase* mb) { m_rangeLocks.erase(mb); }
55 4190 : void clear() { m_rangeLocks.clear(); }
56 :
57 : const RangeLock* lockStartingAt(const MeasureBase* mb) const;
58 : const RangeLock* lockContaining(const MeasureBase* mb) const;
59 : std::vector<const RangeLock*> locksContainedInRange(const MeasureBase* start, const MeasureBase* end) const;
60 :
61 : std::vector<const RangeLock*> allLocks() const;
62 :
63 : private:
64 : #ifndef NDEBUG
65 : void sanityCheck();
66 : void dump() const;
67 : #endif
68 :
69 : struct Ordering
70 : {
71 5619 : bool operator()(const MeasureBase* a, const MeasureBase* b) const
72 : {
73 5619 : return a->isBefore(b);
74 : }
75 : };
76 :
77 : std::map<const MeasureBase*, const RangeLock*, Ordering> m_rangeLocks;
78 : };
79 : } // namespace mu::engraving
|