/* Copyright (C) 2001-2006, William Joseph. All Rights Reserved. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "callback.h" #if defined( _DEBUG ) || defined( DOXYGEN ) namespace ExampleMemberCaller { // MemberCaller example class Integer { public: int value; void printValue() const { // print this->value here; } void setValue(){ value = 3; } // a typedef to make things more readable typedef MemberCaller SetValueCaller; }; void example(){ Integer foo = { 0 }; { Callback bar = ConstMemberCaller( foo ); // invoke the callback bar(); // foo.printValue() } { // use the typedef to improve readability Callback bar = Integer::SetValueCaller( foo ); // invoke the callback bar(); // foo.setValue() } } // end example } namespace ExampleReferenceCaller { // ReferenceCaller example void Int_printValue( const int& value ){ // print value here; } void Int_setValue( int& value ){ value = 3; } // a typedef to make things more readable typedef ReferenceCaller IntSetValueCaller; void example(){ int foo = 0; { Callback bar = ConstReferenceCaller( foo ); // invoke the callback bar(); // Int_printValue(foo) } { // use the typedef to improve readability Callback bar = IntSetValueCaller( foo ); // invoke the callback bar(); // Int_setValue(foo) } } // end example } #endif namespace { class A1 { }; class A2 { }; class A3 { }; class A4 { }; class Test { public: void test0(){ } typedef Member Test0; typedef MemberCaller Test0Caller; void test0const() const { } typedef ConstMember Test0Const; typedef ConstMemberCaller Test0ConstCaller; void test1( A1 ){ } typedef Member1 Test1; typedef MemberCaller1 Test1Caller; void test1const( A1 ) const { } typedef ConstMember1 Test1Const; typedef ConstMemberCaller1 Test1ConstCaller; void test2( A1, A2 ){ } typedef Member2 Test2; void test2const( A1, A2 ) const { } typedef ConstMember2 Test2Const; void test3( A1, A2, A3 ){ } typedef Member3 Test3; void test3const( A1, A2, A3 ) const { } typedef ConstMember3 Test3Const; }; void test0free(){ } typedef FreeCaller<&test0free> Test0FreeCaller; void test1free( A1 ){ } typedef FreeCaller1 Test1FreeCaller; void test2free( A1, A2 ){ } typedef Function2 Test2Free; void test3free( A1, A2, A3 ){ } typedef Function3 Test3Free; void test0( Test& test ){ } typedef ReferenceCaller Test0Caller; void test0const( const Test& test ){ } typedef ConstReferenceCaller Test0ConstCaller; void test0p( Test* test ){ } typedef PointerCaller Test0PCaller; void test0constp( const Test* test ){ } typedef ConstPointerCaller Test0ConstPCaller; void test1( Test& test, A1 ){ } typedef ReferenceCaller1 Test1Caller; void test1const( const Test& test, A1 ){ } typedef ConstReferenceCaller1 Test1ConstCaller; void test1p( Test* test, A1 ){ } typedef PointerCaller1 Test1PCaller; void test1constp( const Test* test, A1 ){ } typedef ConstPointerCaller1 Test1ConstPCaller; void test2( Test& test, A1, A2 ){ } typedef Function3 Test2; void test3( Test& test, A1, A2, A3 ){ } typedef Function4 Test3; void instantiate(){ Test test; const Test& testconst = test; { Callback a = Test0FreeCaller(); Callback b = Test::Test0Caller( test ); b = makeCallback0( Test::Test0(), test ); Callback c = Test::Test0ConstCaller( testconst ); c = makeCallback0( Test::Test0Const(), test ); Callback d = Test0Caller( test ); Callback e = Test0ConstCaller( testconst ); Callback f = Test0PCaller( &test ); Callback g = Test0ConstPCaller( &testconst ); a(); bool u = a != b; } { typedef Callback1 TestCallback1; TestCallback1 a = Test1FreeCaller(); TestCallback1 b = Test::Test1Caller( test ); b = makeCallback1( Test::Test1(), test ); TestCallback1 c = Test::Test1ConstCaller( testconst ); c = makeCallback1( Test::Test1Const(), test ); TestCallback1 d = Test1Caller( test ); TestCallback1 e = Test1ConstCaller( testconst ); TestCallback1 f = Test1PCaller( &test ); TestCallback1 g = Test1ConstPCaller( &testconst ); a( A1() ); bool u = a != b; } { typedef Callback2 TestCallback2; TestCallback2 a = makeStatelessCallback2( Test2Free() ); TestCallback2 b = makeCallback2( Test2(), test ); TestCallback2 c = makeCallback2( Test::Test2(), test ); TestCallback2 d = makeCallback2( Test::Test2Const(), test ); a( A1(), A2() ); bool u = a != b; } { typedef Callback3 TestCallback3; TestCallback3 a = makeStatelessCallback3( Test3Free() ); TestCallback3 b = makeCallback3( Test3(), test ); TestCallback3 c = makeCallback3( Test::Test3(), test ); TestCallback3 d = makeCallback3( Test::Test3Const(), test ); a( A1(), A2(), A3() ); bool u = a != b; } } }