Skip to main content

Provides functionality of generating source code programmatically

Project description

C++ Code Generator

Simple and straightforward code generator for creating C++ code. It also could be used for generating code in any programming language. Written in Python, works both with Python 2 and 3

Every C++ element could render its current state to a string that could be evaluated as a legal C++ construction. Some elements could be rendered to a pair of representations (C++ classes and functions declaration and implementation)

Special thanks

Thanks to Eric Reynolds, the idea of this project mainly based on his article published on http://www.codeproject.com/Articles/571645/Really-simple-Cplusplus-code-generation-in-Python

However, this solution has been both simplified and extended compared to the initial idea.

Usage examples

Generate C++ code from Python code

Creating variables

Python code
cpp = CodeFile('example.cpp')
cpp('int i = 0;')

x_variable = CppVariable(name='x', type='int const&', is_static=True, is_constexpr=True, initialization_value='42')
x_variable.render_to_string(cpp)

name_variable = CppVariable(name='name', type='char*', is_extern=True)
name_variable.render_to_string(cpp)
Generated C++ code
int i = 0;
static constexpr int const& x = 42;
extern char* name;

Creating functions

Python code
def handle_to_factorial(self, cpp):
    cpp('return n < 1 ? 1 : (n * factorial(n - 1));')

cpp = CodeFile('example.cpp')

factorial_function = CppFunction(name='factorial',
    ret_type='int',
    is_constexpr=True,
    implementation_handle=handle_to_factorial,
    documentation='/// Calculates and returns the factorial of \p n.')
factorial_function.add_argument('int n')
factorial_function.render_to_string(cpp)
Generated C++ code
/// Calculates and returns the factorial of \p n.
constexpr int factorial(int n)
{
    return n <= 1 ? 1 : (n * factorial(n - 1));
}

Creating classes and structures

Python code
cpp = CppFile('example.cpp')
with cpp.block('class A', ';'):
    cpp.label('public:')
    cpp('int m_classMember1;')
    cpp('double m_classMember2;')
Generated C++ code
class A
{
public:
    int m_classMember1;
    double m_classMember2;
};

Rendering CppClass objects to C++ declaration and implementation

Python code
cpp_class = CppClass(name = 'MyClass', is_struct = True)
cpp_class.add_variable(CppVariable(name = "m_var",
    type = 'size_t',
    is_static = True,
    is_const = True,
    initialization_value = 255))
Generated C++ declaration
struct MyClass
{
    static const size_t m_var;
}

Generated C++ implementation

const size_t MyClass::m_var = 255;

Module cpp_generator.py highly depends on parent code_generator.py, as it uses code generating and formatting primitives implemented there.

The main object referenced from code_generator.py is CppFile, which is passed as a parameter to render_to_string(cpp) Python method

It could also be used for composing more complicated C++ code, that does not supported by cpp_generator

Class ANSICodeStyle is responsible for code formatting. Re-implement it if you wish to apply any other formatting style.

It support:

  • functional calls:
cpp('int a = 10;')
  • with semantic:
with cpp.block('class MyClass', ';')
    class_definition(cpp)
  • append code to the last string without EOL:
cpp.append(', p = NULL);')
  • empty lines:
cpp.newline(2)

Maintainers

Executing unit tests

The following command will execute the unit tests.

python -m unittest cpp_generator_tests.py

Updating unit tests fixed data

After changing a unit test the fixed data needs to be updated to successfully pass the unit tests.

python -c 'from test_cpp_generator import generate_reference_code; generate_reference_code()'

After executing that command, the fixed data under tests/test_assets will be updated and will need to be committed to git.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

code_generation-2.0.0.tar.gz (12.1 kB view details)

Uploaded Source

Built Distribution

code_generation-2.0.0-py3-none-any.whl (13.0 kB view details)

Uploaded Python 3

File details

Details for the file code_generation-2.0.0.tar.gz.

File metadata

  • Download URL: code_generation-2.0.0.tar.gz
  • Upload date:
  • Size: 12.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.10.8

File hashes

Hashes for code_generation-2.0.0.tar.gz
Algorithm Hash digest
SHA256 9150b4af5e55fd9fc5b9e3ea9a91d1794ed9e545f3c55cebf802ef6645487b05
MD5 c7bfc5a79195a775359bbae09d810e41
BLAKE2b-256 5cb049f4e5576e0b62fb85141a5d89bb775b99a738ef1079767119b7730fc417

See more details on using hashes here.

File details

Details for the file code_generation-2.0.0-py3-none-any.whl.

File metadata

File hashes

Hashes for code_generation-2.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 60dd8faf641c8d7dae0a30f1c49c3814b17d609eaefab1c8e4be13fbb365c276
MD5 97a670431385d62c6c94586bc8b3835c
BLAKE2b-256 53e5e83f2325d04be5edc00455de89f3e5a0c29e028988c10a1b8d2f4b3e05af

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page