/////////////////////////////////////////////////////////////////////// // File: tesscallback.h // Description: classes and functions to replace pointer-to-functions // Author: Samuel Charron // // (C) Copyright 2006, Google Inc. // 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. // /////////////////////////////////////////////////////////////////////// #ifndef _TESS_CALLBACK_SPECIALIZATIONS_H #define _TESS_CALLBACK_SPECIALIZATIONS_H #include "host.h" // For NULL. struct TessCallbackUtils_ { static void FailIsRepeatable(const char* name); }; class TessClosure { public: virtual ~TessClosure() { } virtual void Run() = 0; }; template class TessResultCallback { public: virtual ~TessResultCallback() { } virtual R Run() = 0; }; template class _ConstTessMemberResultCallback_0_0 : public TessResultCallback { public: typedef TessResultCallback base; typedef R (T::*MemberSignature)() const; private: const T* object_; MemberSignature member_; public: inline _ConstTessMemberResultCallback_0_0( const T* object, MemberSignature member) : object_(object), member_(member) { } virtual R Run() { if (!del) { R result = (object_->*member_)(); return result; } else { R result = (object_->*member_)(); // zero out the pointer to ensure segfault if used again member_ = NULL; delete this; return result; } } }; template class _ConstTessMemberResultCallback_0_0 : public TessClosure { public: typedef TessClosure base; typedef void (T::*MemberSignature)() const; private: const T* object_; MemberSignature member_; public: inline _ConstTessMemberResultCallback_0_0( const T* object, MemberSignature member) : object_(object), member_(member) { } virtual void Run() { if (!del) { (object_->*member_)(); } else { (object_->*member_)(); // zero out the pointer to ensure segfault if used again member_ = NULL; delete this; } } }; #ifndef SWIG template inline typename _ConstTessMemberResultCallback_0_0::base* NewTessCallback( const T1* obj, R (T2::*member)() const) { return new _ConstTessMemberResultCallback_0_0( obj, member); } #endif #ifndef SWIG template inline typename _ConstTessMemberResultCallback_0_0::base* NewPermanentTessCallback( const T1* obj, R (T2::*member)() const) { return new _ConstTessMemberResultCallback_0_0( obj, member); } #endif template class _TessMemberResultCallback_0_0 : public TessResultCallback { public: typedef TessResultCallback base; typedef R (T::*MemberSignature)() ; private: T* object_; MemberSignature member_; public: inline _TessMemberResultCallback_0_0( T* object, MemberSignature member) : object_(object), member_(member) { } virtual R Run() { if (!del) { R result = (object_->*member_)(); return result; } else { R result = (object_->*member_)(); // zero out the pointer to ensure segfault if used again member_ = NULL; delete this; return result; } } }; template class _TessMemberResultCallback_0_0 : public TessClosure { public: typedef TessClosure base; typedef void (T::*MemberSignature)() ; private: T* object_; MemberSignature member_; public: inline _TessMemberResultCallback_0_0( T* object, MemberSignature member) : object_(object), member_(member) { } virtual void Run() { if (!del) { (object_->*member_)(); } else { (object_->*member_)(); // zero out the pointer to ensure segfault if used again member_ = NULL; delete this; } } }; #ifndef SWIG template inline typename _TessMemberResultCallback_0_0::base* NewTessCallback( T1* obj, R (T2::*member)() ) { return new _TessMemberResultCallback_0_0( obj, member); } #endif #ifndef SWIG template inline typename _TessMemberResultCallback_0_0::base* NewPermanentTessCallback( T1* obj, R (T2::*member)() ) { return new _TessMemberResultCallback_0_0( obj, member); } #endif template class _TessFunctionResultCallback_0_0 : public TessResultCallback { public: typedef TessResultCallback base; typedef R (*FunctionSignature)(); private: FunctionSignature function_; public: inline _TessFunctionResultCallback_0_0( FunctionSignature function) : function_(function) { } virtual R Run() { if (!del) { R result = (*function_)(); return result; } else { R result = (*function_)(); // zero out the pointer to ensure segfault if used again function_ = NULL; delete this; return result; } } }; template class _TessFunctionResultCallback_0_0 : public TessClosure { public: typedef TessClosure base; typedef void (*FunctionSignature)(); private: FunctionSignature function_; public: inline _TessFunctionResultCallback_0_0( FunctionSignature function) : function_(function) { } virtual void Run() { if (!del) { (*function_)(); } else { (*function_)(); // zero out the pointer to ensure segfault if used again function_ = NULL; delete this; } } }; template inline typename _TessFunctionResultCallback_0_0::base* NewTessCallback(R (*function)()) { return new _TessFunctionResultCallback_0_0(function); } template inline typename _TessFunctionResultCallback_0_0::base* NewPermanentTessCallback(R (*function)()) { return new _TessFunctionResultCallback_0_0(function); } template class TessCallback1 { public: virtual ~TessCallback1() { } virtual void Run(A1) = 0; }; template class TessResultCallback1 { public: virtual ~TessResultCallback1() { } virtual R Run(A1) = 0; }; template class _ConstTessMemberResultCallback_0_1 : public TessResultCallback1 { public: typedef TessResultCallback1 base; typedef R (T::*MemberSignature)(A1) const; private: const T* object_; MemberSignature member_; public: inline _ConstTessMemberResultCallback_0_1( const T* object, MemberSignature member) : object_(object), member_(member) { } virtual R Run(A1 a1) { if (!del) { R result = (object_->*member_)(a1); return result; } else { R result = (object_->*member_)(a1); // zero out the pointer to ensure segfault if used again member_ = NULL; delete this; return result; } } }; template class _ConstTessMemberResultCallback_0_1 : public TessCallback1 { public: typedef TessCallback1 base; typedef void (T::*MemberSignature)(A1) const; private: const T* object_; MemberSignature member_; public: inline _ConstTessMemberResultCallback_0_1( const T* object, MemberSignature member) : object_(object), member_(member) { } virtual void Run(A1 a1) { if (!del) { (object_->*member_)(a1); } else { (object_->*member_)(a1); // zero out the pointer to ensure segfault if used again member_ = NULL; delete this; } } }; #ifndef SWIG template inline typename _ConstTessMemberResultCallback_0_1::base* NewTessCallback( const T1* obj, R (T2::*member)(A1) const) { return new _ConstTessMemberResultCallback_0_1( obj, member); } #endif #ifndef SWIG template inline typename _ConstTessMemberResultCallback_0_1::base* NewPermanentTessCallback( const T1* obj, R (T2::*member)(A1) const) { return new _ConstTessMemberResultCallback_0_1( obj, member); } #endif template class _TessMemberResultCallback_0_1 : public TessResultCallback1 { public: typedef TessResultCallback1 base; typedef R (T::*MemberSignature)(A1) ; private: T* object_; MemberSignature member_; public: inline _TessMemberResultCallback_0_1( T* object, MemberSignature member) : object_(object), member_(member) { } virtual R Run(A1 a1) { if (!del) { R result = (object_->*member_)(a1); return result; } else { R result = (object_->*member_)(a1); // zero out the pointer to ensure segfault if used again member_ = NULL; delete this; return result; } } }; template class _TessMemberResultCallback_0_1 : public TessCallback1 { public: typedef TessCallback1 base; typedef void (T::*MemberSignature)(A1) ; private: T* object_; MemberSignature member_; public: inline _TessMemberResultCallback_0_1( T* object, MemberSignature member) : object_(object), member_(member) { } virtual void Run(A1 a1) { if (!del) { (object_->*member_)(a1); } else { (object_->*member_)(a1); // zero out the pointer to ensure segfault if used again member_ = NULL; delete this; } } }; #ifndef SWIG template inline typename _TessMemberResultCallback_0_1::base* NewTessCallback( T1* obj, R (T2::*member)(A1) ) { return new _TessMemberResultCallback_0_1( obj, member); } #endif #ifndef SWIG template inline typename _TessMemberResultCallback_0_1::base* NewPermanentTessCallback( T1* obj, R (T2::*member)(A1) ) { return new _TessMemberResultCallback_0_1( obj, member); } #endif template class _TessFunctionResultCallback_0_1 : public TessResultCallback1 { public: typedef TessResultCallback1 base; typedef R (*FunctionSignature)(A1); private: FunctionSignature function_; public: inline _TessFunctionResultCallback_0_1( FunctionSignature function) : function_(function) { } virtual R Run(A1 a1) { if (!del) { R result = (*function_)(a1); return result; } else { R result = (*function_)(a1); // zero out the pointer to ensure segfault if used again function_ = NULL; delete this; return result; } } }; template class _TessFunctionResultCallback_0_1 : public TessCallback1 { public: typedef TessCallback1 base; typedef void (*FunctionSignature)(A1); private: FunctionSignature function_; public: inline _TessFunctionResultCallback_0_1( FunctionSignature function) : function_(function) { } virtual void Run(A1 a1) { if (!del) { (*function_)(a1); } else { (*function_)(a1); // zero out the pointer to ensure segfault if used again function_ = NULL; delete this; } } }; template inline typename _TessFunctionResultCallback_0_1::base* NewTessCallback(R (*function)(A1)) { return new _TessFunctionResultCallback_0_1(function); } template inline typename _TessFunctionResultCallback_0_1::base* NewPermanentTessCallback(R (*function)(A1)) { return new _TessFunctionResultCallback_0_1(function); } template class TessCallback2 { public: virtual ~TessCallback2() { } virtual void Run(A1,A2) = 0; }; template class TessResultCallback2 { public: virtual ~TessResultCallback2() { } virtual R Run(A1,A2) = 0; }; template class _ConstTessMemberResultCallback_0_2 : public TessResultCallback2 { public: typedef TessResultCallback2 base; typedef R (T::*MemberSignature)(A1,A2) const; private: const T* object_; MemberSignature member_; public: inline _ConstTessMemberResultCallback_0_2( const T* object, MemberSignature member) : object_(object), member_(member) { } virtual R Run(A1 a1,A2 a2) { if (!del) { R result = (object_->*member_)(a1,a2); return result; } else { R result = (object_->*member_)(a1,a2); // zero out the pointer to ensure segfault if used again member_ = NULL; delete this; return result; } } }; template class _ConstTessMemberResultCallback_0_2 : public TessCallback2 { public: typedef TessCallback2 base; typedef void (T::*MemberSignature)(A1,A2) const; private: const T* object_; MemberSignature member_; public: inline _ConstTessMemberResultCallback_0_2( const T* object, MemberSignature member) : object_(object), member_(member) { } virtual void Run(A1 a1,A2 a2) { if (!del) { (object_->*member_)(a1,a2); } else { (object_->*member_)(a1,a2); // zero out the pointer to ensure segfault if used again member_ = NULL; delete this; } } }; #ifndef SWIG template inline typename _ConstTessMemberResultCallback_0_2::base* NewTessCallback( const T1* obj, R (T2::*member)(A1,A2) const) { return new _ConstTessMemberResultCallback_0_2( obj, member); } #endif #ifndef SWIG template inline typename _ConstTessMemberResultCallback_0_2::base* NewPermanentTessCallback( const T1* obj, R (T2::*member)(A1,A2) const) { return new _ConstTessMemberResultCallback_0_2( obj, member); } #endif template class _TessMemberResultCallback_0_2 : public TessResultCallback2 { public: typedef TessResultCallback2 base; typedef R (T::*MemberSignature)(A1,A2) ; private: T* object_; MemberSignature member_; public: inline _TessMemberResultCallback_0_2( T* object, MemberSignature member) : object_(object), member_(member) { } virtual R Run(A1 a1,A2 a2) { if (!del) { R result = (object_->*member_)(a1,a2); return result; } else { R result = (object_->*member_)(a1,a2); // zero out the pointer to ensure segfault if used again member_ = NULL; delete this; return result; } } }; template class _TessMemberResultCallback_0_2 : public TessCallback2 { public: typedef TessCallback2 base; typedef void (T::*MemberSignature)(A1,A2) ; private: T* object_; MemberSignature member_; public: inline _TessMemberResultCallback_0_2( T* object, MemberSignature member) : object_(object), member_(member) { } virtual void Run(A1 a1,A2 a2) { if (!del) { (object_->*member_)(a1,a2); } else { (object_->*member_)(a1,a2); // zero out the pointer to ensure segfault if used again member_ = NULL; delete this; } } }; #ifndef SWIG template inline typename _TessMemberResultCallback_0_2::base* NewTessCallback( T1* obj, R (T2::*member)(A1,A2) ) { return new _TessMemberResultCallback_0_2( obj, member); } #endif #ifndef SWIG template inline typename _TessMemberResultCallback_0_2::base* NewPermanentTessCallback( T1* obj, R (T2::*member)(A1,A2) ) { return new _TessMemberResultCallback_0_2( obj, member); } #endif template class _TessFunctionResultCallback_0_2 : public TessResultCallback2 { public: typedef TessResultCallback2 base; typedef R (*FunctionSignature)(A1,A2); private: FunctionSignature function_; public: inline _TessFunctionResultCallback_0_2( FunctionSignature function) : function_(function) { } virtual R Run(A1 a1,A2 a2) { if (!del) { R result = (*function_)(a1,a2); return result; } else { R result = (*function_)(a1,a2); // zero out the pointer to ensure segfault if used again function_ = NULL; delete this; return result; } } }; template class _TessFunctionResultCallback_0_2 : public TessCallback2 { public: typedef TessCallback2 base; typedef void (*FunctionSignature)(A1,A2); private: FunctionSignature function_; public: inline _TessFunctionResultCallback_0_2( FunctionSignature function) : function_(function) { } virtual void Run(A1 a1,A2 a2) { if (!del) { (*function_)(a1,a2); } else { (*function_)(a1,a2); // zero out the pointer to ensure segfault if used again function_ = NULL; delete this; } } }; template inline typename _TessFunctionResultCallback_0_2::base* NewTessCallback(R (*function)(A1,A2)) { return new _TessFunctionResultCallback_0_2(function); } template inline typename _TessFunctionResultCallback_0_2::base* NewPermanentTessCallback(R (*function)(A1,A2)) { return new _TessFunctionResultCallback_0_2(function); } template class TessCallback3 { public: virtual ~TessCallback3() { } virtual void Run(A1,A2,A3) = 0; }; template class TessResultCallback3 { public: virtual ~TessResultCallback3() { } virtual R Run(A1,A2,A3) = 0; }; template class _ConstTessMemberResultCallback_0_3 : public TessResultCallback3 { public: typedef TessResultCallback3 base; typedef R (T::*MemberSignature)(A1,A2,A3) const; private: const T* object_; MemberSignature member_; public: inline _ConstTessMemberResultCallback_0_3( const T* object, MemberSignature member) : object_(object), member_(member) { } virtual R Run(A1 a1,A2 a2,A3 a3) { if (!del) { R result = (object_->*member_)(a1,a2,a3); return result; } else { R result = (object_->*member_)(a1,a2,a3); // zero out the pointer to ensure segfault if used again member_ = NULL; delete this; return result; } } }; template class _ConstTessMemberResultCallback_0_3 : public TessCallback3 { public: typedef TessCallback3 base; typedef void (T::*MemberSignature)(A1,A2,A3) const; private: const T* object_; MemberSignature member_; public: inline _ConstTessMemberResultCallback_0_3( const T* object, MemberSignature member) : object_(object), member_(member) { } virtual void Run(A1 a1,A2 a2,A3 a3) { if (!del) { (object_->*member_)(a1,a2,a3); } else { (object_->*member_)(a1,a2,a3); // zero out the pointer to ensure segfault if used again member_ = NULL; delete this; } } }; #ifndef SWIG template inline typename _ConstTessMemberResultCallback_0_3::base* NewTessCallback( const T1* obj, R (T2::*member)(A1,A2,A3) const) { return new _ConstTessMemberResultCallback_0_3( obj, member); } #endif #ifndef SWIG template inline typename _ConstTessMemberResultCallback_0_3::base* NewPermanentTessCallback( const T1* obj, R (T2::*member)(A1,A2,A3) const) { return new _ConstTessMemberResultCallback_0_3( obj, member); } #endif template class _TessMemberResultCallback_0_3 : public TessResultCallback3 { public: typedef TessResultCallback3 base; typedef R (T::*MemberSignature)(A1,A2,A3) ; private: T* object_; MemberSignature member_; public: inline _TessMemberResultCallback_0_3( T* object, MemberSignature member) : object_(object), member_(member) { } virtual R Run(A1 a1,A2 a2,A3 a3) { if (!del) { R result = (object_->*member_)(a1,a2,a3); return result; } else { R result = (object_->*member_)(a1,a2,a3); // zero out the pointer to ensure segfault if used again member_ = NULL; delete this; return result; } } }; template class _TessMemberResultCallback_0_3 : public TessCallback3 { public: typedef TessCallback3 base; typedef void (T::*MemberSignature)(A1,A2,A3) ; private: T* object_; MemberSignature member_; public: inline _TessMemberResultCallback_0_3( T* object, MemberSignature member) : object_(object), member_(member) { } virtual void Run(A1 a1,A2 a2,A3 a3) { if (!del) { (object_->*member_)(a1,a2,a3); } else { (object_->*member_)(a1,a2,a3); // zero out the pointer to ensure segfault if used again member_ = NULL; delete this; } } }; #ifndef SWIG template inline typename _TessMemberResultCallback_0_3::base* NewTessCallback( T1* obj, R (T2::*member)(A1,A2,A3) ) { return new _TessMemberResultCallback_0_3( obj, member); } #endif #ifndef SWIG template inline typename _TessMemberResultCallback_0_3::base* NewPermanentTessCallback( T1* obj, R (T2::*member)(A1,A2,A3) ) { return new _TessMemberResultCallback_0_3( obj, member); } #endif template class _TessFunctionResultCallback_0_3 : public TessResultCallback3 { public: typedef TessResultCallback3 base; typedef R (*FunctionSignature)(A1,A2,A3); private: FunctionSignature function_; public: inline _TessFunctionResultCallback_0_3( FunctionSignature function) : function_(function) { } virtual R Run(A1 a1,A2 a2,A3 a3) { if (!del) { R result = (*function_)(a1,a2,a3); return result; } else { R result = (*function_)(a1,a2,a3); // zero out the pointer to ensure segfault if used again function_ = NULL; delete this; return result; } } }; template class _TessFunctionResultCallback_0_3 : public TessCallback3 { public: typedef TessCallback3 base; typedef void (*FunctionSignature)(A1,A2,A3); private: FunctionSignature function_; public: inline _TessFunctionResultCallback_0_3( FunctionSignature function) : function_(function) { } virtual void Run(A1 a1,A2 a2,A3 a3) { if (!del) { (*function_)(a1,a2,a3); } else { (*function_)(a1,a2,a3); // zero out the pointer to ensure segfault if used again function_ = NULL; delete this; } } }; template inline typename _TessFunctionResultCallback_0_3::base* NewTessCallback(R (*function)(A1,A2,A3)) { return new _TessFunctionResultCallback_0_3(function); } template inline typename _TessFunctionResultCallback_0_3::base* NewPermanentTessCallback(R (*function)(A1,A2,A3)) { return new _TessFunctionResultCallback_0_3(function); } #endif /* _TESS_CALLBACK_SPECIALIZATIONS_H */