Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Jun 14th, 2012  |  syntax: None  |  size: 2.85 KB  |  hits: 18  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. Iterating Variadic Macro Arguments
  2. SET_STATE(FunctorA,a,b);
  3.  
  4. ref a;
  5. ref b;
  6. FunctorA(ref a, ref b){
  7.    this->a = a;
  8.    this->b = b;
  9. }
  10.        
  11. #define VA_NARGS_IMPL(_1,_2,_3,_4,_5,_6,_7,_8,N,...) N
  12. #define VA_NARGS(...) VA_NARGS_IMPL(__VA_ARGS__, 8, 7, 6, 5, 4, 3, 2, 1)
  13. #define SET_STATEGENERATE(name, count, ...)            
  14.         dec ## count (__VA_ARGS__)                      
  15.         name(ref ## count (__VA_ARGS__)) {              
  16.             con ## count (__VA_ARGS__)                  
  17.         }
  18. #define SET_STATEP(name, count, ...) SET_STATEGENERATE(name, count, __VA_ARGS__)
  19. #define SET_STATE(name, ...) SET_STATEP(name, VA_NARGS(__VA_ARGS__), __VA_ARGS__)
  20. /* args */
  21. #define dec1(a) ref a;
  22. #define dec2(a,b) dec1(a) ref b;
  23. #define dec3(a,b,c) dec2(a, b) ref c;
  24. #define dec4(a,b,c,d) dec3(a,b,c) ref d;
  25. #define dec5(a,b,c,d,e) dec4(a,b,c,d) ref e;
  26. #define dec6(a,b,c,d,e,f) dec5(a,b,c,d,e) ref f;
  27. #define dec7(a,b,c,d,e,f,g) dec6(a,b,c,d,e,f)ref g;
  28. #define dec8(a,b,c,d,e,f,g,h) dec7(a,b,c,d,e,f,g) ref h;
  29. #define ref1(a) ref a
  30. #define ref2(a,b) ref1(a), ref b
  31. #define ref3(a,b,c) ref2(a,b), ref c
  32. #define ref4(a,b,c,d) ref3(a,b,c), ref d
  33. #define ref5(a,b,c,d,e) ref4(a,b,c,d), ref e
  34. #define ref6(a,b,c,d,e,f) ref5(a,b,c,d,e), ref f
  35. #define ref7(a,b,c,d,e,f,g) ref6(a,b,c,d,e,f), ref g
  36. #define ref8(a,b,c,d,e,f,g, h) ref7(a,b,c,d,e,f,g), ref h
  37. #define con1(a) this->a = a;
  38. #define con2(a,b) con1(a) this->b = b;
  39. #define con3(a,b,c) con2(a,b) this->c = c;
  40. #define con4(a,b,c,d) con3(a,b,c) this->d = d;
  41. #define con5(a,b,c,d,e) con4(a,b,c,d) this->e = e;
  42. #define con6(a,b,c,d,e,f) con5(a,b,c,d,e) this->f = f;
  43. #define con7(a,b,c,d,e,f,g) con6(a,b,c,d,e,f) this->g = g;
  44. #define con8(a,b,c,d,e,f,g,h) con7(a,b,c,d,e,f,g) this->h = h;
  45.        
  46. /* 2 args */
  47. SET_STATE(FunctorAA, foo, bar)
  48. /* 3 args */
  49. SET_STATE(FunctorBB, foo, bar, baz)
  50. /* 4 args */    
  51. SET_STATE(FunctorCC, foo, bar, baz, qux)
  52.        
  53. ref foo; ref bar; FunctorAA(ref foo, ref bar) { this->foo = foo; this->bar = bar; }
  54. ref foo; ref bar; ref baz; FunctorBB(ref foo, ref bar, ref baz) { this->foo = foo; this->bar = bar; this->baz = baz; }
  55. ref foo; ref bar; ref baz; ref qux; FunctorCC(ref foo, ref bar, ref baz, ref qux) { this->foo = foo; this->bar = bar; this->baz = baz; this->qux = qux; }
  56.        
  57. #include <boost/preprocessor/seq/for_each.hpp>
  58. #include <boost/preprocessor/seq/for_each_i.hpp>
  59. #include <boost/preprocessor/punctuation/comma_if.hpp>
  60.  
  61. #define DEF_MEMBER( r, data, elem ) ref elem;
  62. #define DEF_PARAM( r, data, i, elem ) BOOST_PP_COMMA_IF( i ) ref elem
  63. #define DEF_ASSIGN( r, data, elem ) this->elem = elem;
  64.  
  65. #define SET_STATE( f, members )                        
  66.   BOOST_PP_SEQ_FOR_EACH( DEF_MEMBER,, members )        
  67.   f( BOOST_PP_SEQ_FOR_EACH_I( DEF_PARAM,, members ) ) {
  68.       BOOST_PP_SEQ_FOR_EACH( DEF_ASSIGN,, members )    
  69.   }
  70.  
  71. SET_STATE(FunctorA,(a)(b))
  72.        
  73. ref a; ref b; FunctorA( ref a , ref b ) { this->a = a; this->b = b; }