/**
 * Copyright (c) 2020-2021 Robert Bosch GmbH.
 * 
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 * 
 * SPDX-License-Identifier: EPL-2.0
 * 
 * Contributors:
 *     Robert Bosch GmbH - initial API and implementation
 */

package org.eclipse.app4mc.slg.ros2.generators

class RosLabelGenerator {

	static def String toH(String name, String readCall, String writeCall) '''
		typedef struct «name»_CacheLine
		{
		  struct «name»_CacheLine* ptrCacheLine[8] ;
		} «name»_CacheLine ;
		void initialize_«name»(«name»_CacheLine* array,int array_elements);
		void «readCall»;
		void «writeCall»;
		
	'''

	static def String toCpp(String name, String size, String readCall, String writeCall) '''
		void initialize_«name»(«name»_CacheLine* array,int array_elements) {
		  int steps = array_elements / 2 ;
		  int bottom = 0 ;
		  int top = steps ;
		  int i = 0;
		  for (i = 0 ; i < steps ; i++) {
		    array[bottom].ptrCacheLine[0] = &array[top] ;
		    array[top].ptrCacheLine[0] = &array[bottom+1] ;
		    top++ ;
		    bottom++ ;
		  }
		  array[(array_elements-1)].ptrCacheLine[0] = NULL ;	
		}
		
		
		
		void «readCall» {
			static bool initialized = false;
				int numberOfBytes = «size»;
				static «name»_CacheLine* «name»;
				if(!initialized) {
					//init
					«name» = («name»_CacheLine*) malloc(sizeof(«name»_CacheLine) * 17000);
					initialize_«name»(«name», 17000);
					initialized = true;
				}
			
				static «name»_CacheLine* i = «name»;
				static int counter = 0;
			
				if(counter > 16100) {
					counter = 0;
					i = «name»;
				}
			
				int end_value = counter + numberOfBytes;
			
				for(; counter < end_value; counter ++) {
					i = i->ptrCacheLine[0];
				}
		
		}
		
		
		
		void «writeCall» {
			static bool initialized = false;
						int numberOfBytes = «size»;
						static «name»_CacheLine* «name»;
						if(!initialized) {
							//init
							«name» = («name»_CacheLine*) malloc(sizeof(«name»_CacheLine) * 17000);
							initialize_«name»(«name», 17000);
							initialized = true;
						}
					
						static «name»_CacheLine* i = «name»;
						static int counter = 0;
					
						if(counter > 16100) {
							counter = 0;
							i = «name»;
						}
					
						int end_value = counter + numberOfBytes;
					
						for(; counter < end_value; counter ++) {
							i = i->ptrCacheLine[0];
						}
		}
		
	'''

}
