Chris@109: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@109: Chris@109: /* Chris@109: Sonic Visualiser Chris@109: An audio file viewer and annotation editor. Chris@109: Centre for Digital Music, Queen Mary, University of London. Chris@109: This file copyright 2006 Chris Cannam. Chris@109: Chris@109: This program is free software; you can redistribute it and/or Chris@109: modify it under the terms of the GNU General Public License as Chris@109: published by the Free Software Foundation; either version 2 of the Chris@109: License, or (at your option) any later version. See the file Chris@109: COPYING included with this distribution for more information. Chris@109: */ Chris@109: Chris@109: #ifndef _RESIZEABLE_BITMAP_H_ Chris@109: #define _RESIZEABLE_BITMAP_H_ Chris@109: Chris@109: #include Chris@109: #include Chris@693: #include Chris@698: #include Chris@109: Chris@113: class ResizeableBitset { Chris@109: Chris@109: public: Chris@958: ResizeableBitset() : m_bits(0), m_size(0) { Chris@109: } Chris@546: ResizeableBitset(size_t size) : m_bits(new std::vector), m_size(size) { Chris@183: m_bits->assign((size >> 3) + 1, 0); Chris@109: } Chris@113: ResizeableBitset(const ResizeableBitset &b) { Chris@109: m_bits = new std::vector(*b.m_bits); Chris@109: } Chris@113: ResizeableBitset &operator=(const ResizeableBitset &b) { Chris@109: if (&b != this) return *this; Chris@109: delete m_bits; Chris@109: m_bits = new std::vector(*b.m_bits); Chris@109: return *this; Chris@109: } Chris@113: ~ResizeableBitset() { Chris@109: delete m_bits; Chris@109: } Chris@109: Chris@548: void resize(size_t size) { // retaining existing data; not thread safe Chris@548: size_t bytes = (size >> 3) + 1; Chris@548: if (m_bits && bytes == m_bits->size()) return; Chris@548: std::vector *newbits = new std::vector(bytes); Chris@548: newbits->assign(bytes, 0); Chris@548: if (m_bits) { Chris@548: for (size_t i = 0; i < bytes && i < m_bits->size(); ++i) { Chris@548: (*newbits)[i] = (*m_bits)[i]; Chris@548: } Chris@109: delete m_bits; Chris@109: } Chris@548: m_bits = newbits; Chris@548: m_size = size; Chris@109: } Chris@109: Chris@109: bool get(size_t column) const { Chris@183: return ((*m_bits)[column >> 3]) & (1u << (column & 0x07)); Chris@109: } Chris@109: Chris@112: void set(size_t column) { Chris@1038: ((*m_bits)[column >> 3]) |= uint8_t((1u << (column & 0x07)) & 0xff); Chris@112: } Chris@112: Chris@112: void reset(size_t column) { Chris@1038: ((*m_bits)[column >> 3]) &= uint8_t((~(1u << (column & 0x07))) & 0xff); Chris@112: } Chris@112: Chris@112: void copy(size_t source, size_t dest) { Chris@112: get(source) ? set(dest) : reset(dest); Chris@109: } Chris@546: Chris@550: bool isAllOff() const { Chris@550: for (size_t i = 0; i < m_bits->size(); ++i) { Chris@550: if ((*m_bits)[i]) return false; Chris@550: } Chris@550: return true; Chris@550: } Chris@550: Chris@550: bool isAllOn() const { Chris@550: for (size_t i = 0; i + 1 < m_bits->size(); ++i) { Chris@550: if ((*m_bits)[i] != 0xff) return false; Chris@550: } Chris@550: for (size_t i = (m_size / 8) * 8; i < m_size; ++i) { Chris@550: if (!get(i)) return false; Chris@550: } Chris@550: return true; Chris@550: } Chris@550: Chris@546: size_t size() const { Chris@546: return m_size; Chris@546: } Chris@109: Chris@109: private: Chris@109: std::vector *m_bits; Chris@546: size_t m_size; Chris@109: }; Chris@109: Chris@109: Chris@109: #endif Chris@109: