SLISC 库代码生成

                     

贡献者: addis

  • 本文处于草稿阶段。
预备知识 SLISC 库概述

   SLISC 中许多头文件(xxx.h)都是根据模板文件(xxx.h.in)生成的。如果你需要修改代码,那么一种方法是直接修改头文件。另一种是修改头文件的模板。模板文件的语法是 SLISC 库原创的。

   下面来看一个模板文件的例子:

代码 1:demo.h.in
#include <complex>
#include <vector>
using namespace std;
//% tem('add', {
//%  'vector<double>', 'Int', 'vector<float>';
//%  'vector<complex<double>>', 'vector<complex<double>>', 'vector<Int>';
//% });
//%----------------------------------
//% [Tz, Tx, Ty] = varargin{:};
void add(@Tz@ &z, const @Tx@ &x, const @Ty@ &y)
{
//% if is_vec(Tz) && is_vec(Tx) && is_scalar(Ty)
	for (size_t i = 0; i < z.size(); ++i)
		z[i] = x[i] + y;
//% elseif is_vec(Tz) && is_scalar(Tx) && is_vec(Ty)
	for (size_t i = 0; i < z.size(); ++i)
		z[i] = x + y[i];
//% elseif is_vec(Tz) && is_vec(Tx) && is_vec(Ty)
	for (size_t i = 0; i < z.size(); ++i)
		z[i] = x[i] + y[i];
//% else
//%     error('not implemented!');
//% end
}
//%-----------------------------------

   安装 octave 后,在命令行中用 $octave auto_gen.m,就会自动生成文件:

代码 2:demo.h
#include <complex>
#include <vector>
using namespace std;

void add(vector<double> &z, const Int &x, const vector<float> &y)
{
	for (size_t i = 0; i < z.size(); ++i)
		z[i] = x + y[i];
}

void add(vector<complex<double>> &z, const vector<complex<double>> &x,
        const vector<Int> &y)
{
	for (size_t i = 0; i < z.size(); ++i)
		z[i] = x[i] + y[i];
}

   观察一下很容易可以学会该模板的一些基础:

                     

© 小时科技 保留一切权利