annotate data/model/SparseOneDimensionalModel.h @ 319:3ff8f571da09

* Hoist alignment model set/query up to Model, so any models can be aligned * Add Model::aboutToDelete and aboutToBeDeleted for management of models that are contained by or referred to by other models instead of only the document
author Chris Cannam
date Wed, 24 Oct 2007 15:21:38 +0000
parents 7a4bd2c8585c
children f14e2f7b24f7 6f6ab834449d
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_ONE_DIMENSIONAL_MODEL_H_
Chris@147 17 #define _SPARSE_ONE_DIMENSIONAL_MODEL_H_
Chris@147 18
Chris@147 19 #include "SparseModel.h"
Chris@150 20 #include "base/PlayParameterRepository.h"
Chris@147 21 #include "base/RealTime.h"
Chris@147 22
Chris@147 23 struct OneDimensionalPoint
Chris@147 24 {
Chris@147 25 public:
Chris@147 26 OneDimensionalPoint(long _frame) : frame(_frame) { }
Chris@147 27 OneDimensionalPoint(long _frame, QString _label) : frame(_frame), label(_label) { }
Chris@147 28
Chris@147 29 int getDimensions() const { return 1; }
Chris@147 30
Chris@147 31 long frame;
Chris@147 32 QString label;
Chris@147 33
Chris@314 34 void toXml(QTextStream &stream,
Chris@314 35 QString indent = "",
Chris@314 36 QString extraAttributes = "") const
Chris@147 37 {
Chris@314 38 stream << QString("%1<point frame=\"%2\" label=\"%3\" %4/>\n")
Chris@147 39 .arg(indent).arg(frame).arg(label).arg(extraAttributes);
Chris@147 40 }
Chris@147 41
Chris@147 42 QString toDelimitedDataString(QString delimiter, size_t sampleRate) const
Chris@147 43 {
Chris@147 44 QStringList list;
Chris@147 45 list << RealTime::frame2RealTime(frame, sampleRate).toString().c_str();
Chris@318 46 if (label != "") list << label;
Chris@147 47 return list.join(delimiter);
Chris@147 48 }
Chris@147 49
Chris@147 50 struct Comparator {
Chris@147 51 bool operator()(const OneDimensionalPoint &p1,
Chris@147 52 const OneDimensionalPoint &p2) const {
Chris@147 53 if (p1.frame != p2.frame) return p1.frame < p2.frame;
Chris@147 54 return p1.label < p2.label;
Chris@147 55 }
Chris@147 56 };
Chris@147 57
Chris@147 58 struct OrderComparator {
Chris@147 59 bool operator()(const OneDimensionalPoint &p1,
Chris@147 60 const OneDimensionalPoint &p2) const {
Chris@147 61 return p1.frame < p2.frame;
Chris@147 62 }
Chris@147 63 };
Chris@147 64 };
Chris@147 65
Chris@147 66
Chris@147 67 class SparseOneDimensionalModel : public SparseModel<OneDimensionalPoint>
Chris@147 68 {
Chris@147 69 public:
Chris@147 70 SparseOneDimensionalModel(size_t sampleRate, size_t resolution,
Chris@147 71 bool notifyOnAdd = true) :
Chris@147 72 SparseModel<OneDimensionalPoint>(sampleRate, resolution, notifyOnAdd)
Chris@147 73 {
Chris@147 74 PlayParameterRepository::getInstance()->addModel(this);
Chris@147 75 }
Chris@147 76
Chris@147 77 int getIndexOf(const Point &point) {
Chris@147 78 // slow
Chris@147 79 int i = 0;
Chris@147 80 Point::Comparator comparator;
Chris@147 81 for (PointList::const_iterator j = m_points.begin();
Chris@147 82 j != m_points.end(); ++j, ++i) {
Chris@147 83 if (!comparator(*j, point) && !comparator(point, *j)) return i;
Chris@147 84 }
Chris@147 85 return -1;
Chris@147 86 }
Chris@147 87 };
Chris@147 88
Chris@147 89 #endif
Chris@147 90
Chris@147 91
Chris@147 92