[38ba34]: / Tools / Lib / classtools / MultipleSubTemplates.any

Download this file

241 lines (230 with data), 8.9 kB

#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