view BitDecoder.cpp @ 115:404795616b1e default tip

Added a lot of common files to ignore
author Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
date Sat, 25 Mar 2017 17:43:57 +0100
parents b9515dc35fe4
children
line wrap: on
line source

#include "BitDecoder.hpp"

#include "Exception/InvalidDataException.hpp"

BitDecoder::BitDecoder(BitDecoder* low_in, BitDecoder* high_in)
  : low(low_in), high(high_in)
{
}

BitDecoder::BitDecoder(const QString& d) : low(0), high(0), _data(d)
{
}

BitDecoder::~BitDecoder()
{
  delete low;
  delete high;
}

const QString& BitDecoder::data() const
{
  return _data;
}

BitDecoder* BitDecoder::merge(BitDecoder* low, BitDecoder* high)
{
  return new BitDecoder(low, high);
}

QMap<QString, BitArray> BitDecoder::createEncoder() const
{
  QMap<QString, BitArray> retVal;
  if (!_data.isNull()) {
    retVal.insert(_data, BitArray());
  }
  if (low) {
    QMap<QString, BitArray> vals = low->createEncoder();
    for(QMap<QString, BitArray>::const_iterator it = vals.begin();
	it != vals.end(); ++it) {
      retVal.insert(it.key(), unite(BitArray(1, false), it.value()));
    }
  }
  if (high) {
    QMap<QString, BitArray> vals = high->createEncoder();
    for(QMap<QString, BitArray>::const_iterator it = vals.begin();
	it != vals.end(); ++it) {
      retVal.insert(it.key(), unite(BitArray(1, true), it.value()));
    }
  }
  return retVal;
}

BitArray BitDecoder::bitsFromString(const QString& str)
{
  BitArray bits(str.size());
  for (int i = 0; i < str.size(); ++i) {
    if (str[i] == '1')
      bits.setBit(i, true);
    else if (str[i] == '0')
      bits.setBit(i, false);
    else
      throw InvalidDataException();
  }
  return bits;
}

QString BitDecoder::decode(const QString& bits) const
{
  return decode(bitsFromString(bits));
}