/* * Secret_inline.h * */ #ifndef GC_SECRET_INLINE_H_ #define GC_SECRET_INLINE_H_ #include "BMR/config.h" #include "GC/Secret.h" #ifdef MAX_INLINE #define MAYBE_INLINE inline #else #define MAYBE_INLINE #endif namespace GC { template inline T XOR(const T& left, const T& right) { T res; XOR(res, left, right); return res; } template inline void AND(T& res, const T& left, const T& right) { #ifdef DEBUG_REGS cout << "*" << res.get_id() << " = AND(*" << left.get_id() << ",*" << right.get_id() << ")" << endl; #endif res.op(left, right, 0x0001); } template inline T AND(const T& left, const T& right) { T res; AND(res, left, right); return res; } template inline Secret GC::Secret::operator+(const Secret& x) const { Secret res; int min_n = min(registers.size(), x.registers.size()); int n = max(registers.size(), x.registers.size()); res.xor_(min_n, *this, x); if (min_n < n) { const vector* more_regs; if (registers.size() < x.registers.size()) more_regs = &x.registers; else more_regs = ®isters; res.registers.insert(res.registers.end(), more_regs->begin() + min_n, more_regs->begin() + min((size_t)n, more_regs->size())); } return res; } template void Secret::invert(int n, const Secret& x) { resize_regs(n); T one; one.public_input(1); for (int i = 0; i < n; i++) { XOR(get_reg(i), x.get_reg(i), one); } } template MAYBE_INLINE void Secret::and_(int n, const Secret& x, const Secret& y, bool repeat) { assert(n <= default_length); resize_regs(n); for (int i = 0; i < n; i++) AND(registers[i], x.get_reg(i), y.get_reg(repeat ? 0 : i)); } template inline void Secret::resize_regs(size_t n) { if (registers.size() != n) registers.resize(n); } } /* namespace GC */ #endif /* GC_SECRET_INLINE_H_ */