-
Notifications
You must be signed in to change notification settings - Fork 0
/
Row.h
130 lines (96 loc) · 2.66 KB
/
Row.h
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#ifndef OT_ROW_H_
#define OT_ROW_H_
#include "Math/Z2k.h"
#include "Math/gf2nlong.h"
#define VOLE_HASH_SIZE crypto_generichash_BYTES
template <class T, class U> class DeferredMinus;
template <class T, class U> class DeferredPlus;
template <class T>
class Row
{
public:
vector<T> rows;
Row(int size) : rows(size) {}
Row() : rows() {}
Row(const vector<T>& _rows) : rows(_rows) {}
template<class U>
Row(DeferredMinus<T, U> d) { *this = d; }
template<class U>
Row(DeferredPlus<T, U> d) { *this = d; }
bool operator==(const Row<T>& other) const;
bool operator!=(const Row<T>& other) const { return not (*this == other); }
Row<T>& operator+=(const Row<T>& other);
Row<T>& operator-=(const Row<T>& other);
Row<T>& operator*=(const T& other);
Row<T> operator*(const T& other);
DeferredPlus<T, Row<T>> operator+(const Row<T> & other);
DeferredMinus<T, Row<T>> operator-(const Row<T>& other);
template<class U>
Row<T>& operator=(const DeferredMinus<T, U>& d);
template<class U>
Row<T>& operator=(const DeferredPlus<T, U>& d);
Row<T> operator<<(int i) const;
// fine, since elements in vector are allocated contiguously
const void* get_ptr() const { return rows[0].get_ptr(); }
void randomize(PRNG& G, size_t size);
void pack(octetStream& o) const;
void unpack(octetStream& o);
size_t size() const { return rows.size(); }
const T& operator[](size_t i) const { return rows[i]; }
template <class V>
friend ostream& operator<<(ostream& o, const Row<V>& x);
};
template <int K>
using Z2kRow = Row<Z2<K>>;
template <class T, class U>
class DeferredMinus
{
public:
const U& x;
const Row<T>& y;
DeferredMinus(const U& x, const Row<T>& y) : x(x), y(y)
{
assert(x.size() == y.size());
}
size_t size() const
{
return x.size();
}
T operator[](size_t i) const
{
return x[i] - y[i];
}
DeferredPlus<T, DeferredMinus> operator+(const Row<T>& other)
{
return {*this, other};
}
DeferredMinus<T, DeferredMinus> operator-(const Row<T>& other)
{
return {*this, other};
}
};
template <class T, class U>
class DeferredPlus
{
public:
const U& x;
const Row<T>& y;
DeferredPlus(const U& x, const Row<T>& y) : x(x), y(y)
{
assert(x.size() == y.size());
}
size_t size() const
{
return x.size();
}
T operator[](size_t i) const
{
return x[i] + y[i];
}
DeferredPlus<T, DeferredPlus> operator+(const Row<T>& other)
{
return {*this, other};
}
void pack(octetStream& o) const;
};
#endif /* OT_ROW_H_ */