10.5. Template application helpers

The TEMPLATES_BOOST module extends template utilities with high-level macros for common code generation patterns, including template function generation, type-parameterized struct creation, and compile-time code expansion.

See also decltype macro and template function annotation for decltype and [template] annotations.

All functions and symbols are in “templates_boost” module, use require to get access to it.

require daslib/templates_boost

10.5.1. Structures

Template

struct Template

10.5.2. Call macros

qmacro_template_function

Function annotation qmacro_template_function

qmacro_variable

Function annotation qmacro_variable

qmacro_type

Function annotation qmacro_type

qmacro_function

Function annotation qmacro_function

qmacro

Function annotation qmacro

qmacro_template_class

Function annotation qmacro_template_class

qmacro_method

Function annotation qmacro_method

qmacro_block

Function annotation qmacro_block

qmacro_expr

Function annotation qmacro_expr

qmacro_block_to_array

Function annotation qmacro_block_to_array

10.5.3. Template rules

kaboomVarField(self: Template; name: string; prefix: string; suffix: string )

def kaboomVarField (var self: Template; name: string; prefix: string; suffix: string)

Arguments:
  • self : Template

  • name : string

  • prefix : string

  • suffix : string

10.5.3.1. renameCall

renameCall(self: Template; name: string; newName: das_string )

def renameCall (var self: Template; name: string; newName: das_string)

Arguments:
renameCall(self: Template; name: string; newName: string )

10.5.3.2. renameField

renameField(self: Template; name: string; newName: das_string )

def renameField (var self: Template; name: string; newName: das_string)

Arguments:
renameField(self: Template; name: string; newName: string )

10.5.3.3. renameVariable

renameVariable(self: Template; name: string; newName: das_string )

def renameVariable (var self: Template; name: string; newName: das_string)

Arguments:
renameVariable(self: Template; name: string; newName: string )

replaceAnnotationArgument(self: Template; name: string; cb: lambda<(var ann:AnnotationDeclaration):void> )

def replaceAnnotationArgument (var self: Template; name: string; var cb: lambda<(var ann:AnnotationDeclaration):void>)

Arguments:
replaceArgumentWithList(self: Template; name: string; blka: array<VariablePtr> )

def replaceArgumentWithList (var self: Template; name: string; blka: array<VariablePtr>)

Arguments:
replaceBlockArgument(self: Template; name: string; newName: string )

def replaceBlockArgument (var self: Template; name: string; newName: string)

Arguments:
  • self : Template

  • name : string

  • newName : string

replaceStructWithTypeDecl(self: Template; pstruct: Structure?; expr: TypeDeclPtr )

def replaceStructWithTypeDecl (var self: Template; pstruct: Structure?; var expr: TypeDeclPtr)

Arguments:
replaceType(self: Template; name: string; newName: string )

def replaceType (var self: Template; name: string; newName: string)

Arguments:
  • self : Template

  • name : string

  • newName : string

replaceTypeWithTypeDecl(self: Template; name: string; expr: TypeDeclPtr )

def replaceTypeWithTypeDecl (var self: Template; name: string; var expr: TypeDeclPtr)

Arguments:
replaceVarTag(self: Template; name: string; expr: Expression? )

def replaceVarTag (var self: Template; name: string; var expr: Expression?)

Arguments:
replaceVariable(self: Template; name: string; expr: Expression? )

def replaceVariable (var self: Template; name: string; var expr: Expression?)

Arguments:

10.5.3.4. replaceVariableWithList

replaceVariableWithList(self: Template; name: string; expr: array<Expression?> )

def replaceVariableWithList (var self: Template; name: string; expr: array<Expression?>)

Arguments:
replaceVariableWithList(self: Template; name: string; expr: dasvector`ptr`Expression )

10.5.4. Template application

10.5.4.1. apply_template

apply_template(at: LineInfo; expr: Expression?&; blk: block<(var rules:Template):void> ): Expression?

def apply_template (at: LineInfo; var expr: Expression?&; blk: block<(var rules:Template):void>) : Expression?

