// --------------------------------------------------------
// Code generated by Papyrus C
// --------------------------------------------------------

/* 
 * File generated from the CCodegenTest::Class2 uml class
 * Generated by the Papyrus C Generator (CEA LIST) 
 *
 */

// Include self header
#include "Class2.h"
// Derived includes
#include "Class1.h"
// Include from Include stereotype (body)
#include <Class1.h>
// End of Include from Include stereotype (body)

// ----------------------------------Private and Protected Global VariableDescription----------------------------------

// ----------------------------------Private and Protected Class Functions----------------------------------
/*
 *------Private/Protected Function Declarations-----
 */

// ----------------------------------Private and Protected Global Functions----------------------------------
/*
 *---Private/Protected Global Function Declarations--
 */

// ----------------------------------Implementation of the class constructor and destructor----------
/*
 *--Default constructor & destructor implementations-
 */

// ----------------------------------Initialization functions implementation----------------------------------
// ----------------------------------Functions Implementation----------------------------------
/**
 * Default constructor
 */
void Class2_Class2_1(Class2 *self) {

	self->iVal1 = 0;
	self->iVal2 = 0;
	self->bVal = 'f';
}

/**
 * Constructor with parameters
 */
void Class2_Class2(int newIVal1, int newIVal2, /*bool*/char newBVal,
		Class2 *self) {

	self->iVal1 = newIVal1;
	self->iVal2 = newIVal2;
	self->bVal = newBVal;
}

/**
 * Virtual method
 */
double Class2_virtualOp(Class2 *self, double a, double b) {

}

/**
 * Static method
 */
void staticOp(void) {

}

/**
 * Inline method
 */
int Class2_inlineOp(Class2 *self, int a, int b) {

	return a + b;
}

/**
 * Friend method
 */
void Class2_friendOp(Class2 *self) {

}

/**
 * Non-static method
 */
void Class2_nonStaticOp(Class2 *self) {

}

/**
 * Method with in, out, inout, return parameters
 */
int Class2_paramsOp(Class2 *self, int in, int out, int inout) {

}

/**
 * Void Method
 */
void Class2_voidOp(Class2 *self) {

}

/**
 * 
 */
void Class2_defaultValueOp(Class2 *self, int newIVal1) {

}

/**
 * Virtual destructor
 */
void Class2__Class2(Class2 *self) {

}

/**
 * 
 */
Class1*
Class2_classesOp(Class2 *self, Class1 c1) {

}

/**
 * Const method
 */
const
void Class2_constOp(Class2 *self) {

	printf("I am a const method\n");
}

// ----------------------------------Receptions Implementation----------------------------------

// ----------------------------------Signal Event Process Functions Implementations--------------------------------

// ----------------------------------Call Event Process Functions Implementations----------------------------------

