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

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

#ifndef CLASS8_H_
#define CLASS8_H_

/*
 *---------------Includes and declares--------------
 */
// Derived includes
// End of Derived includes
// Derived declares
// End of Derived declares

// Std headers
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
// End of Std headers

/*
 *--------------Public Class Description-------------
 */
//  Structure 
/* Class Macro definition */
#define Class8(OBJ) ((Class8*)OBJ)

typedef struct Class8 Class8;

struct Class8 {

	int defaultIValue;

};

// Constructor and destructor declarations 
/*
 *----Default constructor & destructor prototypes---
 */
/**
 * Dynamic instantiation of a Class8 structure
 * @return Class8 instance pointer
 */
Class8* Class8_create();

/**
 * Dynamic destruction of a Class8 structure instantiation
 * @param Pointer to an instance of the Class8 structure
 * @return void
 */
void Class8_destroy(Class8*);

// Property initialisation declarations
/*
 *------Default value initialization prototypes-----
 */
/**
 * Default value initialization
 * @param Class8 structure instance pointer
 * @return void
 */
void Class8_init(Class8 *self);

// Class methods declarations
/*
 *---------------Function Declarations--------------
 */
int
Class8_operation1(Class8 *self, int iVal1, int iVal2, char cVal1, char cVal2);

void
Class8_operation2(Class8 *self, int iVal1);

// Class receptions declarations

// ----------------------------------Public Global VariableDescription----------------------------------

// ----------------------------------Global Public Functions----------------------------------

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

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

#endif /*CLASS8_H_*/
