blob: 852ad5363611fd50578f78a967d2a226fddb43a6 [file] [log] [blame]
#include "CRAM.hpp"
#include <cassert>
#include <stdexcept>
namespace Trellis {
char &CRAMView::bit(int frame, int bit) const {
assert(frame < frame_count);
assert(bit < bit_count);
return cram_data->at(frame_offset + frame).at(bit_offset + bit);
}
int CRAMView::frames() const { return frame_count; }
int CRAMView::bits() const { return bit_count; }
bool CRAMView::get_bit(int frame, int biti) const {
return bool(bit(frame, biti));
}
void CRAMView::set_bit(int frame, int biti, bool value) {
bit(frame, biti) = value;
}
CRAMView::CRAMView(shared_ptr<vector<vector<char>>> data, int frame_offset, int bit_offset, int frame_count,
int bit_count)
: frame_offset(frame_offset), bit_offset(bit_offset), frame_count(frame_count),
bit_count(bit_count), cram_data(data) {}
void CRAMView::clear() {
for (int i = 0; i < frame_count; i++) {
for (int j = 0; j < bit_count; j++) {
bit(i, j) = 0;
}
}
}
CRAMDelta operator-(const CRAMView &a, const CRAMView &b) {
if ((a.bits() != b.bits()) || (a.frames() != b.frames()))
throw runtime_error("cannot compare CRAMViews of different sizes");
CRAMDelta delta;
for (int i = 0; i < a.frames(); i++) {
for (int j = 0; j < b.bits(); j++) {
if (a.bit(i, j) != b.bit(i, j)) {
delta.push_back(ChangedBit{i, j, int(a.bit(i, j)) - int(b.bit(i, j))});
}
}
}
return delta;
}
CRAM::CRAM(int frames, int bits) {
data = make_shared<vector<vector<char>>>();
data->resize(frames, vector<char>(bits));
}
char &CRAM::bit(int frame, int bit) const {
return data->at(frame).at(bit);
}
bool CRAM::get_bit(int frame, int biti) const {
return bool(bit(frame, biti));
}
void CRAM::set_bit(int frame, int biti, bool value) {
bit(frame, biti) = value;
}
int CRAM::frames() const { return int(data->size()); }
int CRAM::bits() const { return int(data->at(0).size()); }
CRAMView CRAM::make_view(int frame_offset, int bit_offset, int frame_count, int bit_count) {
return CRAMView(data, frame_offset, bit_offset, frame_count, bit_count);
}
}