Giter Club home page Giter Club logo

code_generator's Introduction

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.

code_generator's People

Contributors

erichschroeter avatar tcitbiint3 avatar yuchdev avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.