Mercurial > hg > svcore
changeset 1153:ece369c5bb68 3.0-integration
Don't need ResizeableBitset, vector<bool> is already a compact format
author | Chris Cannam |
---|---|
date | Fri, 22 Jan 2016 12:46:42 +0000 |
parents | d73b4bac2dc4 |
children | aa588c391d1a |
files | base/ResizeableBitset.h data/model/Dense3DModelPeakCache.cpp data/model/Dense3DModelPeakCache.h svcore.pro |
diffstat | 4 files changed, 11 insertions(+), 121 deletions(-) [+] |
line wrap: on
line diff
--- a/base/ResizeableBitset.h Fri Jan 22 12:46:19 2016 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,107 +0,0 @@ -/* -*- 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 _RESIZEABLE_BITMAP_H_ -#define _RESIZEABLE_BITMAP_H_ - -#include <vector> -#include <stdint.h> -#include <stddef.h> -#include <stdlib.h> - -class ResizeableBitset { - -public: - ResizeableBitset() : m_bits(0), m_size(0) { - } - ResizeableBitset(size_t size) : m_bits(new std::vector<uint8_t>), m_size(size) { - m_bits->assign((size >> 3) + 1, 0); - } - ResizeableBitset(const ResizeableBitset &b) { - m_bits = new std::vector<uint8_t>(*b.m_bits); - } - ResizeableBitset &operator=(const ResizeableBitset &b) { - if (&b != this) return *this; - delete m_bits; - m_bits = new std::vector<uint8_t>(*b.m_bits); - return *this; - } - ~ResizeableBitset() { - delete m_bits; - } - - void resize(size_t size) { // retaining existing data; not thread safe - size_t bytes = (size >> 3) + 1; - if (m_bits && bytes == m_bits->size()) return; - std::vector<uint8_t> *newbits = new std::vector<uint8_t>(bytes); - newbits->assign(bytes, 0); - if (m_bits) { - for (size_t i = 0; i < bytes && i < m_bits->size(); ++i) { - (*newbits)[i] = (*m_bits)[i]; - } - delete m_bits; - } - m_bits = newbits; - m_size = size; - } - - bool get(size_t column) const { - return ((*m_bits)[column >> 3]) & (1u << (column & 0x07)); - } - - void set(size_t column) { - size_t ix = (column >> 3); - uint8_t prior = (*m_bits)[ix]; - uint8_t extra = ((1u << (column & 0x07)) & 0xff); - (*m_bits)[ix] = uint8_t(prior | extra); - } - - void reset(size_t column) { - ((*m_bits)[column >> 3]) &= uint8_t((~(1u << (column & 0x07))) & 0xff); - } - - void copy(size_t source, size_t dest) { - get(source) ? set(dest) : reset(dest); - } - - bool isAllOff() const { - for (size_t i = 0; i < m_bits->size(); ++i) { - if ((*m_bits)[i]) return false; - } - return true; - } - - bool isAllOn() const { - for (size_t i = 0; i + 1 < m_bits->size(); ++i) { - if ((*m_bits)[i] != 0xff) return false; - } - for (size_t i = (m_size / 8) * 8; i < m_size; ++i) { - if (!get(i)) return false; - } - return true; - } - - size_t size() const { - return m_size; - } - -private: - std::vector<uint8_t> *m_bits; - size_t m_size; -}; - - -#endif -
--- a/data/model/Dense3DModelPeakCache.cpp Fri Jan 22 12:46:19 2016 +0000 +++ b/data/model/Dense3DModelPeakCache.cpp Fri Jan 22 12:46:42 2016 +0000 @@ -22,8 +22,6 @@ m_source(source), m_resolution(columnsPerPeak) { - m_coverage.resize(1); // otherwise it is simply invalid - m_cache = new EditableDenseThreeDimensionalModel (source->getSampleRate(), getResolution(), @@ -81,9 +79,9 @@ if (m_coverage.size() > 0) { // The last peak may have come from an incomplete read, which // may since have been filled, so reset it - m_coverage.reset(m_coverage.size()-1); + m_coverage[m_coverage.size()-1] = false; } - m_coverage.resize(getWidth()); // retaining data + m_coverage.resize(getWidth(), false); // retaining data } void @@ -95,7 +93,7 @@ bool Dense3DModelPeakCache::haveColumn(int column) const { - return column < (int)m_coverage.size() && m_coverage.get(column); + return in_range_for(m_coverage, column) && m_coverage[column]; } void @@ -103,26 +101,26 @@ { Profiler profiler("Dense3DModelPeakCache::fillColumn"); - if (column >= (int)m_coverage.size()) { + if (!in_range_for(m_coverage, column)) { // see note in sourceModelChanged - if (m_coverage.size() > 0) m_coverage.reset(m_coverage.size()-1); - m_coverage.resize(column + 1); + if (m_coverage.size() > 0) m_coverage[m_coverage.size()-1] = false; + m_coverage.resize(column + 1, false); } Column peak; - for (int i = 0; i < int(m_resolution); ++i) { + for (int i = 0; i < m_resolution; ++i) { Column here = m_source->getColumn(column * m_resolution + i); if (i == 0) { peak = here; } else { - for (int j = 0; j < (int)peak.size() && j < (int)here.size(); ++j) { + for (int j = 0; in_range_for(peak, j) && in_range_for(here, j); ++j) { if (here[j] > peak[j]) peak[j] = here[j]; } } } m_cache->setColumn(column, peak); - m_coverage.set(column); + m_coverage[column] = true; }
--- a/data/model/Dense3DModelPeakCache.h Fri Jan 22 12:46:19 2016 +0000 +++ b/data/model/Dense3DModelPeakCache.h Fri Jan 22 12:46:42 2016 +0000 @@ -18,7 +18,6 @@ #include "DenseThreeDimensionalModel.h" #include "EditableDenseThreeDimensionalModel.h" -#include "base/ResizeableBitset.h" class Dense3DModelPeakCache : public DenseThreeDimensionalModel { @@ -92,7 +91,8 @@ private: DenseThreeDimensionalModel *m_source; mutable EditableDenseThreeDimensionalModel *m_cache; - mutable ResizeableBitset m_coverage; + mutable std::vector<bool> m_coverage; // must be bool, for space efficiency + // (vector of bool uses 1-bit elements) int m_resolution; bool haveColumn(int column) const;