1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
#include <stdint.h>
#include "errvect.h"
ErrorVector::ErrorVector(int w, int s) : weight(w), size(s) {
pos = new int[weight];
for (int i=0; i < weight; i++)
pos[i] = i;
done = weight > size;
}
ErrorVector::~ErrorVector() {
if (pos)
delete [] pos;
}
bool ErrorVector::Next() {
if (done)
return false;
if (!weight) {
done = true;
return false;
}
if (pos[weight-1] != size-1) {
pos[weight-1]++;
} else {
int mobile = -1;
for (int i=weight-2; i >= 0; i--)
if (pos[i]+1 != pos[i+1]) {
mobile = i;
break;
}
if (mobile < 0) {
done = true;
return false;
}
pos[mobile]++;
for (int i=mobile+1; i < weight; i++)
pos[i] = pos[i-1]+1;
}
return true;
}
void ErrorVector::Apply(uint8_t *vector) {
for (int i=0; i < weight; i++) {
int p = pos[i];
vector[p >> 3] |= (1 << (p & 0x7));
}
}
ErrorVectorUnique::ErrorVectorUnique(int w, int s, uint8_t *v)
: ErrorVector(w,s) {
zero = new int[s];
int z=0;
for (int i=0; i < s; i++)
if (IsZero(v,i))
zero[z++] = i;
size = z;
done = weight > size;
}
ErrorVectorUnique::~ErrorVectorUnique() {
if (zero)
delete [] zero;
}
// Is the initialization vector 0 at bit-position p?
bool ErrorVectorUnique::IsZero(uint8_t *v, int p) {
return (p < size) && !(v[p >> 3] & (1 << (p & 0x7)));
}
void ErrorVectorUnique::Apply(uint8_t *vector) {
for (int i=0; i < weight; i++) {
int p = zero[pos[i]];
vector[p >> 3] |= (1 << (p & 0x7));
}
}
|