Mercurial > hg > svcore
comparison base/Point.h @ 1611:b2f32c554199 single-point
Pull out the Point class, plus start testing NoteModel, plus actually add the tests...
author | Chris Cannam |
---|---|
date | Tue, 05 Mar 2019 15:15:11 +0000 |
parents | |
children | 23a29e5dc0e9 |
comparison
equal
deleted
inserted
replaced
1610:7db29268cf4c | 1611:b2f32c554199 |
---|---|
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ | |
2 | |
3 /* | |
4 Sonic Visualiser | |
5 An audio file viewer and annotation editor. | |
6 Centre for Digital Music, Queen Mary, University of London. | |
7 This file copyright 2006 Chris Cannam. | |
8 | |
9 This program is free software; you can redistribute it and/or | |
10 modify it under the terms of the GNU General Public License as | |
11 published by the Free Software Foundation; either version 2 of the | |
12 License, or (at your option) any later version. See the file | |
13 COPYING included with this distribution for more information. | |
14 */ | |
15 | |
16 #ifndef SV_POINT_H | |
17 #define SV_POINT_H | |
18 | |
19 #include <QString> | |
20 | |
21 #include "BaseTypes.h" | |
22 | |
23 class Point | |
24 { | |
25 public: | |
26 Point(sv_frame_t frame, QString label) : | |
27 m_haveValue(false), m_haveLevel(false), m_haveFrame(true), | |
28 m_haveDuration(false), m_haveReferenceFrame(false), m_haveLabel(true), | |
29 m_value(0.f), m_level(0.f), m_frame(frame), | |
30 m_duration(0), m_referenceFrame(0), m_label(label) { } | |
31 | |
32 Point(sv_frame_t frame, float value, QString label) : | |
33 m_haveValue(true), m_haveLevel(false), m_haveFrame(true), | |
34 m_haveDuration(false), m_haveReferenceFrame(false), m_haveLabel(true), | |
35 m_value(value), m_level(0.f), m_frame(frame), | |
36 m_duration(0), m_referenceFrame(0), m_label(label) { } | |
37 | |
38 Point(sv_frame_t frame, float value, sv_frame_t duration, QString label) : | |
39 m_haveValue(true), m_haveLevel(false), m_haveFrame(true), | |
40 m_haveDuration(true), m_haveReferenceFrame(false), m_haveLabel(true), | |
41 m_value(value), m_level(0.f), m_frame(frame), | |
42 m_duration(duration), m_referenceFrame(0), m_label(label) { } | |
43 | |
44 Point(sv_frame_t frame, float value, sv_frame_t duration, float level, QString label) : | |
45 m_haveValue(true), m_haveLevel(true), m_haveFrame(true), | |
46 m_haveDuration(true), m_haveReferenceFrame(false), m_haveLabel(true), | |
47 m_value(value), m_level(level), m_frame(frame), | |
48 m_duration(duration), m_referenceFrame(0), m_label(label) { } | |
49 | |
50 Point(const Point &point) =default; | |
51 Point &operator=(const Point &point) =default; | |
52 Point &operator=(Point &&point) =default; | |
53 | |
54 bool haveFrame() const { return m_haveFrame; } | |
55 sv_frame_t getFrame() const { return m_frame; } | |
56 | |
57 Point withFrame(sv_frame_t frame) const { | |
58 Point p(*this); | |
59 p.m_haveFrame = true; | |
60 p.m_frame = frame; | |
61 return p; | |
62 } | |
63 | |
64 bool haveValue() const { return m_haveValue; } | |
65 float getValue() const { return m_value; } | |
66 | |
67 Point withValue(float value) const { | |
68 Point p(*this); | |
69 p.m_haveValue = true; | |
70 p.m_value = value; | |
71 return p; | |
72 } | |
73 | |
74 bool haveDuration() const { return m_haveDuration; } | |
75 sv_frame_t getDuration() const { return m_duration; } | |
76 | |
77 Point withDuration(sv_frame_t duration) const { | |
78 Point p(*this); | |
79 p.m_haveDuration = true; | |
80 p.m_duration = duration; | |
81 return p; | |
82 } | |
83 | |
84 bool haveLabel() const { return m_haveLabel; } | |
85 QString getLabel() const { return m_label; } | |
86 | |
87 Point withLabel(QString label) const { | |
88 Point p(*this); | |
89 p.m_haveLabel = true; | |
90 p.m_label = label; | |
91 return p; | |
92 } | |
93 | |
94 bool haveLevel() const { return m_haveLevel; } | |
95 float getLevel() const { return m_level; } | |
96 Point withLevel(float level) const { | |
97 Point p(*this); | |
98 p.m_haveLevel = true; | |
99 p.m_level = level; | |
100 return p; | |
101 } | |
102 | |
103 bool haveReferenceFrame() const { return m_haveReferenceFrame; } | |
104 sv_frame_t getReferenceFrame() const { return m_referenceFrame; } | |
105 | |
106 bool referenceFrameDiffers() const { // from point frame | |
107 return m_haveReferenceFrame && (m_referenceFrame != m_frame); | |
108 } | |
109 | |
110 Point withReferenceFrame(sv_frame_t frame) const { | |
111 Point p(*this); | |
112 p.m_haveReferenceFrame = true; | |
113 p.m_referenceFrame = frame; | |
114 return p; | |
115 } | |
116 | |
117 private: | |
118 // The order of fields here is chosen to minimise overall size of struct. | |
119 // If you change something, check what difference it makes to packing. | |
120 bool m_haveValue : 1; | |
121 bool m_haveLevel : 1; | |
122 bool m_haveFrame : 1; | |
123 bool m_haveDuration : 1; | |
124 bool m_haveReferenceFrame : 1; | |
125 bool m_haveLabel : 1; | |
126 float m_value; | |
127 float m_level; | |
128 sv_frame_t m_frame; | |
129 sv_frame_t m_duration; | |
130 sv_frame_t m_referenceFrame; | |
131 QString m_label; | |
132 }; | |
133 | |
134 #endif |