--- a
+++ b/Tools/Lib/classtools/MultipleSubTemplates.any
@@ -0,0 +1,240 @@
+#ifndef TOOLS_LIB_CLASSTOOLS_MULTIPLESUBTEMPLATES_ANY
+#define TOOLS_LIB_CLASSTOOLS_MULTIPLESUBTEMPLATES_ANY
+/*
+---
+group: Utilities
+topic: Class tools
+descr: Utility template for calling an other class template multiple times.
+---
+
+Add `#include "<AMMR_TOOLS>/Lib/classtools/MultipleSubTemplates.any"`
+To use the class template.
+*/
+
+
+// A generic class template which can call another class template multiple times.
+//
+// The sub template must follow a specific call signature in its arguments
+// to be used with this generic class. Specifically it must have a `IDX` 
+// argument to receive its index. A number of generic arguments 
+// `ARG1`, `ARG2`, `ARG3`, `ARG4`, can also be defined to pass from the outer
+// to the internal template that is wrapped. 
+// 
+// :::{rubric} Usage
+// :::
+// 
+// :::{code-block} AnyScript
+// /// Template which we want to evoke multiple times
+//  #class_template SubTemplate (IDX=0, ARG1="", ARG2="", ARG3="", ARG4="") = { };
+//  };
+//
+//  MultipleSubTemplates WrapSubTemplates(
+//      NUM=3,
+//      CLASS_TEMPLATE = "SubTemplate",
+//      NAME_PREFIX=SubFolder,
+//  ) = { };
+// :::
+//
+// The example above will create a folder structure like this: 
+//
+// :::{code-block} AnyScript
+// WrapSubTemplates = {
+//   SubFolder_000 = { };
+//   SubFolder_001 = { };
+//   SubFolder_002 = { };
+// };
+// :::
+//
+#class_template MultipleSubTemplates(
+   NUM,
+   CLASS_TEMPLATE,
+   _PRE="",
+   NAME_PREFIX=ELEM,
+   ARG1=0,
+   ARG2=0,
+   ARG3=0,
+   ARG4=0
+) {
+  // Arguments:
+  // ----------------------
+  //MultipleSubTemplates#NUM
+  //  Specifies the number of times the sub template should be called.
+  //MultipleSubTemplates#CLASS_TEMPLATE
+  //  Specifies the name of the sub template to call.
+  //MultipleSubTemplates#NAME_PREFIX
+  //  Specifies the name prefix of the sub template which will be created. The final name will 
+  //  be NAME_PREFIX_000, NAME_PREFIX_001, NAME_PREFIX_002, etc.
+  //MultipleSubTemplates#ARG1
+  //  A generic argument which will be passed to the sub template.
+  //MultipleSubTemplates#ARG2
+  //  A generic argument which will be passed to the sub template.
+  //MultipleSubTemplates#ARG3
+  //  A generic argument which will be passed to the sub template.
+  //MultipleSubTemplates#ARG4
+  //  A generic argument which will be passed to the sub template.
+
+                 
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_000(IDX=0, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #if NUM > 1
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_001(IDX=1, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 2
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_002(IDX=2, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 3
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_003(IDX=3, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 4
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_004(IDX=4, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 5
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_005(IDX=5, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 6
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_006(IDX=6, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 7
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_007(IDX=7, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 8
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_008(IDX=8, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 9
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_009(IDX=9, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 10
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_010(IDX=10, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 11
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_011(IDX=11, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 12
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_012(IDX=12, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 13
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_0013(IDX=13, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 14
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_014(IDX=14, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 15
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_015(IDX=15, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 16
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_016(IDX=16, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 17
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_017(IDX=17, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 18
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_018(IDX=18, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 19
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_019(IDX=19, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 20
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_020(IDX=20, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 21
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_021(IDX=21, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 22
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_022(IDX=22, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 23
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_023(IDX=23, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 24
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_024(IDX=24, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 25
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_025(IDX=25, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 26
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_026(IDX=26, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 27
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_027(IDX=27, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 28
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_028(IDX=28, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 29
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_029(IDX=29, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 30
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_030(IDX=30, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 31
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_031(IDX=31, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 32
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_032(IDX=32, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 33
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_033(IDX=33, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 34
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_034(IDX=34, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 35
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_035(IDX=35, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 36
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_036(IDX=36, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 37
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_037(IDX=37, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 38
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_038(IDX=38, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 31
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_031(IDX=31, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 39
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_039(IDX=39, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 40
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_040(IDX=40, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 41
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_041(IDX=41, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 42
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_042(IDX=42, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 43
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_043(IDX=43, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 44
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_044(IDX=44, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 45
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_045(IDX=45, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 46
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_046(IDX=46, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 47
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_047(IDX=47, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 48
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_048(IDX=48, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 49
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_049(IDX=49, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 50
+  _PRE##CLASS_TEMPLATE NAME_PREFIX##_050(IDX=50, ARG1=ARG1,ARG2=ARG2,ARG3=ARG3,ARG4=ARG4) = {};
+  #endif
+  #if NUM > 51
+  #ERROR_Not_implemented_for_more_than_50_elements
+  #endif
+};
+
+
+
+
+#endif
+