/* * ArgTuples.h * */ #ifndef GC_ARGTUPLES_H_ #define GC_ARGTUPLES_H_ #include using namespace std; template class ArgIter { vector::const_iterator it; public: ArgIter(const vector::const_iterator it) : it(it) { } T operator*() { return it; } ArgIter operator++() { auto res = it; it += T::n; return res; } bool operator!=(const ArgIter& other) { return it != other.it; } }; template class ArgList { const vector& args; public: ArgList(const vector& args) : args(args) { if (args.size() % T::n != 0) throw runtime_error("wrong number of args"); } ArgIter begin() { return args.begin(); } ArgIter end() { return args.end(); } }; class InputArgs { public: static const int n = 4; int from; int& n_bits; int& n_shift; int params[2]; int dest; InputArgs(vector::const_iterator it) : n_bits(params[0]), n_shift(params[1]) { from = *it++; n_bits = *it++; n_shift = *it++; dest = *it++; } }; class InputArgList : public ArgList { public: InputArgList(const vector& args) : ArgList(args) { } int n_inputs_from(int from) { int res = 0; for (auto x : *this) res += x.from == from; return res; } int n_interactive_inputs_from_me(int my_num); }; #endif /* GC_ARGTUPLES_H_ */