Clearmatics Libsnark
0.1
C++ library for zkSNARK proofs
libsnark
gadgetlib2
gadgetMacros.hpp
Go to the documentation of this file.
1
11
#ifndef LIBSNARK_GADGETLIB2_INCLUDE_GADGETLIB2_GADGETMACROS_HPP_
12
#define LIBSNARK_GADGETLIB2_INCLUDE_GADGETLIB2_GADGETMACROS_HPP_
13
14
// The macro below counts the number of arguments sent with __VA_ARGS__
15
// it has not been tested yet. Due to a current MSVC bug it is not in use yet.
16
18
// * passed to it.
19
// */
20
21
/*
22
//#define PP_NARG(...) \
23
// PP_NARG_(__VA_ARGS__,PP_RSEQ_N())
24
//#define PP_NARG_(...) \
25
// PP_ARG_N(__VA_ARGS__)
26
//#define PP_ARG_N( \
27
// _1, _2, _3, _4, _5, _6, _7, _8, _9,_10, \
28
// _11,_12,_13,_14,_15,_16,_17,_18,_19,_20, \
29
// _21,_22,_23,_24,_25,_26,_27,_28,_29,_30, \
30
// _31,_32,_33,_34,_35,_36,_37,_38,_39,_40, \
31
// _41,_42,_43,_44,_45,_46,_47,_48,_49,_50, \
32
// _51,_52,_53,_54,_55,_56,_57,_58,_59,_60, \
33
// _61,_62,_63,N,...) N
34
//#define PP_RSEQ_N() \
35
// 63,62,61,60, \
36
// 59,58,57,56,55,54,53,52,51,50, \
37
// 49,48,47,46,45,44,43,42,41,40, \
38
// 39,38,37,36,35,34,33,32,31,30, \
39
// 29,28,27,26,25,24,23,22,21,20, \
40
// 19,18,17,16,15,14,13,12,11,10, \
41
// 9,8,7,6,5,4,3,2,1,0
42
*/
43
51
#define CREATE_GADGET_BASE_CLASS(GadgetBase) \
52
class GadgetBase : virtual public Gadget \
53
{ \
54
protected: \
55
GadgetBase(ProtoboardPtr pb) : Gadget(pb) {} \
56
\
57
public: \
58
virtual ~GadgetBase() = 0; \
59
\
60
private: \
61
virtual void init() = 0; \
62
DISALLOW_COPY_AND_ASSIGN(GadgetBase); \
63
}; // class GadgetBase
64
73
#define ADD_ELLIPSES_1(Type1, name1) const Type1 &name1
74
75
#define ADD_ELLIPSES_2(Type1, name1, Type2, name2) \
76
const Type1 &name1, const Type2 &name2
77
78
#define ADD_ELLIPSES_3(Type1, name1, Type2, name2, Type3, name3) \
79
const Type1 &name1, const Type2 &name2, const Type3 &name3
80
81
#define ADD_ELLIPSES_4(Type1, name1, Type2, name2, Type3, name3, Type4, name4) \
82
const Type1 &name1, const Type2 &name2, const Type3 &name3, \
83
const Type4 &name4
84
85
#define ADD_ELLIPSES_5( \
86
Type1, name1, Type2, name2, Type3, name3, Type4, name4, Type5, name5) \
87
const Type1 &name1, const Type2 &name2, const Type3 &name3, \
88
const Type4 &name4, const Type5 &name5
89
90
#define ADD_ELLIPSES_7( \
91
Type1, \
92
name1, \
93
Type2, \
94
name2, \
95
Type3, \
96
name3, \
97
Type4, \
98
name4, \
99
Type5, \
100
name5, \
101
Type6, \
102
name6, \
103
Type7, \
104
name7, \
105
Type8, \
106
name8, \
107
Type9, \
108
name9) \
109
const Type1 &name1, const Type2 &name2, const Type3 &name3, \
110
const Type4 &name4, const Type5 &name5, const Type6 &name6, \
111
const Type7 &name7
112
113
#define ADD_ELLIPSES_8( \
114
Type1, \
115
name1, \
116
Type2, \
117
name2, \
118
Type3, \
119
name3, \
120
Type4, \
121
name4, \
122
Type5, \
123
name5, \
124
Type6, \
125
name6, \
126
Type7, \
127
name7, \
128
Type8, \
129
name8) \
130
const Type1 &name1, const Type2 &name2, const Type3 &name3, \
131
const Type4 &name4, const Type5 &name5, const Type6 &name6, \
132
const Type7 &name7, const Type8 &name8
133
134
#define ADD_ELLIPSES_9( \
135
Type1, \
136
name1, \
137
Type2, \
138
name2, \
139
Type3, \
140
name3, \
141
Type4, \
142
name4, \
143
Type5, \
144
name5, \
145
Type6, \
146
name6, \
147
Type7, \
148
name7, \
149
Type8, \
150
name8, \
151
Type9, \
152
name9) \
153
const Type1 &name1, const Type2 &name2, const Type3 &name3, \
154
const Type4 &name4, const Type5 &name5, const Type6 &name6, \
155
const Type7 &name7, const Type8 &name8, const Type9 &name9
156
157
/*
158
This was supposed to be a variadic macro CREATE_GADGET_FACTORY_CLASS(...)
159
which invokes the correct number of arguments. Due to an MSVC bug and lack of
160
time it will currently be copied with different names. Hopefully some day I
161
will have time to find a workaround / use Boost preprocessor instead. The
162
MSVC bug (feature...) is that __VA_ARGS__ passes to sub macros as 1 argument,
163
so defining the following:
164
#define CREATE_GADGET_FACTORY_CLASS(__VA_ARGS__) \
165
CREATE_GADGET_FACTORY_CLASS_ ## PP_NARG(__VA_ARGS__)(__VA_ARGS__)
166
will always create CREATE_GADGET_FACTORY_CLASS_1(__VA_ARGS__)
167
Moreover, this macro considers __VA_ARGS__ to be only 1 argument!
168
*/
169
#define CREATE_GADGET_FACTORY_CLASS_1(GadgetType, Type1, name1) \
170
class GadgetType \
171
{ \
172
public: \
173
static GadgetPtr create( \
174
ProtoboardPtr pb, ADD_ELLIPSES_1(Type1, name1)) \
175
{ \
176
GadgetPtr pGadget; \
177
if (pb->fieldType_ == R1P) { \
178
pGadget.reset(new R1P_##GadgetType(pb, name1)); \
179
} else { \
180
GADGETLIB_FATAL("Attempted to create gadget of undefined " \
181
"Protoboard type."); \
182
} \
183
pGadget->init(); \
184
return pGadget; \
185
} \
186
\
187
private: \
188
DISALLOW_CONSTRUCTION(GadgetType); \
189
DISALLOW_COPY_AND_ASSIGN(GadgetType); \
190
}; // class GadgetType
191
192
#define CREATE_GADGET_FACTORY_CLASS_2(GadgetType, Type1, name1, Type2, name2) \
193
class GadgetType \
194
{ \
195
public: \
196
static GadgetPtr create( \
197
ProtoboardPtr pb, ADD_ELLIPSES_2(Type1, name1, Type2, name2)) \
198
{ \
199
GadgetPtr pGadget; \
200
if (pb->fieldType_ == R1P) { \
201
pGadget.reset(new R1P_##GadgetType(pb, name1, name2)); \
202
} else { \
203
GADGETLIB_FATAL("Attempted to create gadget of undefined " \
204
"Protoboard type."); \
205
} \
206
pGadget->init(); \
207
return pGadget; \
208
} \
209
\
210
private: \
211
DISALLOW_CONSTRUCTION(GadgetType); \
212
DISALLOW_COPY_AND_ASSIGN(GadgetType); \
213
}; // class GadgetType
214
215
#define CREATE_GADGET_FACTORY_CLASS_3( \
216
GadgetType, Type1, name1, Type2, name2, Type3, name3) \
217
class GadgetType \
218
{ \
219
public: \
220
static GadgetPtr create( \
221
ProtoboardPtr pb, \
222
ADD_ELLIPSES_3(Type1, name1, Type2, name2, Type3, name3)) \
223
{ \
224
GadgetPtr pGadget; \
225
if (pb->fieldType_ == R1P) { \
226
pGadget.reset(new R1P_##GadgetType(pb, name1, name2, name3)); \
227
} else { \
228
GADGETLIB_FATAL("Attempted to create gadget of undefined " \
229
"Protoboard type."); \
230
} \
231
pGadget->init(); \
232
return pGadget; \
233
} \
234
\
235
private: \
236
DISALLOW_CONSTRUCTION(GadgetType); \
237
DISALLOW_COPY_AND_ASSIGN(GadgetType); \
238
}; // class GadgetType
239
240
#define CREATE_GADGET_FACTORY_CLASS_4( \
241
GadgetType, Type1, name1, Type2, name2, Type3, name3, Type4, name4) \
242
class GadgetType \
243
{ \
244
public: \
245
static GadgetPtr create( \
246
ProtoboardPtr pb, \
247
ADD_ELLIPSES_4( \
248
Type1, name1, Type2, name2, Type3, name3, Type4, name4)) \
249
{ \
250
GadgetPtr pGadget; \
251
if (pb->fieldType_ == R1P) { \
252
pGadget.reset( \
253
new R1P_##GadgetType(pb, name1, name2, name3, name4)); \
254
} else { \
255
GADGETLIB_FATAL("Attempted to create gadget of undefined " \
256
"Protoboard type."); \
257
} \
258
pGadget->init(); \
259
return pGadget; \
260
} \
261
\
262
private: \
263
DISALLOW_CONSTRUCTION(GadgetType); \
264
DISALLOW_COPY_AND_ASSIGN(GadgetType); \
265
}; // class GadgetType
266
267
#define CREATE_GADGET_FACTORY_CLASS_5( \
268
GadgetType, \
269
Type1, \
270
name1, \
271
Type2, \
272
name2, \
273
Type3, \
274
name3, \
275
Type4, \
276
name4, \
277
Type5, \
278
name5) \
279
class GadgetType \
280
{ \
281
public: \
282
static GadgetPtr create( \
283
ProtoboardPtr pb, \
284
ADD_ELLIPSES_5( \
285
Type1, \
286
name1, \
287
Type2, \
288
name2, \
289
Type3, \
290
name3, \
291
Type4, \
292
name4, \
293
Type5, \
294
name5)) \
295
{ \
296
GadgetPtr pGadget; \
297
if (pb->fieldType_ == R1P) { \
298
pGadget.reset(new R1P_##GadgetType( \
299
pb, name1, name2, name3, name4, name5)); \
300
} else { \
301
GADGETLIB_FATAL("Attempted to create gadget of undefined " \
302
"Protoboard type."); \
303
} \
304
pGadget->init(); \
305
return pGadget; \
306
} \
307
\
308
private: \
309
DISALLOW_CONSTRUCTION(GadgetType); \
310
DISALLOW_COPY_AND_ASSIGN(GadgetType); \
311
}; // class GadgetType
312
313
#define CREATE_GADGET_FACTORY_CLASS_7( \
314
GadgetType, \
315
Type1, \
316
name1, \
317
Type2, \
318
name2, \
319
Type3, \
320
name3, \
321
Type4, \
322
name4, \
323
Type5, \
324
name5, \
325
Type6, \
326
name6, \
327
Type7, \
328
name7) \
329
class GadgetType \
330
{ \
331
public: \
332
static GadgetPtr create( \
333
ProtoboardPtr pb, \
334
ADD_ELLIPSES_7( \
335
Type1, \
336
name1, \
337
Type2, \
338
name2, \
339
Type3, \
340
name3, \
341
Type4, \
342
name4, \
343
Type5, \
344
name5, \
345
Type6, \
346
name6, \
347
Type7, \
348
name7)) \
349
{ \
350
GadgetPtr pGadget; \
351
if (pb->fieldType_ == R1P) { \
352
pGadget.reset(new R1P_##GadgetType( \
353
pb, name1, name2, name3, name4, name5, name6, name7)); \
354
} else { \
355
GADGETLIB_FATAL("Attempted to create gadget of undefined " \
356
"Protoboard type."); \
357
} \
358
pGadget->init(); \
359
return pGadget; \
360
} \
361
\
362
private: \
363
DISALLOW_CONSTRUCTION(GadgetType); \
364
DISALLOW_COPY_AND_ASSIGN(GadgetType); \
365
}; // class GadgetType
366
367
#define CREATE_GADGET_FACTORY_CLASS_8( \
368
GadgetType, \
369
Type1, \
370
name1, \
371
Type2, \
372
name2, \
373
Type3, \
374
name3, \
375
Type4, \
376
name4, \
377
Type5, \
378
name5, \
379
Type6, \
380
name6, \
381
Type7, \
382
name7, \
383
Type8, \
384
name8) \
385
class GadgetType \
386
{ \
387
public: \
388
static GadgetPtr create( \
389
ProtoboardPtr pb, \
390
ADD_ELLIPSES_8( \
391
Type1, \
392
name1, \
393
Type2, \
394
name2, \
395
Type3, \
396
name3, \
397
Type4, \
398
name4, \
399
Type5, \
400
name5, \
401
Type6, \
402
name6, \
403
Type7, \
404
name7, \
405
Type8, \
406
name8)) \
407
{ \
408
GadgetPtr pGadget; \
409
if (pb->fieldType_ == R1P) { \
410
pGadget.reset(new R1P_##GadgetType( \
411
pb, \
412
name1, \
413
name2, \
414
name3, \
415
name4, \
416
name5, \
417
name6, \
418
name7, \
419
name8)); \
420
} else { \
421
GADGETLIB_FATAL("Attempted to create gadget of undefined " \
422
"Protoboard type."); \
423
} \
424
pGadget->init(); \
425
return pGadget; \
426
} \
427
\
428
private: \
429
DISALLOW_CONSTRUCTION(GadgetType); \
430
DISALLOW_COPY_AND_ASSIGN(GadgetType); \
431
}; // class GadgetType
432
433
#define CREATE_GADGET_FACTORY_CLASS_9( \
434
GadgetType, \
435
Type1, \
436
name1, \
437
Type2, \
438
name2, \
439
Type3, \
440
name3, \
441
Type4, \
442
name4, \
443
Type5, \
444
name5, \
445
Type6, \
446
name6, \
447
Type7, \
448
name7, \
449
Type8, \
450
name8, \
451
Type9, \
452
name9) \
453
class GadgetType \
454
{ \
455
public: \
456
static GadgetPtr create( \
457
ProtoboardPtr pb, \
458
ADD_ELLIPSES_9( \
459
Type1, \
460
name1, \
461
Type2, \
462
name2, \
463
Type3, \
464
name3, \
465
Type4, \
466
name4, \
467
Type5, \
468
name5, \
469
Type6, \
470
name6, \
471
Type7, \
472
name7, \
473
Type8, \
474
name8, \
475
Type9, \
476
name9)) \
477
{ \
478
GadgetPtr pGadget; \
479
if (pb->fieldType_ == R1P) { \
480
pGadget.reset(new R1P_##GadgetType( \
481
pb, \
482
name1, \
483
name2, \
484
name3, \
485
name4, \
486
name5, \
487
name6, \
488
name7, \
489
name8, \
490
name9)); \
491
} else { \
492
GADGETLIB_FATAL("Attempted to create gadget of undefined " \
493
"Protoboard type."); \
494
} \
495
pGadget->init(); \
496
return pGadget; \
497
} \
498
\
499
private: \
500
DISALLOW_CONSTRUCTION(GadgetType); \
501
DISALLOW_COPY_AND_ASSIGN(GadgetType); \
502
}; // class GadgetType
503
504
#endif // LIBSNARK_GADGETLIB2_INCLUDE_GADGETLIB2_GADGETMACROS_HPP_
Generated on Wed Jan 25 2023 11:05:58 for Clearmatics Libsnark by
1.8.17