Skip to content
This repository was archived by the owner on Dec 16, 2021. It is now read-only.

Commit 9a5826c

Browse files
committed
Convert to C++11 (stdint, std::function)
1 parent eb00e8a commit 9a5826c

File tree

3 files changed

+46
-44
lines changed

3 files changed

+46
-44
lines changed

fecpp.cpp

+36-36
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ namespace {
4141
* For efficiency, gf_exp[] has size 2*GF_SIZE, so that a simple
4242
* multiplication of two numbers can be resolved without calling mod
4343
*/
44-
const byte GF_EXP[510] = {
44+
const uint8_t GF_EXP[510] = {
4545
0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1D, 0x3A, 0x74,
4646
0xE8, 0xCD, 0x87, 0x13, 0x26, 0x4C, 0x98, 0x2D, 0x5A, 0xB4, 0x75,
4747
0xEA, 0xC9, 0x8F, 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x9D,
@@ -92,7 +92,7 @@ const byte GF_EXP[510] = {
9292
0xB0, 0x7D, 0xFA, 0xE9, 0xCF, 0x83, 0x1B, 0x36, 0x6C, 0xD8, 0xAD,
9393
0x47, 0x8E };
9494

95-
const byte GF_LOG[256] = {
95+
const uint8_t GF_LOG[256] = {
9696
0xFF, 0x00, 0x01, 0x19, 0x02, 0x32, 0x1A, 0xC6, 0x03, 0xDF, 0x33,
9797
0xEE, 0x1B, 0x68, 0xC7, 0x4B, 0x04, 0x64, 0xE0, 0x0E, 0x34, 0x8D,
9898
0xEF, 0x81, 0x1C, 0xC1, 0x69, 0xF8, 0xC8, 0x08, 0x4C, 0x71, 0x05,
@@ -118,7 +118,7 @@ const byte GF_LOG[256] = {
118118
0xD5, 0xE9, 0xE6, 0xE7, 0xAD, 0xE8, 0x74, 0xD6, 0xF4, 0xEA, 0xA8,
119119
0x50, 0x58, 0xAF };
120120

121-
const byte GF_INVERSE[256] = {
121+
const uint8_t GF_INVERSE[256] = {
122122
0x00, 0x01, 0x8E, 0xF4, 0x47, 0xA7, 0x7A, 0xBA, 0xAD, 0x9D, 0xDD,
123123
0x98, 0x3D, 0xAA, 0x5D, 0x96, 0xD8, 0x72, 0xC0, 0x58, 0xE0, 0x3E,
124124
0x4C, 0x66, 0x90, 0xDE, 0x55, 0x80, 0xA0, 0x83, 0x4B, 0x2A, 0x6C,
@@ -144,7 +144,7 @@ const byte GF_INVERSE[256] = {
144144
0xB5, 0xEA, 0x03, 0x8F, 0xD3, 0xC9, 0x42, 0xD4, 0xE8, 0x75, 0x7F,
145145
0xFF, 0x7E, 0xFD };
146146

147-
static byte GF_MUL_TABLE[256][256];
147+
static uint8_t GF_MUL_TABLE[256][256];
148148

149149
#if defined (FECPP_USE_SSSE3)
150150
/*
@@ -154,7 +154,7 @@ static byte GF_MUL_TABLE[256][256];
154154
* b -> y(bx^4)
155155
* and the final output is the sum of these two outputs.
156156
*/
157-
const byte GFTBL[] __attribute__((aligned(16))) = {
157+
const uint8_t GFTBL[] __attribute__((aligned(16))) = {
158158
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
159159
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
160160
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
@@ -689,12 +689,12 @@ void init_fec()
689689
/*
690690
* addmul() computes z[] = z[] + x[] * y
691691
*/
692-
void addmul(byte z[], const byte x[], byte y, size_t size)
692+
void addmul(uint8_t z[], const uint8_t x[], uint8_t y, size_t size)
693693
{
694694
if(y == 0)
695695
return;
696696

697-
const byte* GF_MUL_Y = GF_MUL_TABLE[y];
697+
const uint8_t* GF_MUL_Y = GF_MUL_TABLE[y];
698698

699699
#if defined(FECPP_USE_SSE2) || defined(FECPP_USE_SSSE3)
700700

@@ -868,14 +868,14 @@ void addmul(byte z[], const byte x[], byte y, size_t size)
868868
* invert_matrix() takes a K*K matrix and produces its inverse
869869
* (Gauss-Jordan algorithm, adapted from Numerical Recipes in C)
870870
*/
871-
void invert_matrix(byte matrix[], size_t K)
871+
void invert_matrix(uint8_t matrix[], size_t K)
872872
{
873873
class pivot_searcher
874874
{
875875
public:
876876
pivot_searcher(size_t K) : ipiv(K) {}
877877

878-
std::pair<size_t, size_t> operator()(size_t col, const byte* matrix)
878+
std::pair<size_t, size_t> operator()(size_t col, const uint8_t* matrix)
879879
{
880880
const size_t K = ipiv.size();
881881

@@ -911,7 +911,7 @@ void invert_matrix(byte matrix[], size_t K)
911911
pivot_searcher pivot_search(K);
912912
std::vector<size_t> indxc(K);
913913
std::vector<size_t> indxr(K);
914-
std::vector<byte> id_row(K);
914+
std::vector<uint8_t> id_row(K);
915915

916916
for(size_t col = 0; col != K; ++col)
917917
{
@@ -938,8 +938,8 @@ void invert_matrix(byte matrix[], size_t K)
938938

939939
indxr[col] = irow;
940940
indxc[col] = icol;
941-
byte* pivot_row = &matrix[icol*K];
942-
byte c = pivot_row[icol];
941+
uint8_t* pivot_row = &matrix[icol*K];
942+
uint8_t c = pivot_row[icol];
943943

944944
if(c == 0)
945945
throw std::invalid_argument("singlar matrix");
@@ -953,7 +953,7 @@ void invert_matrix(byte matrix[], size_t K)
953953
c = GF_INVERSE[c];
954954
pivot_row[icol] = 1;
955955

956-
const byte* mul_c = GF_MUL_TABLE[c];
956+
const uint8_t* mul_c = GF_MUL_TABLE[c];
957957

958958
for(size_t i = 0; i != K; ++i)
959959
pivot_row[i] = mul_c[pivot_row[i]];
@@ -969,7 +969,7 @@ void invert_matrix(byte matrix[], size_t K)
969969
id_row[icol] = 1;
970970
if(memcmp(pivot_row, &id_row[0], K) != 0)
971971
{
972-
byte* p = matrix;
972+
uint8_t* p = matrix;
973973

974974
for(size_t i = 0; i != K; ++i)
975975
{
@@ -1007,7 +1007,7 @@ void invert_matrix(byte matrix[], size_t K)
10071007
* p = coefficients of the matrix (p_i)
10081008
* q = values of the polynomial (known)
10091009
*/
1010-
void create_inverted_vdm(byte vdm[], size_t K)
1010+
void create_inverted_vdm(uint8_t vdm[], size_t K)
10111011
{
10121012
if(K == 1) /* degenerate case, matrix must be p^0 = 1 */
10131013
{
@@ -1019,7 +1019,7 @@ void create_inverted_vdm(byte vdm[], size_t K)
10191019
* c holds the coefficient of P(x) = Prod (x - p_i), i=0..K-1
10201020
* b holds the coefficient for the matrix inversion
10211021
*/
1022-
std::vector<byte> b(K), c(K);
1022+
std::vector<uint8_t> b(K), c(K);
10231023

10241024
/*
10251025
* construct coeffs. recursively. We know c[K] = 1 (implicit)
@@ -1030,7 +1030,7 @@ void create_inverted_vdm(byte vdm[], size_t K)
10301030
c[K-1] = 0; /* really -p(0), but x = -x in GF(2^m) */
10311031
for(size_t i = 1; i < K; ++i)
10321032
{
1033-
const byte* mul_p_i = GF_MUL_TABLE[GF_EXP[i]];
1033+
const uint8_t* mul_p_i = GF_MUL_TABLE[GF_EXP[i]];
10341034

10351035
for(size_t j = K-1 - (i - 1); j < K-1; ++j)
10361036
c[j] ^= mul_p_i[c[j+1]];
@@ -1040,17 +1040,17 @@ void create_inverted_vdm(byte vdm[], size_t K)
10401040
for(size_t row = 0; row < K; ++row)
10411041
{
10421042
// synthetic division etc.
1043-
const byte* mul_p_row = GF_MUL_TABLE[row == 0 ? 0 : GF_EXP[row]];
1043+
const uint8_t* mul_p_row = GF_MUL_TABLE[row == 0 ? 0 : GF_EXP[row]];
10441044

1045-
byte t = 1;
1045+
uint8_t t = 1;
10461046
b[K-1] = 1; /* this is in fact c[K] */
10471047
for(int i = K-2; i >= 0; i--)
10481048
{
10491049
b[i] = c[i+1] ^ mul_p_row[b[i+1]];
10501050
t = b[i] ^ mul_p_row[t];
10511051
}
10521052

1053-
const byte* mul_t_inv = GF_MUL_TABLE[GF_INVERSE[t]];
1053+
const uint8_t* mul_t_inv = GF_MUL_TABLE[GF_INVERSE[t]];
10541054
for(size_t col = 0; col != K; ++col)
10551055
vdm[col*K + row] = mul_t_inv[b[col]];
10561056
}
@@ -1075,7 +1075,7 @@ fec_code::fec_code(size_t K_arg, size_t N_arg) :
10751075
if(K == 0 || N == 0 || K > 256 || N > 256 || K > N)
10761076
throw std::invalid_argument("fec_code: violated 1 <= K <= N <= 256");
10771077

1078-
std::vector<byte> temp_matrix(N * K);
1078+
std::vector<uint8_t> temp_matrix(N * K);
10791079

10801080
/*
10811081
* quick code to build systematic matrix: invert the top
@@ -1100,9 +1100,9 @@ fec_code::fec_code(size_t K_arg, size_t N_arg) :
11001100
{
11011101
for(size_t col = 0; col != K; ++col)
11021102
{
1103-
const byte* pa = &temp_matrix[row];
1104-
const byte* pb = &temp_matrix[col];
1105-
byte acc = 0;
1103+
const uint8_t* pa = &temp_matrix[row];
1104+
const uint8_t* pb = &temp_matrix[col];
1105+
uint8_t acc = 0;
11061106
for(size_t i = 0; i < K; i++, pa++, pb += K)
11071107
acc ^= GF_MUL_TABLE[*pa][*pb];
11081108
enc_matrix[row + col] = acc;
@@ -1114,8 +1114,8 @@ fec_code::fec_code(size_t K_arg, size_t N_arg) :
11141114
* FEC encoding routine
11151115
*/
11161116
void fec_code::encode(
1117-
const byte input[], size_t size,
1118-
std::tr1::function<void (size_t, size_t, const byte[], size_t)> output)
1117+
const uint8_t input[], size_t size,
1118+
std::function<void (size_t, size_t, const uint8_t[], size_t)> output)
11191119
const
11201120
{
11211121
if(size % K != 0)
@@ -1129,7 +1129,7 @@ void fec_code::encode(
11291129

11301130
for(size_t i = K; i != N; ++i)
11311131
{
1132-
std::vector<byte> fec_buf(block_size);
1132+
std::vector<uint8_t> fec_buf(block_size);
11331133

11341134
for(size_t j = 0; j != K; ++j)
11351135
addmul(&fec_buf[0], input + j*block_size,
@@ -1142,7 +1142,7 @@ void fec_code::encode(
11421142
output(i, N, input + i*block_size, block_size);
11431143
11441144
// align??
1145-
std::vector<std::vector<byte> > fec_buf(N - K);
1145+
std::vector<std::vector<uint8_t> > fec_buf(N - K);
11461146
11471147
for(size_t i = 0; i != fec_buf.size(); ++i)
11481148
fec_buf[i].resize(block_size);
@@ -1168,9 +1168,9 @@ void fec_code::encode(
11681168
* FEC decoding routine
11691169
*/
11701170
void fec_code::decode(
1171-
const std::map<size_t, const byte*>& shares,
1171+
const std::map<size_t, const uint8_t*>& shares,
11721172
size_t share_size,
1173-
std::tr1::function<void (size_t, size_t, const byte[], size_t)> output) const
1173+
std::function<void (size_t, size_t, const uint8_t[], size_t)> output) const
11741174
{
11751175
/*
11761176
Todo:
@@ -1184,19 +1184,19 @@ void fec_code::decode(
11841184
if(shares.size() < K)
11851185
throw std::logic_error("Could not decode, less than K surviving shares");
11861186

1187-
std::vector<byte> m_dec(K * K);
1187+
std::vector<uint8_t> m_dec(K * K);
11881188
std::vector<size_t> indexes(K);
1189-
std::vector<const byte*> sharesv(K);
1189+
std::vector<const uint8_t*> sharesv(K);
11901190

1191-
std::map<size_t, const byte*>::const_iterator shares_b_iter =
1191+
std::map<size_t, const uint8_t*>::const_iterator shares_b_iter =
11921192
shares.begin();
1193-
std::map<size_t, const byte*>::const_reverse_iterator shares_e_iter =
1193+
std::map<size_t, const uint8_t*>::const_reverse_iterator shares_e_iter =
11941194
shares.rbegin();
11951195

11961196
for(size_t i = 0; i != K; ++i)
11971197
{
11981198
size_t share_id = 0;
1199-
const byte* share_data = 0;
1199+
const uint8_t* share_data = 0;
12001200

12011201
if(shares_b_iter->first == i)
12021202
{
@@ -1243,7 +1243,7 @@ void fec_code::decode(
12431243
{
12441244
if(indexes[i] >= K)
12451245
{
1246-
std::vector<byte> buf(share_size);
1246+
std::vector<uint8_t> buf(share_size);
12471247
for(size_t col = 0; col != K; ++col)
12481248
addmul(&buf[0], sharesv[col], m_dec[i*K + col], share_size);
12491249
output(i, K, &buf[0], share_size);

fecpp.h

+9-7
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,15 @@
1212

1313
#include <map>
1414
#include <vector>
15-
#include <tr1/functional>
15+
#include <functional>
16+
#include <cstdint>
1617

1718
namespace fecpp {
1819

20+
using std::uint8_t;
1921
using std::size_t;
2022

21-
typedef unsigned char byte;
23+
using byte = std::uint8_t;
2224

2325
/**
2426
* Forward error correction code
@@ -42,8 +44,8 @@ class fec_code
4244
* @param out the output callback
4345
*/
4446
void encode(
45-
const byte input[], size_t size,
46-
std::tr1::function<void (size_t, size_t, const byte[], size_t)> out)
47+
const uint8_t input[], size_t size,
48+
std::function<void (size_t, size_t, const uint8_t[], size_t)> out)
4749
const;
4850

4951
/**
@@ -52,13 +54,13 @@ class fec_code
5254
* @param out the output callback
5355
*/
5456
void decode(
55-
const std::map<size_t, const byte*>& shares, size_t share_size,
56-
std::tr1::function<void (size_t, size_t, const byte[], size_t)> out)
57+
const std::map<size_t, const uint8_t*>& shares, size_t share_size,
58+
std::function<void (size_t, size_t, const uint8_t[], size_t)> out)
5759
const;
5860

5961
private:
6062
size_t K, N;
61-
std::vector<byte> enc_matrix;
63+
std::vector<uint8_t> enc_matrix;
6264
};
6365

6466
}

license.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
(C) 1996-1998 Luigi Rizzo ([email protected])
2-
2009-2010 Jack Lloyd (lloyd@randombit.net)
2+
2009,2010,2018 Jack Lloyd (jack@randombit.net)
33
2011 Billy Brumley ([email protected])
44

55
Portions derived from code by Phil Karn ([email protected]),

0 commit comments

Comments
 (0)