2
1

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でループ処理を掛けるなど、動的に類似コードを生成することもできるので、色々と使い道があると思います。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1