浮动插入
浮动插入是一个包含C/C++代码的字符串,它是字面上插入Felix生成的C++中的。
插入位置
插入有两个位置:
页眉 插入位于生成的头文件的顶部附近
body 插入位于生成的正文文件的顶部附近 之后 #include 指令,但在Felix生成的任何定义之前
header '#include "interface"`;
body 'void implementation() {}';
多态性插入
有两种插入:
普通插入
多态性插入
插入一个纯插入。多态插入是按编写的方式插入的,但它可能包含使用 ?9 一种符号。多态插入必须命名并指定伪参数,就像C类型绑定一样:
//$ In place list reversal: unsafe!
// second arg is a dummy to make overload work
proc rev[T,PLT=&list[T]] : &list[T] = "_rev($1,(?1*)0);" requires _iprev_[T,PLT];
body _iprev_[T,PLT]=
"""
static void _rev(?2 plt, ?1*) // second arg is a dummy
{ // in place reversal
struct node_t { void *tail; ?1 elt; };
void *nutail = 0;
void *cur = *plt;
while(cur)
{
void *oldtail = ((node_t*)FLX_VNP(cur))->tail; // save old tail in temp
((node_t*)FLX_VNP(cur))->tail = nutail; // overwrite current node tail
nutail = cur; // set new tail to current
cur = oldtail; // set current to saved old tail
}
*plt = nutail; // overwrite
}
"""
;
在这个例子中,我们定义了一个函数 _rev in C++, used to reverse a list in place. The insertion containing it, _ iprev_ [T、 血小板] `是多态的,则实际类型在的C绑定中指定 `rev .
Requires子句
C绑定可以指定 requires 带有要求清单的条款。对于浮动插入,有三个选项:
需要逐字给定标题
需要字面上给定的身体
按插入标记名要求
插入本身可能有要求。
标记名
插入标记名由类确定作用域,可能需要显式限定。然而,标记名称空间独立于普通定义。
任何数量的插入都可以具有相同的标记名。
闭合形成
当一个命名的需求被触发时,具有该标记名的所有插入以及它们本身所需要的任何插入都将被递归地插入。要求不存在的标记是错误的。
允许循环引用。
插入顺序
在同一个Felix文件中定义的同一种类型的插入在生成的输出中保留它们的顺序,换句话说,它们是按写入顺序发出的,而不是按依赖顺序发出的。
如果一个文本已经发出,它将不再发出:重复被消除。注意这个规则适用于多态插入 之后 类型替换。
全局插入
由指定的未命名插入 requires 语句被视为包含它的类(包括任何嵌套类)中所有C绑定和浮动插入的要求。
触发插入
只有在最终程序中实际使用了它们所附加的C绑定或插入时,才会触发插入。这会将输出减少到实际需要的程度。