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@109: Chris@113: class ResizeableBitset { Chris@109: Chris@109: public: Chris@113: ResizeableBitset() : m_bits(0) { Chris@109: } Chris@113: ResizeableBitset(size_t size) : m_bits(new std::vector) { 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@109: void resize(size_t bits) { // losing all data Chris@109: if (!m_bits || bits < m_bits->size()) { Chris@109: delete m_bits; Chris@109: m_bits = new std::vector; Chris@109: } Chris@183: m_bits->assign((bits >> 3) + 1, 0); 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@183: ((*m_bits)[column >> 3]) |= (uint8_t(1) << (column & 0x07)); Chris@112: } Chris@112: Chris@112: void reset(size_t column) { Chris@183: ((*m_bits)[column >> 3]) &= ~(uint8_t(1) << (column & 0x07)); 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@109: Chris@109: private: Chris@109: std::vector *m_bits; Chris@109: }; Chris@109: Chris@109: Chris@109: #endif Chris@109: