annotate data/model/SparseValueModel.h @ 256:9c85517ff0f5

* Fix #1706927 NaNs from plugin outputs should not be used
author Chris Cannam
date Fri, 27 Apr 2007 15:39:48 +0000
parents 4b2ea82fd0ed
children 46398ab6ff58
rev   line source
Chris@147 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@147 2
Chris@147 3 /*
Chris@147 4 Sonic Visualiser
Chris@147 5 An audio file viewer and annotation editor.
Chris@147 6 Centre for Digital Music, Queen Mary, University of London.
Chris@147 7 This file copyright 2006 Chris Cannam.
Chris@147 8
Chris@147 9 This program is free software; you can redistribute it and/or
Chris@147 10 modify it under the terms of the GNU General Public License as
Chris@147 11 published by the Free Software Foundation; either version 2 of the
Chris@147 12 License, or (at your option) any later version. See the file
Chris@147 13 COPYING included with this distribution for more information.
Chris@147 14 */
Chris@147 15
Chris@147 16 #ifndef _SPARSE_VALUE_MODEL_H_
Chris@147 17 #define _SPARSE_VALUE_MODEL_H_
Chris@147 18
Chris@147 19 #include "SparseModel.h"
Chris@150 20 #include "base/UnitDatabase.h"
Chris@147 21
Chris@147 22 /**
Chris@147 23 * Model containing sparse data (points with some properties) of which
Chris@147 24 * one of the properties is an arbitrary float value. The other
Chris@147 25 * properties depend on the point type.
Chris@147 26 */
Chris@147 27
Chris@147 28 template <typename PointType>
Chris@147 29 class SparseValueModel : public SparseModel<PointType>
Chris@147 30 {
Chris@147 31 public:
Chris@147 32 SparseValueModel(size_t sampleRate, size_t resolution,
Chris@256 33 bool notifyOnAdd = true) :
Chris@256 34 SparseModel<PointType>(sampleRate, resolution, notifyOnAdd),
Chris@256 35 m_valueMinimum(0.f),
Chris@256 36 m_valueMaximum(0.f),
Chris@256 37 m_haveExtents(false)
Chris@256 38 { }
Chris@256 39
Chris@256 40 SparseValueModel(size_t sampleRate, size_t resolution,
Chris@147 41 float valueMinimum, float valueMaximum,
Chris@147 42 bool notifyOnAdd = true) :
Chris@147 43 SparseModel<PointType>(sampleRate, resolution, notifyOnAdd),
Chris@147 44 m_valueMinimum(valueMinimum),
Chris@256 45 m_valueMaximum(valueMaximum),
Chris@256 46 m_haveExtents(true)
Chris@147 47 { }
Chris@147 48
Chris@147 49 using SparseModel<PointType>::m_points;
Chris@147 50 using SparseModel<PointType>::modelChanged;
Chris@147 51
Chris@147 52 virtual float getValueMinimum() const { return m_valueMinimum; }
Chris@147 53 virtual float getValueMaximum() const { return m_valueMaximum; }
Chris@147 54
Chris@147 55 virtual QString getScaleUnits() const { return m_units; }
Chris@147 56 virtual void setScaleUnits(QString units) {
Chris@147 57 m_units = units;
Chris@147 58 UnitDatabase::getInstance()->registerUnit(units);
Chris@147 59 }
Chris@147 60
Chris@147 61 virtual void addPoint(const PointType &point)
Chris@147 62 {
Chris@147 63 bool allChange = false;
Chris@256 64
Chris@256 65 if (!isnan(point.value) && !isinf(point.value)) {
Chris@256 66 if (!m_haveExtents || point.value < m_valueMinimum) {
Chris@256 67 m_valueMinimum = point.value; allChange = true;
Chris@256 68 }
Chris@256 69 if (!m_haveExtents || point.value > m_valueMaximum) {
Chris@256 70 m_valueMaximum = point.value; allChange = true;
Chris@256 71 }
Chris@256 72 m_haveExtents = true;
Chris@256 73 }
Chris@147 74
Chris@147 75 SparseModel<PointType>::addPoint(point);
Chris@147 76 if (allChange) emit modelChanged();
Chris@147 77 }
Chris@147 78
Chris@147 79 virtual void deletePoint(const PointType &point)
Chris@147 80 {
Chris@147 81 SparseModel<PointType>::deletePoint(point);
Chris@147 82
Chris@147 83 if (point.value == m_valueMinimum ||
Chris@147 84 point.value == m_valueMaximum) {
Chris@147 85
Chris@147 86 float formerMin = m_valueMinimum, formerMax = m_valueMaximum;
Chris@147 87
Chris@147 88 for (typename SparseModel<PointType>::PointList::const_iterator i
Chris@147 89 = m_points.begin();
Chris@147 90 i != m_points.end(); ++i) {
Chris@147 91
Chris@147 92 if (i == m_points.begin() || i->value < m_valueMinimum) {
Chris@147 93 m_valueMinimum = i->value;
Chris@147 94 }
Chris@147 95 if (i == m_points.begin() || i->value > m_valueMaximum) {
Chris@147 96 m_valueMaximum = i->value;
Chris@147 97 }
Chris@147 98 }
Chris@147 99
Chris@147 100 if (formerMin != m_valueMinimum || formerMax != m_valueMaximum) {
Chris@147 101 emit modelChanged();
Chris@147 102 }
Chris@147 103 }
Chris@147 104 }
Chris@147 105
Chris@147 106 virtual QString toXmlString(QString indent = "",
Chris@147 107 QString extraAttributes = "") const
Chris@147 108 {
Chris@147 109 return SparseModel<PointType>::toXmlString
Chris@147 110 (indent,
Chris@147 111 QString("%1 minimum=\"%2\" maximum=\"%3\" units=\"%4\"")
Chris@147 112 .arg(extraAttributes).arg(m_valueMinimum).arg(m_valueMaximum)
Chris@147 113 .arg(this->encodeEntities(m_units)));
Chris@147 114 }
Chris@147 115
Chris@147 116 protected:
Chris@147 117 float m_valueMinimum;
Chris@147 118 float m_valueMaximum;
Chris@256 119 bool m_haveExtents;
Chris@147 120 QString m_units;
Chris@147 121 };
Chris@147 122
Chris@147 123
Chris@147 124 #endif
Chris@147 125