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