mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			93 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| # This file is part of NIT ( http://www.nitlanguage.org ).
 | |
| #
 | |
| # Copyright 2013 Matthieu Lucas <lucasmatthieu@gmail.com>
 | |
| #
 | |
| # 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.
 | |
| 
 | |
| # This sample has been implemented to show you how simple is it to play 
 | |
| # with native callbacks (C) through an high level with NIT program.
 | |
| 
 | |
| module callback_monkey
 | |
| 
 | |
| in "C header" `{
 | |
| 	#include <stdio.h>
 | |
| 	#include <stdlib.h>
 | |
| 
 | |
| 	typedef struct { 
 | |
| 		int id;
 | |
| 		int age;
 | |
| 	} CMonkey;
 | |
| 
 | |
| 	typedef struct {
 | |
| 		MonkeyActionCallable toCall;
 | |
| 		Object message;
 | |
| 	} MonkeyAction;
 | |
| `}
 | |
| 
 | |
| in "C body" `{
 | |
| 	// Method which reproduce a callback answer
 | |
| 	// Please note that a function pointer is only used to reproduce the callback
 | |
| 	void cbMonkey(CMonkey *mkey, void callbackFunc(CMonkey*, MonkeyAction*), MonkeyAction *data)
 | |
| 	{
 | |
| 		sleep(2);
 | |
| 		callbackFunc( mkey, data );
 | |
| 	}
 | |
| 
 | |
| 	// Back of background treatment, will be redirected to callback function
 | |
| 	void nit_monkey_callback_func( CMonkey *mkey, MonkeyAction *data )
 | |
| 	{
 | |
| 		// To call a your method, the signature must be written like this :
 | |
| 		// <Interface Name>_<Method>...
 | |
| 		MonkeyActionCallable_wokeUp( data->toCall, mkey, data->message );
 | |
| 	}
 | |
| `}
 | |
| 
 | |
| # Implementable interface to get callback in defined methods
 | |
| interface MonkeyActionCallable
 | |
| 	fun wokeUp( sender:Monkey, message: Object) is abstract
 | |
| end
 | |
| 
 | |
| # Defining my object type Monkey, which is, in a low level, a pointer to a C struct (CMonkey)
 | |
| extern class Monkey `{ CMonkey * `}
 | |
| 	
 | |
| 	new `{
 | |
| 		CMonkey *monkey = malloc( sizeof(CMonkey) );
 | |
| 		monkey->age = 10;
 | |
| 		monkey->id = 1;
 | |
| 		return monkey;
 | |
| 	`}
 | |
| 	
 | |
| 	# Object method which will get a callback in wokeUp method, defined in MonkeyActionCallable interface
 | |
| 	# Must be defined as Nit/C method because of C call inside
 | |
| 	fun wokeUpAction( toCall: MonkeyActionCallable, message: Object ) is extern import MonkeyActionCallable.wokeUp `{
 | |
| 
 | |
| 		// Allocating memory to keep reference of received parameters :
 | |
| 		// - Object receiver
 | |
| 		// - Message 
 | |
| 		MonkeyAction *data = malloc( sizeof(MonkeyAction) );
 | |
| 
 | |
| 		// Incrementing reference counter to prevent from releasing
 | |
| 		MonkeyActionCallable_incr_ref( toCall );
 | |
| 		Object_incr_ref( message );
 | |
| 		
 | |
| 		data->toCall = toCall;
 | |
| 		data->message = message;
 | |
| 		
 | |
| 		// Calling method which reproduce a callback by passing :
 | |
| 		// - Receiver
 | |
| 		// - Function pointer to object return method
 | |
| 		// - Datas
 | |
| 		cbMonkey( recv, &nit_monkey_callback_func, data );
 | |
| 	`}
 | |
| end
 |