Clearmatics Libsnark  0.1
C++ library for zkSNARK proofs
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_