File indexing completed on 2024-05-12 15:49:08
0001 /* 0002 SPDX-FileCopyrightText: 2017 Volker Krause <vkrause@kde.org> 0003 0004 SPDX-License-Identifier: MIT 0005 */ 0006 0007 #include "bitvector_p.h" 0008 0009 using namespace Prison; 0010 0011 BitVector::BitVector() = default; 0012 BitVector::~BitVector() = default; 0013 0014 void BitVector::appendLSB(int data, int bits) 0015 { 0016 for (int i = 0; i < bits; ++i) { 0017 appendBit(data & (1 << i)); 0018 } 0019 } 0020 0021 void BitVector::appendMSB(int data, int bits) 0022 { 0023 for (int i = bits - 1; i >= 0; --i) { 0024 appendBit(data & (1 << i)); 0025 } 0026 } 0027 0028 void BitVector::appendBit(bool bit) 0029 { 0030 const auto subIdx = m_size % 8; 0031 if (subIdx == 0) { 0032 m_data.append('\0'); 0033 } 0034 if (bit) { 0035 m_data.data()[m_data.size() - 1] |= (1 << subIdx); 0036 } 0037 ++m_size; 0038 } 0039 0040 void BitVector::append(const BitVector &other) 0041 { 0042 for (int i = 0; i < other.size(); ++i) { 0043 appendBit(other.at(i)); 0044 } 0045 } 0046 0047 bool BitVector::at(int index) const 0048 { 0049 const auto majIdx = index / 8; 0050 const auto minIdx = index % 8; 0051 return (m_data.at(majIdx) & (1 << minIdx)) >> minIdx; 0052 } 0053 0054 void BitVector::clear() 0055 { 0056 m_data.clear(); 0057 m_size = 0; 0058 } 0059 0060 void BitVector::reserve(int size) 0061 { 0062 m_data.reserve((size / 8) + 1); 0063 } 0064 0065 int BitVector::size() const 0066 { 0067 return m_size; 0068 } 0069 0070 int BitVector::valueAtMSB(int index, int size) const 0071 { 0072 int res = 0; 0073 for (int i = 0; i < size; ++i) { 0074 res = res << 1; 0075 res |= (at(index + i) ? 1 : 0); 0076 } 0077 return res; 0078 } 0079 0080 BitVector::iterator BitVector::begin() const 0081 { 0082 iterator it; 0083 it.m_index = 0; 0084 it.m_vector = this; 0085 return it; 0086 } 0087 0088 BitVector::iterator BitVector::end() const 0089 { 0090 iterator it; 0091 it.m_index = m_size; 0092 it.m_vector = this; 0093 return it; 0094 } 0095 0096 bool BitVector::operator==(const BitVector &other) const 0097 { 0098 return m_size == other.m_size && m_data == other.m_data; 0099 } 0100 0101 bool BitVector::operator!=(const Prison::BitVector &other) const 0102 { 0103 return m_size != other.m_size || m_data != other.m_data; 0104 } 0105 0106 QDebug operator<<(QDebug dbg, const Prison::BitVector &v) 0107 { 0108 dbg << v.m_data.toHex(); 0109 return dbg; 0110 }