/*
 * Copyright 2019-present Infosys Limited  
 *   
 * SPDX-License-Identifier: Apache-2.0    
 */
 [%- DataStore = templateIn %]
 [%- USE String %]
 [%- MACRO CLASSNAME(str) BLOCK %]
 [%- className =  String.new %]
 [%- strList =  String.new(str).split("_") %]
 [%- FOREACH str = strList %]
 [%-    token = className.append(String.new(str).capital.text()) %]
 [%- END %]
 [%- className %]
 [%- END %]
 [%- MACRO REF(str) BLOCK %]
 [%- primTypeList = [ "int", "short", "uint8_t", "uint16_t", "uint32_t", "unsigned int", "unsigned char", "unsigned short", "bool" ] %]
 [%- reference = String.new %]
 [%- reference = '&' %]
 [%- FOREACH type = primTypeList %]
 [%- 	IF str == type %]
 [%-			reference = '' %]
 [%-		END %]
 [%- END %]
 [%- reference %]
 [%- END %]
/**************************************
 *
 * This is an auto generated file.
 * Please do not edit this file.
 * All edits to be made through template source file
 * <TOP-DIR/scripts/SMCodeGen/templates/ctxtManagerTmpls/dataBlocks.cpp.tt>
 ***************************************/
#include "mmeBlocks/dataBlocks.h"

namespace mme
{
	[%- FOREACH DataGroup = DataStore.DataGroups %]
	[%- FOREACH DataBlock = DataGroup.DataBlocks %]
	[%- dataBlockClassName = CLASSNAME(DataBlock.BlockName) %]
	/******************************************************************************
	*******************************************************************************
	*							[% dataBlockClassName %]
	*******************************************************************************
	******************************************************************************/
	
	/******************************************************************************
	* Constructor
	******************************************************************************/
	[% dataBlockClassName %]::[% dataBlockClassName %]()
	{
	}
	
	/******************************************************************************
	* Destructor
	******************************************************************************/
	[% dataBlockClassName %]::~[% dataBlockClassName %]()
	{
	}
	
	[%- FOREACH Data = DataBlock.Data %]
	/******************************************************************************
	* sets [% Data.Name %]
	******************************************************************************/
	void [% dataBlockClassName %]::set[% Data.Name %]( const [% Data.Type %][% REF(Data.Type) %] [% Data.Name %]_i )
	{
		[% Data.Name %]_m = [% Data.Name %]_i;
	}
	
	/******************************************************************************
	* returns [% Data.Name %]
	******************************************************************************/	
	const [% Data.Type %][% REF(Data.Type) %] [% dataBlockClassName %]::get[% Data.Name %]()const
	{
		return [% Data.Name %]_m;
	}
	[%- END %]
	
	[%- FOREACH Child = DataBlock.Children %]
	/******************************************************************************
	* sets [% Child %]
	******************************************************************************/
	void [% dataBlockClassName %]::set[% Child %]( [% Child %]* [% Child %]p )
	{
		[% Child %]_mp = [% Child %]p;
	}
	
	/******************************************************************************
	* returns [% Child %]
	******************************************************************************/
	[% Child %]* [% dataBlockClassName %]::get[% Child %]()
	{
		return [% Child %]_mp;
	}
[%- END %]
[%- END %]
[%- END %]
} // mme