Arguments:
apply_template(at: LineInfo; typ: TypeDecl?&; blk: block<(var rules:Template):void> ): TypeDeclPtr
apply_template(expr: Expression?&; blk: block<(var rules:Template):void> ): Expression?
apply_template(rules: Template; at: LineInfo; expr: Expression?; forceAt: bool = true ): Expression?
apply_template(rules: Template; at: LineInfo; typ: TypeDecl?; forceAt: bool = true ): TypeDeclPtr

clone_and_rename_var(src: Expression?; from_name: string; to_name: string ): Expression?

def clone_and_rename_var (src: Expression?; from_name: string; to_name: string) : Expression?

Arguments:
  • src : Expression?

  • from_name : string

  • to_name : string

10.5.5. Expression helpers

expression_at(expr: Expression?; at: LineInfo ): Expression?

def expression_at (var expr: Expression?; at: LineInfo) : Expression?

Arguments:
remove_deref(varname: string; expr: Expression? )

def remove_deref (varname: string; var expr: Expression?)

Arguments:
visit_expression(expr: Expression?&; adapter: VisitorAdapter? )

def visit_expression (var expr: Expression?&; var adapter: VisitorAdapter?)

Arguments:

10.5.6. Expression generation

10.5.6.1. make_expression_block

make_expression_block(exprs: array<Expression?> ): ExprBlock?

def make_expression_block (var exprs: array<Expression?>) : ExprBlock?

Arguments:
make_expression_block(exprs: dasvector`ptr`Expression ): ExprBlock?

10.5.7. Block helpers

move_unquote_block(expr: Expression?& ): ExprBlock?

def move_unquote_block (var expr: Expression?&) : ExprBlock?

Arguments:
push_block_list(stmts: array<Expression?>; blockExpr: Expression? )

def push_block_list (var stmts: array<Expression?>; var blockExpr: Expression?)

Arguments:
unquote_block(expr: Expression? ): ExprBlock?

def unquote_block (expr: Expression?) : ExprBlock?

Arguments:

10.5.8. Global variable helpers

add_global_let(mod: Module?; vname: string; vat: LineInfo; value: Expression? ): bool

def add_global_let (mod: Module?; vname: string; vat: LineInfo; var value: Expression?) : bool

Arguments:
add_global_private_let(mod: Module?; vname: string; vat: LineInfo; value: Expression? ): bool

def add_global_private_let (mod: Module?; vname: string; vat: LineInfo; var value: Expression?) : bool

Arguments:
add_global_private_var(mod: Module?; vname: string; vat: LineInfo; value: Expression? ): bool

def add_global_private_var (mod: Module?; vname: string; vat: LineInfo; var value: Expression?) : bool

Arguments:

10.5.8.1. add_global_var

add_global_var(mod: Module?; vname: string; typ: TypeDeclPtr; vat: LineInfo; priv: bool ): bool

def add_global_var (mod: Module?; vname: string; var typ: TypeDeclPtr; vat: LineInfo; priv: bool) : bool

Arguments:
add_global_var(mod: Module?; vname: string; typ: TypeDeclPtr; vat: LineInfo; priv: bool; blk: block<(var v:VariablePtr):void> ): bool
add_global_var(mod: Module?; vname: string; vat: LineInfo; value: Expression? ): bool

10.5.9. Hygienic names

make_unique_private_name(prefix: string; vat: LineInfo ): string

def make_unique_private_name (prefix: string; vat: LineInfo) : string

Arguments:

10.5.10. Quoting macros

apply_qblock(expr: Expression?; blk: block<(var rules:Template):void> ): Expression?

def apply_qblock (var expr: Expression?; blk: block<(var rules:Template):void>) : Expression?

Arguments:
apply_qblock_expr(expr: Expression?; blk: block<(var rules:Template):void> ): Expression?

def apply_qblock_expr (var expr: Expression?; blk: block<(var rules:Template):void>) : Expression?

Arguments:
apply_qblock_to_array(expr: Expression?; blk: block<(var rules:Template):void> ): array<Expression?>

def apply_qblock_to_array (var expr: Expression?; blk: block<(var rules:Template):void>) : array<Expression?>

