diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/base/Point.h	Tue Mar 05 15:15:11 2019 +0000
@@ -0,0 +1,134 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */
+
+/*
+    Sonic Visualiser
+    An audio file viewer and annotation editor.
+    Centre for Digital Music, Queen Mary, University of London.
+    This file copyright 2006 Chris Cannam.
+    
+    This program is free software; you can redistribute it and/or
+    modify it under the terms of the GNU General Public License as
+    published by the Free Software Foundation; either version 2 of the
+    License, or (at your option) any later version.  See the file
+    COPYING included with this distribution for more information.
+*/
+
+#ifndef SV_POINT_H
+#define SV_POINT_H
+
+#include <QString>
+
+#include "BaseTypes.h"
+
+class Point
+{
+public:
+    Point(sv_frame_t frame, QString label) :
+        m_haveValue(false), m_haveLevel(false), m_haveFrame(true),
+        m_haveDuration(false), m_haveReferenceFrame(false), m_haveLabel(true),
+        m_value(0.f), m_level(0.f), m_frame(frame),
+        m_duration(0), m_referenceFrame(0), m_label(label) { }
+        
+    Point(sv_frame_t frame, float value, QString label) :
+        m_haveValue(true), m_haveLevel(false), m_haveFrame(true),
+        m_haveDuration(false), m_haveReferenceFrame(false), m_haveLabel(true),
+        m_value(value), m_level(0.f), m_frame(frame),
+        m_duration(0), m_referenceFrame(0), m_label(label) { }
+        
+    Point(sv_frame_t frame, float value, sv_frame_t duration, QString label) :
+        m_haveValue(true), m_haveLevel(false), m_haveFrame(true),
+        m_haveDuration(true), m_haveReferenceFrame(false), m_haveLabel(true),
+        m_value(value), m_level(0.f), m_frame(frame),
+        m_duration(duration), m_referenceFrame(0), m_label(label) { }
+        
+    Point(sv_frame_t frame, float value, sv_frame_t duration, float level, QString label) :
+        m_haveValue(true), m_haveLevel(true), m_haveFrame(true),
+        m_haveDuration(true), m_haveReferenceFrame(false), m_haveLabel(true),
+        m_value(value), m_level(level), m_frame(frame),
+        m_duration(duration), m_referenceFrame(0), m_label(label) { }
+
+    Point(const Point &point) =default;
+    Point &operator=(const Point &point) =default;
+    Point &operator=(Point &&point) =default;
+    
+    bool haveFrame() const { return m_haveFrame; }
+    sv_frame_t getFrame() const { return m_frame; }
+
+    Point withFrame(sv_frame_t frame) const {
+        Point p(*this);
+        p.m_haveFrame = true;
+        p.m_frame = frame;
+        return p;
+    }
+    
+    bool haveValue() const { return m_haveValue; }
+    float getValue() const { return m_value; }
+    
+    Point withValue(float value) const {
+        Point p(*this);
+        p.m_haveValue = true;
+        p.m_value = value;
+        return p;
+    }
+    
+    bool haveDuration() const { return m_haveDuration; }
+    sv_frame_t getDuration() const { return m_duration; }
+
+    Point withDuration(sv_frame_t duration) const {
+        Point p(*this);
+        p.m_haveDuration = true;
+        p.m_duration = duration;
+        return p;
+    }
+    
+    bool haveLabel() const { return m_haveLabel; }
+    QString getLabel() const { return m_label; }
+
+    Point withLabel(QString label) const {
+        Point p(*this);
+        p.m_haveLabel = true;
+        p.m_label = label;
+        return p;
+    }
+    
+    bool haveLevel() const { return m_haveLevel; }
+    float getLevel() const { return m_level; }
+    Point withLevel(float level) const {
+        Point p(*this);
+        p.m_haveLevel = true;
+        p.m_level = level;
+        return p;
+    }
+    
+    bool haveReferenceFrame() const { return m_haveReferenceFrame; }
+    sv_frame_t getReferenceFrame() const { return m_referenceFrame; }
+        
+    bool referenceFrameDiffers() const { // from point frame
+        return m_haveReferenceFrame && (m_referenceFrame != m_frame);
+    }
+    
+    Point withReferenceFrame(sv_frame_t frame) const {
+        Point p(*this);
+        p.m_haveReferenceFrame = true;
+        p.m_referenceFrame = frame;
+        return p;
+    }
+    
+private:
+    // The order of fields here is chosen to minimise overall size of struct.
+    // If you change something, check what difference it makes to packing.
+    bool m_haveValue : 1;
+    bool m_haveLevel : 1;
+    bool m_haveFrame : 1;
+    bool m_haveDuration : 1;
+    bool m_haveReferenceFrame : 1;
+    bool m_haveLabel : 1;
+    float m_value;
+    float m_level;
+    sv_frame_t m_frame;
+    sv_frame_t m_duration;
+    sv_frame_t m_referenceFrame;
+    QString m_label;
+};
+
+#endif