comparison data/model/SparseModel.h @ 1064:c9fdd9921146 tonioni

Implement FillGaps option in SparseModel export
author Chris Cannam
date Tue, 31 Mar 2015 11:54:57 +0100
parents 57633d605547
children 0fd3661bcfff
comparison
equal deleted inserted replaced
1063:074d7c51e973 1064:c9fdd9921146
151 virtual QString toDelimitedDataString(QString delimiter) const { 151 virtual QString toDelimitedDataString(QString delimiter) const {
152 return toDelimitedDataStringWithOptions(delimiter, DataExportDefaults); 152 return toDelimitedDataStringWithOptions(delimiter, DataExportDefaults);
153 } 153 }
154 154
155 virtual QString toDelimitedDataStringWithOptions(QString delimiter, 155 virtual QString toDelimitedDataStringWithOptions(QString delimiter,
156 DataExportOptions opts) const { 156 DataExportOptions opts) const {
157 QString s; 157 return toDelimitedDataStringSubsetWithOptions
158 for (PointListConstIterator i = m_points.begin(); i != m_points.end(); ++i) { 158 (delimiter, opts,
159 s += i->toDelimitedDataString(delimiter, opts, m_sampleRate) + "\n"; 159 std::min(getStartFrame(), sv_frame_t(0)), getEndFrame());
160 }
161 return s;
162 } 160 }
163 161
164 virtual QString toDelimitedDataStringSubset(QString delimiter, sv_frame_t f0, sv_frame_t f1) const { 162 virtual QString toDelimitedDataStringSubset(QString delimiter, sv_frame_t f0, sv_frame_t f1) const {
165 return toDelimitedDataStringSubsetWithOptions(delimiter, DataExportDefaults, f0, f1); 163 return toDelimitedDataStringSubsetWithOptions(delimiter, DataExportDefaults, f0, f1);
166 } 164 }
167 165
168 virtual QString toDelimitedDataStringSubsetWithOptions(QString delimiter, DataExportOptions opts, sv_frame_t f0, sv_frame_t f1) const { 166 virtual QString toDelimitedDataStringSubsetWithOptions(QString delimiter, DataExportOptions opts, sv_frame_t f0, sv_frame_t f1) const {
169 QString s; 167 if (opts & DataExportFillGaps) {
170 for (PointListConstIterator i = m_points.begin(); i != m_points.end(); ++i) { 168 return toDelimitedDataStringSubsetFilled(delimiter, opts, f0, f1);
171 if (i->frame >= f0 && i->frame < f1) { 169 } else {
172 s += i->toDelimitedDataString(delimiter, opts, m_sampleRate) + "\n"; 170 QString s;
171 for (PointListConstIterator i = m_points.begin(); i != m_points.end(); ++i) {
172 if (i->frame >= f0 && i->frame < f1) {
173 s += i->toDelimitedDataString(delimiter, opts, m_sampleRate) + "\n";
174 }
173 } 175 }
174 } 176 return s;
175 return s; 177 }
176 } 178 }
177 179
178 /** 180 /**
179 * Command to add a point, with undo. 181 * Command to add a point, with undo.
180 */ 182 */
460 462
461 if (indexAtFrame > 0) { 463 if (indexAtFrame > 0) {
462 std::cerr << "WARNING: SparseModel::getPointListIteratorForRow: No iterator available for row " << row << " (frame = " << frame << ", index at frame = " << initialIndexAtFrame << ", leftover index " << indexAtFrame << ")" << std::endl; 464 std::cerr << "WARNING: SparseModel::getPointListIteratorForRow: No iterator available for row " << row << " (frame = " << frame << ", index at frame = " << initialIndexAtFrame << ", leftover index " << indexAtFrame << ")" << std::endl;
463 } 465 }
464 return i; 466 return i;
467 }
468
469 QString toDelimitedDataStringSubsetFilled(QString delimiter,
470 DataExportOptions opts,
471 sv_frame_t f0,
472 sv_frame_t f1) const {
473
474 QString s;
475 opts &= ~DataExportFillGaps;
476
477 // find frame time of first point in range (if any)
478 sv_frame_t first = f0;
479 for (auto &p: m_points) {
480 if (p.frame >= f0) {
481 first = p.frame;
482 break;
483 }
484 }
485
486 // project back to first frame time in range according to
487 // resolution. e.g. if f0 = 2, first = 9, resolution = 4 then
488 // we start at 5 (because 1 is too early and we need to arrive
489 // at 9 to match the first actual point). This method is
490 // stupid but easy to understand:
491 sv_frame_t f = first;
492 while (f >= f0 + m_resolution) f -= m_resolution;
493
494 // now progress, either writing the next point (if within
495 // distance) or a default point
496 PointListConstIterator itr = m_points.begin();
497
498 while (f < f1) {
499 if (itr != m_points.end() && itr->frame <= f) {
500 s += itr->toDelimitedDataString(delimiter, opts, m_sampleRate);
501 ++itr;
502 } else {
503 s += Point(f).toDelimitedDataString(delimiter, opts, m_sampleRate);
504 }
505 s += "\n";
506 f += m_resolution;
507 }
508
509 return s;
465 } 510 }
466 }; 511 };
467 512
468 513
469 template <typename PointType> 514 template <typename PointType>