Arguments:
apply_qmacro(expr: Expression?; blk: block<(var rules:Template):void> ): Expression?

def apply_qmacro (var expr: Expression?; blk: block<(var rules:Template):void>) : Expression?

Arguments:
apply_qmacro_function(fname: string; expr: Expression?; blk: block<(var rules:Template):void> ): FunctionPtr

def apply_qmacro_function (fname: string; var expr: Expression?; blk: block<(var rules:Template):void>) : FunctionPtr

Arguments:
apply_qmacro_method(fname: string; parent: StructurePtr; expr: Expression?; blk: block<(var rules:Template):void> ): FunctionPtr

def apply_qmacro_method (fname: string; var parent: StructurePtr; var expr: Expression?; blk: block<(var rules:Template):void>) : FunctionPtr

Arguments:
apply_qmacro_template_class(instance_name: string; template_type: TypeDecl?; blk: block<(var rules:Template):void> ): TypeDeclPtr

def apply_qmacro_template_class (instance_name: string; var template_type: TypeDecl?; blk: block<(var rules:Template):void>) : TypeDeclPtr

Arguments:
  • instance_name : string

  • template_type : TypeDecl?

  • blk : block<(rules: Template):void>

apply_qmacro_template_function(func: FunctionPtr; blk: block<(var rules:Template):void> ): FunctionPtr

def apply_qmacro_template_function (func: FunctionPtr; blk: block<(var rules:Template):void>) : FunctionPtr

Arguments:
apply_qmacro_variable(vname: string; expr: Expression?; blk: block<(var rules:Template):void> ): VariablePtr

def apply_qmacro_variable (vname: string; var expr: Expression?; blk: block<(var rules:Template):void>) : VariablePtr

Arguments:
apply_qtype(expr: Expression?; blk: block<(var rules:Template):void> ): TypeDeclPtr

def apply_qtype (var expr: Expression?; blk: block<(var rules:Template):void>) : TypeDeclPtr

Arguments:

10.5.11. Type pointer helpers

add_array_ptr_ref(a: array<smart_ptr<auto(TT)>> ): array<smart_ptr<TT>>

def add_array_ptr_ref (var a: array<smart_ptr<auto(TT)>>) : array<smart_ptr<TT>>

Arguments:
  • a : array<smart_ptr<auto(TT)>>

10.5.11.1. add_type_ptr_ref

add_type_ptr_ref(a: TypeDeclPtr; flags: TypeDeclFlags ): TypeDeclPtr

def add_type_ptr_ref (a: TypeDeclPtr; flags: TypeDeclFlags) : TypeDeclPtr

Arguments:
add_type_ptr_ref(anything: auto(TT); flags: TypeDeclFlags ): TypeDeclPtr
add_type_ptr_ref(st: Enumeration?; flags: TypeDeclFlags ): TypeDeclPtr
add_type_ptr_ref(st: Structure?; flags: TypeDeclFlags ): TypeDeclPtr

10.5.12. Structure helpers

add_structure_field(cls: StructurePtr; name: string; t: TypeDeclPtr; init: Expression? ): int

def add_structure_field (var cls: StructurePtr; name: string; var t: TypeDeclPtr; var init: Expression?) : int

Arguments:

10.5.13. Class generation

enum_class_type(st: auto ): auto

def enum_class_type (st: auto) : auto

Arguments:
  • st : auto

10.5.13.1. make_class

make_class(name: string; mod: Module? ): Structure?

def make_class (name: string; mod: Module?) : Structure?

Arguments:
make_class(name: string; baseClass: Structure?; mod: Module? ): Structure?

make_class_constructor(cls: StructurePtr; ctor: FunctionPtr ): Function?

def make_class_constructor (cls: StructurePtr; ctor: FunctionPtr) : Function?

Arguments:
modify_to_class_member(cls: StructurePtr; fun: FunctionPtr; isExplicit: bool; Constant: bool )

def modify_to_class_member (cls: StructurePtr; fun: FunctionPtr; isExplicit: bool; Constant: bool)

Arguments: