code-generation
最近は生成AIでコード生成も簡単にできますが、特定のルールで多数の類似コードを作りたい時など、一般的なツールを使ったほうが良いこともあります。
code-generationはPythonのモジュールでC++コードを簡単に作ることができるので試してみました。
インストール
$ pip install code-generation
ファイルの作成
example.cpp
というファイルを作成
from code_generation import code_generator
cpp = code_generator.CppFile('example.cpp')
定数
CppFile
は文字列型を受け取り、そのまま書き込むことができます。
cpp('int n = 0;')
↓(作成されたコード)
int n = 0;
for文
block
とwith文で書きます。with文の処理は中括弧の中に入ります。
with cpp.block('for(int i=0; i<n; ++i)',''):
cpp('sum += i;')
↓
for(int i=0; i<n; ++i)
{
sum += i;
}
while文
for文と同様にblock
とwith文で書くことができます。
with cpp.block('while(i<n)',''):
cpp('i++;')
↓
while(i<n)
{
i++;
}
関数
CppFunction
を使うことで関数を定義することができます。
ret_type
は戻り値の型、is_constexpr
はconstexpr関数かどうかを表します。また、documentation
は関数についてのコメントを記載します。
また、関数内の処理は別に定義しておき、implementation_handle
に入れます。ここではfunctionBody
としています。
関数の引数は、add_argument
で指定します。
最後にrender_to_string
でファイルに書き込みます。
from code_generation import code_generator
from code_generation.cpp_function import CppFunction
cpp = code_generator.CppFile('example.cpp')
def functionBody(self, cpp):
cpp('return n < 1 ? 1 : (n * factorial(n-1));')
factorial_function = CppFunction(name='factorial',
ret_type='int',
is_constexpr=True,
implementation_handle=functionBody,
documentation='/// calculates and returns the factorial of \p n.')
factorial_function.add_argument('int n')
factorial_function.render_to_string(cpp)
↓
/// calculates and returns the factorial of \p n.
constexpr int factorial(int n)
{
return n < 1 ? 1 : (n * factorial(n-1));
}
配列
配列はCppArray
を使って書くこともできます。
name
は変数名、type
は型、array_size
は初期値のサイズです。
その他にもis_static
,is_const
などを指定できます。
要素はitems
によってstr型のリストで指定します。
最後にrender_to_string
でファイルに書き込みます。
from code_generation import code_generator
from code_generation.cpp_array import CppArray
cpp = code_generator.CppFile('example.cpp')
cpp_array = CppArray(name='arr',
type='int',
is_static=False,
is_const=False,
is_class_member=False,
array_size=3)
cpp_array.items = ['1', '2', '3']
cpp_array.render_to_string(cpp)
↓
int arr[3] = {1, 2, 3};
クラス、構造体
クラスや構造体もwith文を使うことで書くことができます。
with文ではcpp.blockの第二引数に指定した文字列が、中括弧の終わりに付きます。
先程は空文字でしたが、クラスでは;
にしておきます。
with cpp.block('class A', ';'):
cpp.label('public')
cpp('int member1;')
cpp('double member2;')
↓
class A
{
public:
int member1;
double member2;
};
code_generation
では、以上のようにPythonでC++コードを作成できます。
Pythonでループ処理を掛けるなど、動的に類似コードを生成することもできるので、色々と使い道があると思います。