/* 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" #include "globaldefs.h" #if GDEF_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 Member Test1; typedef MemberCaller Test1Caller; void test1const( A1 ) const { } typedef ConstMember Test1Const; typedef ConstMemberCaller Test1ConstCaller; void test2( A1, A2 ){ } typedef Member Test2; void test2const( A1, A2 ) const { } typedef ConstMember Test2Const; void test3( A1, A2, A3 ){ } typedef Member Test3; void test3const( A1, A2, A3 ) const { } typedef ConstMember Test3Const; }; void test0free(){ } void test1free( A1 ){ } void test2free( A1, A2 ){ } typedef Function Test2Free; void test3free( A1, A2, A3 ){ } typedef Function 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 ReferenceCaller Test1Caller; void test1const( const Test& test, A1 ){ } typedef ConstReferenceCaller Test1ConstCaller; void test1p( Test* test, A1 ){ } typedef PointerCaller Test1PCaller; void test1constp( const Test* test, A1 ){ } typedef ConstPointerCaller Test1ConstPCaller; void test2( Test& test, A1, A2 ){ } typedef Function Test2; void test3( Test& test, A1, A2, A3 ){ } typedef Function Test3; void instantiate(){ Test test; const Test& testconst = test; { Callback a = makeCallbackF(&test0free); Callback b = Test::Test0Caller( test ); b = makeCallback( Test::Test0(), test ); Callback c = Test::Test0ConstCaller( testconst ); c = makeCallback( Test::Test0Const(), test ); Test0Caller{ test }; Test0ConstCaller{ testconst }; Test0PCaller{ &test }; Test0ConstPCaller{ &testconst }; a(); bool u = a != b; } { typedef Callback TestCallback1; TestCallback1 a = makeCallbackF(&test1free); TestCallback1 b = Test::Test1Caller( test ); b = makeCallback( Test::Test1(), test ); TestCallback1 c = Test::Test1ConstCaller( testconst ); c = makeCallback( Test::Test1Const(), test ); Test1Caller{ test }; Test1ConstCaller{ testconst }; Test1PCaller{ &test }; Test1ConstPCaller{ &testconst }; a( A1() ); bool u = a != b; } { typedef Callback TestCallback2; TestCallback2 a = makeStatelessCallback( Test2Free() ); TestCallback2 b = makeCallback( Test2(), test ); makeCallback( Test::Test2(), test ); makeCallback( Test::Test2Const(), test ); a( A1(), A2() ); bool u = a != b; } { typedef Callback TestCallback3; TestCallback3 a = makeStatelessCallback( Test3Free() ); TestCallback3 b = makeCallback( Test3(), test ); makeCallback( Test::Test3(), test ); makeCallback( Test::Test3Const(), test ); a( A1(), A2(), A3() ); bool u = a != b; } } }