 [%- 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 %]
 /*
 * Copyright 2019-present, Infosys Limited.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#ifndef DGM_BLOCKSTRUCTURES_H
#define DGM_BLOCKSTRUCTURES_H
/**************************************
 *
 * 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.h.tt>
 ***************************************/
#include "permDataBlock.h"
#include "tempDataBlock.h"
#include "structs.h"

namespace mme
{
	[%- FOREACH DataGroup = DataStore.DataGroups %]
	[%- FOREACH DataBlock = DataGroup.DataBlocks %]
	[%- dataBlockClassName = CLASSNAME(DataBlock.BlockName) %]
	class [% dataBlockClassName %];
	[%- END %]
	[%- END %]
	
	[%- FOREACH DataGroup = DataStore.DataGroups %]
	[%- FOREACH DataBlock = DataGroup.DataBlocks %]
	[%- dataBlockClassName = CLASSNAME(DataBlock.BlockName) %] 
	class [% dataBlockClassName %]:public SM::[% IF DataBlock.BlockType == 'Permanent' %]PermDataBlock[% ELSE %]TempDataBlock[%- END %]
	{
		public:
	
			/****************************************
			* [% dataBlockClassName %]
			*    constructor
			****************************************/
			[% dataBlockClassName %]();
			
			/****************************************
			* ~[% dataBlockClassName %]
			*    destructor
			****************************************/
			~[% dataBlockClassName %]();
			
			[%- FOREACH Data = DataBlock.Data %]
			/****************************************
			* set[% Data.Name %]
			*    set [% Data.Name %] to [% dataBlockClassName %]
			****************************************/
			void set[% Data.Name %]( const [% Data.Type %][% REF(Data.Type) %] [% Data.Name %]_i );
			
			/****************************************
			* get[% Data.Name %]
			*    get [% Data.Name %] from [% dataBlockClassName %]
			****************************************/
			const [% Data.Type %][% REF(Data.Type) %] get[% Data.Name %]()const;
			[% END %]
			
			[%- FOREACH Child = DataBlock.Children %]
			/****************************************
			* set[% Child %]
			*    set [% Child %] to [% dataBlockClassName %]
			****************************************/
			void set[% Child %]( [% Child %]* [% Child %]p ) ;
			
			/****************************************
			* get[% Child %]
			*    get [% Child %] to [% dataBlockClassName %]
			****************************************/
			[% Child %]* get[% Child %]();
			[% END %]
		
		private:
		
			[%- FOREACH Data = DataBlock.Data %]
			[%- DataName = CLASSNAME(Data.Name) %]
			// DataName
			[% Data.Type %] [% Data.Name %]_m;
			[% END %]
			
			[%- FOREACH Child = DataBlock.Children %]
			// [% Child %]
			[% Child %]* [% Child %]_mp;
			[% END %]
	};
	[% END %]
	[% END %]
} // mme
#endif