53 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| #include "testEnv.hpp"
 | |
| 
 | |
| /*
 | |
|   Embedding a global function as an 'adaptor' to a member function (by ATS)
 | |
|   http://squirrel-lang.org/forums/thread/2147.aspx
 | |
|   
 | |
|   In essence, it's a global function, but SqPlus injects 'this' as a
 | |
|   first argument to the function.
 | |
|  */
 | |
| namespace {
 | |
| 
 | |
| class TestClass {
 | |
| public:
 | |
|     TestClass( ) : m_i(0) {}
 | |
|     
 | |
|     int AddOrSub( int a1, bool do_add ){
 | |
|         return do_add ? a1+m_i : a1-m_i;
 | |
|     }
 | |
| 
 | |
|     int    m_i; 
 | |
| };
 | |
| 
 | |
| int TestClass_Add( TestClass *ptc, int a1 ){
 | |
|     return ptc->AddOrSub( a1, true );
 | |
| }
 | |
| 
 | |
| }
 | |
| 
 | |
| DECLARE_INSTANCE_TYPE(TestClass);
 | |
| 
 | |
| 
 | |
| SQPLUS_TEST(Test_GlobalAsMember)
 | |
| {
 | |
|     SQPLUS_TEST_TRACE();
 | |
| 
 | |
|     using namespace SqPlus;
 | |
| 
 | |
|     SQClassDef<TestClass>(_SC("TestClass"))
 | |
|         .globMembFunc(&TestClass_Add, _SC("Add"))
 | |
|         .var(&TestClass::m_i, _SC("m_i"));
 | |
| 
 | |
|     // Test that it works 
 | |
|     // SqPlus injects an additional 'this' argument to global func
 | |
|     RUN_SCRIPT(_SC("\n\
 | |
| tc <- TestClass(); \n\
 | |
| tc.m_i = 200; \n\
 | |
| print(\"GlobalAsMember: \"); \n\
 | |
| print(tc.m_i); \n\
 | |
| print(tc.Add(114)); \n\
 | |
| assert(tc.Add(114)==314); \n\
 | |
| "));
 | |
| }
 |