Guest User

Untitled

a guest
Jun 19th, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.81 KB | None | 0 0
  1.  
  2. enum N = 20;
  3.  
  4. alias Lambda!(int, N, // P = int, q = N
  5. q{
  6. alias P[a][q] _;
  7. })
  8. IntArray;
  9.  
  10. static assert(is(IntArray!(3) == int[3][N]));
  11.  
  12.  
  13. alias Lambda!(3, // p = 3
  14. q{
  15. enum _ = p * a;
  16. })
  17. triple;
  18.  
  19. static assert(triple!(11) == 33);
  20.  
  21.  
  22.  
  23. //----------------------------------------------------------------------------//
  24.  
  25.  
  26. template Lambda(specs...)
  27. {
  28. alias LambdaGen!(specs[ $ - 1],
  29. specs[0 .. $ - 1]).Lambda Lambda;
  30. }
  31.  
  32. private template LambdaGen(string decl, captures...)
  33. {
  34. template Lambda(args...)
  35. {
  36. alias _!args._ Lambda;
  37. }
  38.  
  39. template _(args...)
  40. {
  41. mixin injectParameters!(0, +args.length);
  42. mixin injectCaptures !(0, +captures.length);
  43. mixin injectBody;
  44. }
  45.  
  46. mixin template injectBody()
  47. {
  48. mixin(decl);
  49. }
  50.  
  51.  
  52. // Inject named parameter aliases: a-h.
  53. mixin template injectParameters(size_t i, size_t n)
  54. {
  55. static if (i < n && i < 8)
  56. {
  57. mixin injectParameter !(i );
  58. mixin injectParameters!(i + 1, n);
  59. }
  60. }
  61.  
  62. mixin template injectParameter(size_t i)
  63. {
  64. mixin("alias Id!(args[i]) "~ "abcdefgh"[i] ~","
  65. ~ "ABCDEFGH"[i] ~";");
  66. }
  67.  
  68.  
  69. // Inject named captures: p-w.
  70. mixin template injectCaptures(size_t i, size_t n)
  71. {
  72. static if (i < n && i < 8)
  73. {
  74. mixin injectCapture !(i );
  75. mixin injectCaptures!(i + 1, n);
  76. }
  77. }
  78.  
  79. mixin template injectCapture(size_t i)
  80. {
  81. mixin("alias Id!(captures[i]) "~ "pqrstuvw"[i] ~","
  82. ~ "PQRSTUVW"[i] ~";");
  83. }
  84. }
  85.  
  86. template Id( E) { alias E Id; }
  87. template Id(alias E) { alias E Id; }
Add Comment
Please, Sign In to add comment