Mercurial > hg > svcore
comparison data/model/SparseModel.h @ 1038:cc27f35aa75c cxx11
Introducing the signed 64-bit frame index type, and fixing build failures from inclusion of -Wconversion with -Werror. Not finished yet.
| author | Chris Cannam |
|---|---|
| date | Tue, 03 Mar 2015 15:18:24 +0000 |
| parents | 9f526ddc6165 |
| children | a1cd5abcb38b |
comparison
equal
deleted
inserted
replaced
| 1037:bf0e5944289b | 1038:cc27f35aa75c |
|---|---|
| 46 SparseModel(int sampleRate, int resolution, | 46 SparseModel(int sampleRate, int resolution, |
| 47 bool notifyOnAdd = true); | 47 bool notifyOnAdd = true); |
| 48 virtual ~SparseModel() { } | 48 virtual ~SparseModel() { } |
| 49 | 49 |
| 50 virtual bool isOK() const { return true; } | 50 virtual bool isOK() const { return true; } |
| 51 virtual int getStartFrame() const; | 51 virtual sv_frame_t getStartFrame() const; |
| 52 virtual int getEndFrame() const; | 52 virtual sv_frame_t getEndFrame() const; |
| 53 virtual int getSampleRate() const { return m_sampleRate; } | 53 virtual int getSampleRate() const { return m_sampleRate; } |
| 54 | 54 |
| 55 virtual Model *clone() const; | 55 virtual Model *clone() const; |
| 56 | 56 |
| 57 // Number of frames of the underlying sample rate that this model | 57 // Number of frames of the underlying sample rate that this model |
| 89 * Get all of the points in this model between the given | 89 * Get all of the points in this model between the given |
| 90 * boundaries (in frames), as well as up to two points before and | 90 * boundaries (in frames), as well as up to two points before and |
| 91 * after the boundaries. If you need exact boundaries, check the | 91 * after the boundaries. If you need exact boundaries, check the |
| 92 * point coordinates in the returned list. | 92 * point coordinates in the returned list. |
| 93 */ | 93 */ |
| 94 virtual PointList getPoints(long start, long end) const; | 94 virtual PointList getPoints(sv_frame_t start, sv_frame_t end) const; |
| 95 | 95 |
| 96 /** | 96 /** |
| 97 * Get all points that cover the given frame number, taking the | 97 * Get all points that cover the given frame number, taking the |
| 98 * resolution of the model into account. | 98 * resolution of the model into account. |
| 99 */ | 99 */ |
| 100 virtual PointList getPoints(long frame) const; | 100 virtual PointList getPoints(sv_frame_t frame) const; |
| 101 | 101 |
| 102 /** | 102 /** |
| 103 * Return all points that share the nearest frame number prior to | 103 * Return all points that share the nearest frame number prior to |
| 104 * the given one at which there are any points. | 104 * the given one at which there are any points. |
| 105 */ | 105 */ |
| 106 virtual PointList getPreviousPoints(long frame) const; | 106 virtual PointList getPreviousPoints(sv_frame_t frame) const; |
| 107 | 107 |
| 108 /** | 108 /** |
| 109 * Return all points that share the nearest frame number | 109 * Return all points that share the nearest frame number |
| 110 * subsequent to the given one at which there are any points. | 110 * subsequent to the given one at which there are any points. |
| 111 */ | 111 */ |
| 112 virtual PointList getNextPoints(long frame) const; | 112 virtual PointList getNextPoints(sv_frame_t frame) const; |
| 113 | 113 |
| 114 /** | 114 /** |
| 115 * Remove all points. | 115 * Remove all points. |
| 116 */ | 116 */ |
| 117 virtual void clear(); | 117 virtual void clear(); |
| 155 s += i->toDelimitedDataString(delimiter, m_sampleRate) + "\n"; | 155 s += i->toDelimitedDataString(delimiter, m_sampleRate) + "\n"; |
| 156 } | 156 } |
| 157 return s; | 157 return s; |
| 158 } | 158 } |
| 159 | 159 |
| 160 virtual QString toDelimitedDataStringSubset(QString delimiter, int f0, int f1) const | 160 virtual QString toDelimitedDataStringSubset(QString delimiter, sv_frame_t f0, sv_frame_t f1) const |
| 161 { | 161 { |
| 162 QString s; | 162 QString s; |
| 163 for (PointListConstIterator i = m_points.begin(); i != m_points.end(); ++i) { | 163 for (PointListConstIterator i = m_points.begin(); i != m_points.end(); ++i) { |
| 164 if (i->frame >= (long)f0 && i->frame < (long)f1) { | 164 if (i->frame >= f0 && i->frame < f1) { |
| 165 s += i->toDelimitedDataString(delimiter, m_sampleRate) + "\n"; | 165 s += i->toDelimitedDataString(delimiter, m_sampleRate) + "\n"; |
| 166 } | 166 } |
| 167 } | 167 } |
| 168 return s; | 168 return s; |
| 169 } | 169 } |
| 282 * TabularModel methods. | 282 * TabularModel methods. |
| 283 */ | 283 */ |
| 284 | 284 |
| 285 virtual int getRowCount() const | 285 virtual int getRowCount() const |
| 286 { | 286 { |
| 287 return m_points.size(); | 287 return int(m_points.size()); |
| 288 } | 288 } |
| 289 | 289 |
| 290 virtual long getFrameForRow(int row) const | 290 virtual sv_frame_t getFrameForRow(int row) const |
| 291 { | 291 { |
| 292 PointListConstIterator i = getPointListIteratorForRow(row); | 292 PointListConstIterator i = getPointListIteratorForRow(row); |
| 293 if (i == m_points.end()) return 0; | 293 if (i == m_points.end()) return 0; |
| 294 return i->frame; | 294 return i->frame; |
| 295 } | 295 } |
| 296 | 296 |
| 297 virtual int getRowForFrame(long frame) const | 297 virtual int getRowForFrame(sv_frame_t frame) const |
| 298 { | 298 { |
| 299 if (m_rows.empty()) rebuildRowVector(); | 299 if (m_rows.empty()) rebuildRowVector(); |
| 300 std::vector<long>::iterator i = | 300 std::vector<sv_frame_t>::iterator i = |
| 301 std::lower_bound(m_rows.begin(), m_rows.end(), frame); | 301 std::lower_bound(m_rows.begin(), m_rows.end(), frame); |
| 302 #if defined(__SUNPRO_CC) && defined(__STD_RW_ITERATOR__) | 302 ssize_t row = std::distance(m_rows.begin(), i); |
| 303 int row = 0; | |
| 304 std::distance(m_rows.begin(), i, row); | |
| 305 #else | |
| 306 int row = std::distance(m_rows.begin(), i); | |
| 307 #endif | |
| 308 if (i != m_rows.begin() && (i == m_rows.end() || *i != frame)) { | 303 if (i != m_rows.begin() && (i == m_rows.end() || *i != frame)) { |
| 309 --row; | 304 --row; |
| 310 } | 305 } |
| 311 return row; | 306 return int(row); |
| 312 } | 307 } |
| 313 | 308 |
| 314 virtual int getColumnCount() const { return 1; } | 309 virtual int getColumnCount() const { return 1; } |
| 315 virtual QVariant getData(int row, int column, int role) const | 310 virtual QVariant getData(int row, int column, int role) const |
| 316 { | 311 { |
| 372 | 367 |
| 373 protected: | 368 protected: |
| 374 int m_sampleRate; | 369 int m_sampleRate; |
| 375 int m_resolution; | 370 int m_resolution; |
| 376 bool m_notifyOnAdd; | 371 bool m_notifyOnAdd; |
| 377 long m_sinceLastNotifyMin; | 372 sv_frame_t m_sinceLastNotifyMin; |
| 378 long m_sinceLastNotifyMax; | 373 sv_frame_t m_sinceLastNotifyMax; |
| 379 bool m_hasTextLabels; | 374 bool m_hasTextLabels; |
| 380 | 375 |
| 381 PointList m_points; | 376 PointList m_points; |
| 382 int m_pointCount; | 377 int m_pointCount; |
| 383 mutable QMutex m_mutex; | 378 mutable QMutex m_mutex; |
| 384 int m_completion; | 379 int m_completion; |
| 385 | 380 |
| 386 void getPointIterators(long frame, | 381 void getPointIterators(sv_frame_t frame, |
| 387 PointListIterator &startItr, | 382 PointListIterator &startItr, |
| 388 PointListIterator &endItr); | 383 PointListIterator &endItr); |
| 389 void getPointIterators(long frame, | 384 void getPointIterators(sv_frame_t frame, |
| 390 PointListConstIterator &startItr, | 385 PointListConstIterator &startItr, |
| 391 PointListConstIterator &endItr) const; | 386 PointListConstIterator &endItr) const; |
| 392 | 387 |
| 393 // This is only used if the model is called on to act in | 388 // This is only used if the model is called on to act in |
| 394 // TabularModel mode | 389 // TabularModel mode |
| 395 mutable std::vector<long> m_rows; // map from row number to frame | 390 mutable std::vector<sv_frame_t> m_rows; // map from row number to frame |
| 396 void rebuildRowVector() const | 391 void rebuildRowVector() const |
| 397 { | 392 { |
| 398 m_rows.clear(); | 393 m_rows.clear(); |
| 399 for (PointListConstIterator i = m_points.begin(); i != m_points.end(); ++i) { | 394 for (PointListConstIterator i = m_points.begin(); i != m_points.end(); ++i) { |
| 400 // std::cerr << "rebuildRowVector: row " << m_rows.size() << " -> " << i->frame << std::endl; | 395 // std::cerr << "rebuildRowVector: row " << m_rows.size() << " -> " << i->frame << std::endl; |
| 405 PointListIterator getPointListIteratorForRow(int row) | 400 PointListIterator getPointListIteratorForRow(int row) |
| 406 { | 401 { |
| 407 if (m_rows.empty()) rebuildRowVector(); | 402 if (m_rows.empty()) rebuildRowVector(); |
| 408 if (row < 0 || row + 1 > int(m_rows.size())) return m_points.end(); | 403 if (row < 0 || row + 1 > int(m_rows.size())) return m_points.end(); |
| 409 | 404 |
| 410 int frame = m_rows[row]; | 405 sv_frame_t frame = m_rows[row]; |
| 411 int indexAtFrame = 0; | 406 int indexAtFrame = 0; |
| 412 int ri = row; | 407 int ri = row; |
| 413 while (ri > 0 && m_rows[ri-1] == m_rows[row]) { --ri; ++indexAtFrame; } | 408 while (ri > 0 && m_rows[ri-1] == m_rows[row]) { --ri; ++indexAtFrame; } |
| 414 int initialIndexAtFrame = indexAtFrame; | 409 int initialIndexAtFrame = indexAtFrame; |
| 415 | 410 |
| 432 PointListConstIterator getPointListIteratorForRow(int row) const | 427 PointListConstIterator getPointListIteratorForRow(int row) const |
| 433 { | 428 { |
| 434 if (m_rows.empty()) rebuildRowVector(); | 429 if (m_rows.empty()) rebuildRowVector(); |
| 435 if (row < 0 || row + 1 > int(m_rows.size())) return m_points.end(); | 430 if (row < 0 || row + 1 > int(m_rows.size())) return m_points.end(); |
| 436 | 431 |
| 437 int frame = m_rows[row]; | 432 sv_frame_t frame = m_rows[row]; |
| 438 int indexAtFrame = 0; | 433 int indexAtFrame = 0; |
| 439 int ri = row; | 434 int ri = row; |
| 440 while (ri > 0 && m_rows[ri-1] == m_rows[row]) { --ri; ++indexAtFrame; } | 435 while (ri > 0 && m_rows[ri-1] == m_rows[row]) { --ri; ++indexAtFrame; } |
| 441 int initialIndexAtFrame = indexAtFrame; | 436 int initialIndexAtFrame = indexAtFrame; |
| 442 | 437 |
| 478 m_completion(100) | 473 m_completion(100) |
| 479 { | 474 { |
| 480 } | 475 } |
| 481 | 476 |
| 482 template <typename PointType> | 477 template <typename PointType> |
| 483 int | 478 sv_frame_t |
| 484 SparseModel<PointType>::getStartFrame() const | 479 SparseModel<PointType>::getStartFrame() const |
| 485 { | 480 { |
| 486 QMutexLocker locker(&m_mutex); | 481 QMutexLocker locker(&m_mutex); |
| 487 int f = 0; | 482 sv_frame_t f = 0; |
| 488 if (!m_points.empty()) { | 483 if (!m_points.empty()) { |
| 489 f = m_points.begin()->frame; | 484 f = m_points.begin()->frame; |
| 490 } | 485 } |
| 491 return f; | 486 return f; |
| 492 } | 487 } |
| 493 | 488 |
| 494 template <typename PointType> | 489 template <typename PointType> |
| 495 int | 490 sv_frame_t |
| 496 SparseModel<PointType>::getEndFrame() const | 491 SparseModel<PointType>::getEndFrame() const |
| 497 { | 492 { |
| 498 QMutexLocker locker(&m_mutex); | 493 QMutexLocker locker(&m_mutex); |
| 499 int f = 0; | 494 sv_frame_t f = 0; |
| 500 if (!m_points.empty()) { | 495 if (!m_points.empty()) { |
| 501 PointListConstIterator i(m_points.end()); | 496 PointListConstIterator i(m_points.end()); |
| 502 f = (--i)->frame; | 497 f = (--i)->frame; |
| 503 } | 498 } |
| 504 return f; | 499 return f; |
| 539 return m_points; | 534 return m_points; |
| 540 } | 535 } |
| 541 | 536 |
| 542 template <typename PointType> | 537 template <typename PointType> |
| 543 typename SparseModel<PointType>::PointList | 538 typename SparseModel<PointType>::PointList |
| 544 SparseModel<PointType>::getPoints(long start, long end) const | 539 SparseModel<PointType>::getPoints(sv_frame_t start, sv_frame_t end) const |
| 545 { | 540 { |
| 546 if (start > end) return PointList(); | 541 if (start > end) return PointList(); |
| 547 QMutexLocker locker(&m_mutex); | 542 QMutexLocker locker(&m_mutex); |
| 548 | 543 |
| 549 PointType startPoint(start), endPoint(end); | 544 PointType startPoint(start), endPoint(end); |
| 565 return rv; | 560 return rv; |
| 566 } | 561 } |
| 567 | 562 |
| 568 template <typename PointType> | 563 template <typename PointType> |
| 569 typename SparseModel<PointType>::PointList | 564 typename SparseModel<PointType>::PointList |
| 570 SparseModel<PointType>::getPoints(long frame) const | 565 SparseModel<PointType>::getPoints(sv_frame_t frame) const |
| 571 { | 566 { |
| 572 PointListConstIterator startItr, endItr; | 567 PointListConstIterator startItr, endItr; |
| 573 getPointIterators(frame, startItr, endItr); | 568 getPointIterators(frame, startItr, endItr); |
| 574 | 569 |
| 575 PointList rv; | 570 PointList rv; |
| 581 return rv; | 576 return rv; |
| 582 } | 577 } |
| 583 | 578 |
| 584 template <typename PointType> | 579 template <typename PointType> |
| 585 void | 580 void |
| 586 SparseModel<PointType>::getPointIterators(long frame, | 581 SparseModel<PointType>::getPointIterators(sv_frame_t frame, |
| 587 PointListIterator &startItr, | 582 PointListIterator &startItr, |
| 588 PointListIterator &endItr) | 583 PointListIterator &endItr) |
| 589 { | 584 { |
| 590 QMutexLocker locker(&m_mutex); | 585 QMutexLocker locker(&m_mutex); |
| 591 | 586 |
| 593 startItr = m_points.end(); | 588 startItr = m_points.end(); |
| 594 endItr = m_points.end(); | 589 endItr = m_points.end(); |
| 595 return; | 590 return; |
| 596 } | 591 } |
| 597 | 592 |
| 598 long start = (frame / m_resolution) * m_resolution; | 593 sv_frame_t start = (frame / m_resolution) * m_resolution; |
| 599 long end = start + m_resolution; | 594 sv_frame_t end = start + m_resolution; |
| 600 | 595 |
| 601 PointType startPoint(start), endPoint(end); | 596 PointType startPoint(start), endPoint(end); |
| 602 | 597 |
| 603 startItr = m_points.lower_bound(startPoint); | 598 startItr = m_points.lower_bound(startPoint); |
| 604 endItr = m_points.upper_bound(endPoint); | 599 endItr = m_points.upper_bound(endPoint); |
| 605 } | 600 } |
| 606 | 601 |
| 607 template <typename PointType> | 602 template <typename PointType> |
| 608 void | 603 void |
| 609 SparseModel<PointType>::getPointIterators(long frame, | 604 SparseModel<PointType>::getPointIterators(sv_frame_t frame, |
| 610 PointListConstIterator &startItr, | 605 PointListConstIterator &startItr, |
| 611 PointListConstIterator &endItr) const | 606 PointListConstIterator &endItr) const |
| 612 { | 607 { |
| 613 QMutexLocker locker(&m_mutex); | 608 QMutexLocker locker(&m_mutex); |
| 614 | 609 |
| 617 startItr = m_points.end(); | 612 startItr = m_points.end(); |
| 618 endItr = m_points.end(); | 613 endItr = m_points.end(); |
| 619 return; | 614 return; |
| 620 } | 615 } |
| 621 | 616 |
| 622 long start = (frame / m_resolution) * m_resolution; | 617 sv_frame_t start = (frame / m_resolution) * m_resolution; |
| 623 long end = start + m_resolution; | 618 sv_frame_t end = start + m_resolution; |
| 624 | 619 |
| 625 PointType startPoint(start), endPoint(end); | 620 PointType startPoint(start), endPoint(end); |
| 626 | 621 |
| 627 // std::cerr << "getPointIterators: start frame " << start << ", end frame " << end << ", m_resolution " << m_resolution << std::endl; | 622 // std::cerr << "getPointIterators: start frame " << start << ", end frame " << end << ", m_resolution " << m_resolution << std::endl; |
| 628 | 623 |
| 630 endItr = m_points.upper_bound(endPoint); | 625 endItr = m_points.upper_bound(endPoint); |
| 631 } | 626 } |
| 632 | 627 |
| 633 template <typename PointType> | 628 template <typename PointType> |
| 634 typename SparseModel<PointType>::PointList | 629 typename SparseModel<PointType>::PointList |
| 635 SparseModel<PointType>::getPreviousPoints(long originFrame) const | 630 SparseModel<PointType>::getPreviousPoints(sv_frame_t originFrame) const |
| 636 { | 631 { |
| 637 QMutexLocker locker(&m_mutex); | 632 QMutexLocker locker(&m_mutex); |
| 638 | 633 |
| 639 PointType lookupPoint(originFrame); | 634 PointType lookupPoint(originFrame); |
| 640 PointList rv; | 635 PointList rv; |
| 641 | 636 |
| 642 PointListConstIterator i = m_points.lower_bound(lookupPoint); | 637 PointListConstIterator i = m_points.lower_bound(lookupPoint); |
| 643 if (i == m_points.begin()) return rv; | 638 if (i == m_points.begin()) return rv; |
| 644 | 639 |
| 645 --i; | 640 --i; |
| 646 long frame = i->frame; | 641 sv_frame_t frame = i->frame; |
| 647 while (i->frame == frame) { | 642 while (i->frame == frame) { |
| 648 rv.insert(*i); | 643 rv.insert(*i); |
| 649 if (i == m_points.begin()) break; | 644 if (i == m_points.begin()) break; |
| 650 --i; | 645 --i; |
| 651 } | 646 } |
| 653 return rv; | 648 return rv; |
| 654 } | 649 } |
| 655 | 650 |
| 656 template <typename PointType> | 651 template <typename PointType> |
| 657 typename SparseModel<PointType>::PointList | 652 typename SparseModel<PointType>::PointList |
| 658 SparseModel<PointType>::getNextPoints(long originFrame) const | 653 SparseModel<PointType>::getNextPoints(sv_frame_t originFrame) const |
| 659 { | 654 { |
| 660 QMutexLocker locker(&m_mutex); | 655 QMutexLocker locker(&m_mutex); |
| 661 | 656 |
| 662 PointType lookupPoint(originFrame); | 657 PointType lookupPoint(originFrame); |
| 663 PointList rv; | 658 PointList rv; |
| 664 | 659 |
| 665 PointListConstIterator i = m_points.upper_bound(lookupPoint); | 660 PointListConstIterator i = m_points.upper_bound(lookupPoint); |
| 666 if (i == m_points.end()) return rv; | 661 if (i == m_points.end()) return rv; |
| 667 | 662 |
| 668 long frame = i->frame; | 663 sv_frame_t frame = i->frame; |
| 669 while (i != m_points.end() && i->frame == frame) { | 664 while (i != m_points.end() && i->frame == frame) { |
| 670 rv.insert(*i); | 665 rv.insert(*i); |
| 671 ++i; | 666 ++i; |
| 672 } | 667 } |
| 673 | 668 |
