annotate base/ResizeableBitset.h @ 1061:c1e43c8d2527 tonioni

Thread-local debug was causing crash on exit with Qt 5.4.x. But we introduced that because QDebug itself was crashing when used from multiple threads. Replace with simpler fstream version
author Chris Cannam
date Tue, 31 Mar 2015 10:36:52 +0100
parents cc27f35aa75c
children 106081811ccd
rev   line source
Chris@109 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@109 2
Chris@109 3 /*
Chris@109 4 Sonic Visualiser
Chris@109 5 An audio file viewer and annotation editor.
Chris@109 6 Centre for Digital Music, Queen Mary, University of London.
Chris@109 7 This file copyright 2006 Chris Cannam.
Chris@109 8
Chris@109 9 This program is free software; you can redistribute it and/or
Chris@109 10 modify it under the terms of the GNU General Public License as
Chris@109 11 published by the Free Software Foundation; either version 2 of the
Chris@109 12 License, or (at your option) any later version. See the file
Chris@109 13 COPYING included with this distribution for more information.
Chris@109 14 */
Chris@109 15
Chris@109 16 #ifndef _RESIZEABLE_BITMAP_H_
Chris@109 17 #define _RESIZEABLE_BITMAP_H_
Chris@109 18
Chris@109 19 #include <vector>
Chris@109 20 #include <stdint.h>
Chris@693 21 #include <stddef.h>
Chris@698 22 #include <stdlib.h>
Chris@109 23
Chris@113 24 class ResizeableBitset {
Chris@109 25
Chris@109 26 public:
Chris@958 27 ResizeableBitset() : m_bits(0), m_size(0) {
Chris@109 28 }
Chris@546 29 ResizeableBitset(size_t size) : m_bits(new std::vector<uint8_t>), m_size(size) {
Chris@183 30 m_bits->assign((size >> 3) + 1, 0);
Chris@109 31 }
Chris@113 32 ResizeableBitset(const ResizeableBitset &b) {
Chris@109 33 m_bits = new std::vector<uint8_t>(*b.m_bits);
Chris@109 34 }
Chris@113 35 ResizeableBitset &operator=(const ResizeableBitset &b) {
Chris@109 36 if (&b != this) return *this;
Chris@109 37 delete m_bits;
Chris@109 38 m_bits = new std::vector<uint8_t>(*b.m_bits);
Chris@109 39 return *this;
Chris@109 40 }
Chris@113 41 ~ResizeableBitset() {
Chris@109 42 delete m_bits;
Chris@109 43 }
Chris@109 44
Chris@548 45 void resize(size_t size) { // retaining existing data; not thread safe
Chris@548 46 size_t bytes = (size >> 3) + 1;
Chris@548 47 if (m_bits && bytes == m_bits->size()) return;
Chris@548 48 std::vector<uint8_t> *newbits = new std::vector<uint8_t>(bytes);
Chris@548 49 newbits->assign(bytes, 0);
Chris@548 50 if (m_bits) {
Chris@548 51 for (size_t i = 0; i < bytes && i < m_bits->size(); ++i) {
Chris@548 52 (*newbits)[i] = (*m_bits)[i];
Chris@548 53 }
Chris@109 54 delete m_bits;
Chris@109 55 }
Chris@548 56 m_bits = newbits;
Chris@548 57 m_size = size;
Chris@109 58 }
Chris@109 59
Chris@109 60 bool get(size_t column) const {
Chris@183 61 return ((*m_bits)[column >> 3]) & (1u << (column & 0x07));
Chris@109 62 }
Chris@109 63
Chris@112 64 void set(size_t column) {
Chris@1038 65 ((*m_bits)[column >> 3]) |= uint8_t((1u << (column & 0x07)) & 0xff);
Chris@112 66 }
Chris@112 67
Chris@112 68 void reset(size_t column) {
Chris@1038 69 ((*m_bits)[column >> 3]) &= uint8_t((~(1u << (column & 0x07))) & 0xff);
Chris@112 70 }
Chris@112 71
Chris@112 72 void copy(size_t source, size_t dest) {
Chris@112 73 get(source) ? set(dest) : reset(dest);
Chris@109 74 }
Chris@546 75
Chris@550 76 bool isAllOff() const {
Chris@550 77 for (size_t i = 0; i < m_bits->size(); ++i) {
Chris@550 78 if ((*m_bits)[i]) return false;
Chris@550 79 }
Chris@550 80 return true;
Chris@550 81 }
Chris@550 82
Chris@550 83 bool isAllOn() const {
Chris@550 84 for (size_t i = 0; i + 1 < m_bits->size(); ++i) {
Chris@550 85 if ((*m_bits)[i] != 0xff) return false;
Chris@550 86 }
Chris@550 87 for (size_t i = (m_size / 8) * 8; i < m_size; ++i) {
Chris@550 88 if (!get(i)) return false;
Chris@550 89 }
Chris@550 90 return true;
Chris@550 91 }
Chris@550 92
Chris@546 93 size_t size() const {
Chris@546 94 return m_size;
Chris@546 95 }
Chris@109 96
Chris@109 97 private:
Chris@109 98 std::vector<uint8_t> *m_bits;
Chris@546 99 size_t m_size;
Chris@109 100 };
Chris@109 101
Chris@109 102
Chris@109 103 #endif
Chris@109 104