File indexing completed on 2024-05-12 04:01:31

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 }