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 (var self: Template; name: string; prefix: string; suffix: string)
renameCall (var self: Template; name: string; newName: das_string)
renameCall (var self: Template; name: string; newName: string)
renameField (var self: Template; name: string; newName: das_string)
renameField (var self: Template; name: string; newName: string)
renameVariable (var self: Template; name: string; newName: das_string)
renameVariable (var self: Template; name: string; newName: string)
replaceArgumentWithList (var self: Template; name: string; blka: array<VariablePtr>)
replaceBlockArgument (var self: Template; name: string; newName: string)
replaceStructWithTypeDecl (var self: Template; pstruct: Structure?; var expr: TypeDeclPtr)
replaceType (var self: Template; name: string; newName: string)
replaceTypeWithTypeDecl (var self: Template; name: string; var expr: TypeDeclPtr)
replaceVarTag (var self: Template; name: string; var expr: Expression?)
replaceVariable (var self: Template; name: string; var expr: Expression?)
replaceVariableWithList (var self: Template; name: string; expr: array<Expression?>)
replaceVariableWithList (var self: Template; name: string; expr: dasvector`ptr`Expression)
- 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:
self : Template
name : string
newName : das_string
- 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:
self : Template
name : string
newName : das_string
- 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:
self : Template
name : string
newName : das_string
- 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:
self : Template
name : string
cb : lambda<(ann: AnnotationDeclaration):void>
- replaceArgumentWithList(self: Template; name: string; blka: array<VariablePtr> )
def replaceArgumentWithList (var self: Template; name: string; blka: array<VariablePtr>)
- Arguments:
self : Template
name : string
blka : array< VariablePtr>
- 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:
self : Template
pstruct : Structure?
expr : TypeDeclPtr
- 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:
self : Template
name : string
expr : TypeDeclPtr
- replaceVarTag(self: Template; name: string; expr: Expression? )
def replaceVarTag (var self: Template; name: string; var expr: Expression?)
- Arguments:
self : Template
name : string
expr : Expression?
- replaceVariable(self: Template; name: string; expr: Expression? )
def replaceVariable (var self: Template; name: string; var expr: Expression?)
- Arguments:
self : Template
name : string
expr : Expression?
10.5.3.4. replaceVariableWithList
- replaceVariableWithList(self: Template; name: string; expr: array<Expression?> )
def replaceVariableWithList (var self: Template; name: string; expr: array<Expression?>)
- Arguments:
self : Template
name : string
expr : array< Expression?>
- 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:
at : LineInfo
expr : Expression?&
blk : block<(rules: Template):void>
- 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:
expr : Expression?
at : LineInfo
- remove_deref(varname: string; expr: Expression? )
def remove_deref (varname: string; var expr: Expression?)
- Arguments:
varname : string
expr : Expression?
- visit_expression(expr: Expression?&; adapter: VisitorAdapter? )
def visit_expression (var expr: Expression?&; var adapter: VisitorAdapter?)
- Arguments:
expr : Expression?&
adapter : VisitorAdapter?
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:
exprs : array< Expression?>
- 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:
expr : Expression?&
- push_block_list(stmts: array<Expression?>; blockExpr: Expression? )
def push_block_list (var stmts: array<Expression?>; var blockExpr: Expression?)
- Arguments:
stmts : array< Expression?>
blockExpr : Expression?
- unquote_block(expr: Expression? ): ExprBlock?
def unquote_block (expr: Expression?) : ExprBlock?
- Arguments:
expr : Expression?
10.5.8. Global variable helpers
add_global_let (mod: Module?; vname: string; vat: LineInfo; var value: Expression?) : bool
add_global_private_let (mod: Module?; vname: string; vat: LineInfo; var value: Expression?) : bool
add_global_private_var (mod: Module?; vname: string; vat: LineInfo; var value: Expression?) : bool
add_global_var (mod: Module?; vname: string; var typ: TypeDeclPtr; vat: LineInfo; priv: bool) : bool
add_global_var (mod: Module?; vname: string; vat: LineInfo; var value: Expression?) : bool
- 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:
mod : Module?
vname : string
vat : LineInfo
value : Expression?
- 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:
mod : Module?
vname : string
vat : LineInfo
value : Expression?
- 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:
mod : Module?
vname : string
vat : LineInfo
value : Expression?
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:
mod : Module?
vname : string
typ : TypeDeclPtr
vat : LineInfo
priv : bool
- 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:
prefix : string
vat : LineInfo
10.5.10. Quoting macros
apply_qblock (var expr: Expression?; blk: block<(var rules:Template):void>) : Expression?
apply_qblock_expr (var expr: Expression?; blk: block<(var rules:Template):void>) : Expression?
apply_qmacro (var expr: Expression?; blk: block<(var rules:Template):void>) : Expression?
apply_qtype (var expr: Expression?; blk: block<(var rules:Template):void>) : TypeDeclPtr
- 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:
expr : Expression?
blk : block<(rules: Template):void>
- 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:
expr : Expression?
blk : block<(rules: Template):void>
- 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:
expr : Expression?
blk : block<(rules: Template):void>
- 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:
expr : Expression?
blk : block<(rules: Template):void>
- 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:
fname : string
expr : Expression?
blk : block<(rules: Template):void>
- 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:
fname : string
parent : StructurePtr
expr : Expression?
blk : block<(rules: Template):void>
- 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
- 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:
func : FunctionPtr
blk : block<(rules: Template):void>
- 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:
vname : string
expr : Expression?
blk : block<(rules: Template):void>
- 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:
expr : Expression?
blk : block<(rules: Template):void>
10.5.11. Type pointer helpers
add_array_ptr_ref (var a: array<smart_ptr<auto(TT)>>) : array<smart_ptr<TT>>
add_type_ptr_ref (a: TypeDeclPtr; flags: TypeDeclFlags) : TypeDeclPtr
add_type_ptr_ref (anything: auto(TT); flags: TypeDeclFlags) : TypeDeclPtr
add_type_ptr_ref (var st: Enumeration?; flags: TypeDeclFlags) : TypeDeclPtr
add_type_ptr_ref (var st: Structure?; flags: TypeDeclFlags) : TypeDeclPtr
- 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:
a : TypeDeclPtr
flags : TypeDeclFlags
- 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:
cls : StructurePtr
name : string
t : TypeDeclPtr
init : Expression?
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:
name : string
mod : Module?
- 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:
cls : StructurePtr
ctor : FunctionPtr
- 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:
cls : StructurePtr
fun : FunctionPtr
isExplicit : bool
Constant : bool