| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916 |
- ///////////////////////////////////////////////////////////////////////
- // 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_
- class TessClosure {
- public:
- virtual ~TessClosure();
- virtual void Run() = 0;
- };
- template <class R>
- class TessResultCallback {
- public:
- virtual ~TessResultCallback() = default;
- virtual R Run() = 0;
- };
- template <bool del, class R, class T>
- class _TessMemberResultCallback_0_0 : public TessResultCallback<R> {
- public:
- using base = TessResultCallback<R>;
- using MemberSignature = R (T::*)();
- private:
- T* object_;
- MemberSignature member_;
- public:
- inline _TessMemberResultCallback_0_0(T* object, MemberSignature member)
- : object_(object), member_(member) {}
- R Run() override {
- if (!del) {
- R result = (object_->*member_)();
- return result;
- }
- R result = (object_->*member_)();
- // zero out the pointer to ensure segfault if used again
- member_ = nullptr;
- delete this;
- return result;
- }
- };
- template <bool del, class T>
- class _TessMemberResultCallback_0_0<del, void, T> : public TessClosure {
- public:
- using base = TessClosure;
- using MemberSignature = void (T::*)();
- private:
- T* object_;
- MemberSignature member_;
- public:
- inline _TessMemberResultCallback_0_0(T* object, MemberSignature member)
- : object_(object), member_(member) {}
- void Run() override {
- if (!del) {
- (object_->*member_)();
- } else {
- (object_->*member_)();
- // zero out the pointer to ensure segfault if used again
- member_ = nullptr;
- delete this;
- }
- }
- };
- #ifndef SWIG
- template <class T1, class T2, class R>
- inline typename _TessMemberResultCallback_0_0<true, R, T1>::base*
- NewTessCallback(T1* obj, R (T2::*member)()) {
- return new _TessMemberResultCallback_0_0<true, R, T1>(obj, member);
- }
- #endif
- template <bool del, class R>
- class _TessFunctionResultCallback_0_0 : public TessResultCallback<R> {
- public:
- using base = TessResultCallback<R>;
- using FunctionSignature = R (*)();
- private:
- FunctionSignature function_;
- public:
- inline explicit _TessFunctionResultCallback_0_0(FunctionSignature function)
- : function_(function) {}
- virtual R Run() {
- if (!del) {
- R result = (*function_)();
- return result;
- }
- R result = (*function_)();
- // zero out the pointer to ensure segfault if used again
- function_ = nullptr;
- delete this;
- return result;
- }
- };
- template <bool del>
- class _TessFunctionResultCallback_0_0<del, void> : public TessClosure {
- public:
- using base = TessClosure;
- using FunctionSignature = void (*)();
- private:
- FunctionSignature function_;
- public:
- inline explicit _TessFunctionResultCallback_0_0(FunctionSignature function)
- : function_(function) {}
- void Run() override {
- if (!del) {
- (*function_)();
- } else {
- (*function_)();
- // zero out the pointer to ensure segfault if used again
- function_ = nullptr;
- delete this;
- }
- }
- };
- template <class R>
- inline typename _TessFunctionResultCallback_0_0<true, R>::base* NewTessCallback(
- R (*function)()) {
- return new _TessFunctionResultCallback_0_0<true, R>(function);
- }
- // Specified by TR1 [4.7.2] Reference modifications.
- template <class T>
- struct remove_reference;
- template <typename T>
- struct remove_reference {
- using type = T;
- };
- template <typename T>
- struct remove_reference<T&> {
- using type = T;
- };
- // Identity<T>::type is a typedef of T. Useful for preventing the
- // compiler from inferring the type of an argument in templates.
- template <typename T>
- struct Identity {
- using type = T;
- };
- template <bool del, class R, class T, class P1, class P2, class P3, class P4,
- class P5>
- class _ConstTessMemberResultCallback_5_0 : public TessResultCallback<R> {
- public:
- using base = TessResultCallback<R>;
- using MemberSignature = R (T::*)(P1, P2, P3, P4, P5) const;
- private:
- const T* object_;
- MemberSignature member_;
- typename remove_reference<P1>::type p1_;
- typename remove_reference<P2>::type p2_;
- typename remove_reference<P3>::type p3_;
- typename remove_reference<P4>::type p4_;
- typename remove_reference<P5>::type p5_;
- public:
- inline _ConstTessMemberResultCallback_5_0(const T* object,
- MemberSignature member, P1 p1,
- P2 p2, P3 p3, P4 p4, P5 p5)
- : object_(object),
- member_(member),
- p1_(p1),
- p2_(p2),
- p3_(p3),
- p4_(p4),
- p5_(p5) {}
- R Run() override {
- if (!del) {
- R result = (object_->*member_)(p1_, p2_, p3_, p4_, p5_);
- return result;
- }
- R result = (object_->*member_)(p1_, p2_, p3_, p4_, p5_);
- // zero out the pointer to ensure segfault if used again
- member_ = nullptr;
- delete this;
- return result;
- }
- };
- template <bool del, class T, class P1, class P2, class P3, class P4, class P5>
- class _ConstTessMemberResultCallback_5_0<del, void, T, P1, P2, P3, P4, P5>
- : public TessClosure {
- public:
- using base = TessClosure;
- using MemberSignature = void (T::*)(P1, P2, P3, P4, P5) const;
- private:
- const T* object_;
- MemberSignature member_;
- typename remove_reference<P1>::type p1_;
- typename remove_reference<P2>::type p2_;
- typename remove_reference<P3>::type p3_;
- typename remove_reference<P4>::type p4_;
- typename remove_reference<P5>::type p5_;
- public:
- inline _ConstTessMemberResultCallback_5_0(const T* object,
- MemberSignature member, P1 p1,
- P2 p2, P3 p3, P4 p4, P5 p5)
- : object_(object),
- member_(member),
- p1_(p1),
- p2_(p2),
- p3_(p3),
- p4_(p4),
- p5_(p5) {}
- void Run() override {
- if (!del) {
- (object_->*member_)(p1_, p2_, p3_, p4_, p5_);
- } else {
- (object_->*member_)(p1_, p2_, p3_, p4_, p5_);
- // zero out the pointer to ensure segfault if used again
- member_ = nullptr;
- delete this;
- }
- }
- };
- #ifndef SWIG
- template <class T1, class T2, class R, class P1, class P2, class P3, class P4,
- class P5>
- inline typename _ConstTessMemberResultCallback_5_0<false, R, T1, P1, P2, P3, P4,
- P5>::base*
- NewPermanentTessCallback(const T1* obj,
- R (T2::*member)(P1, P2, P3, P4, P5) const,
- typename Identity<P1>::type p1,
- typename Identity<P2>::type p2,
- typename Identity<P3>::type p3,
- typename Identity<P4>::type p4,
- typename Identity<P5>::type p5) {
- return new _ConstTessMemberResultCallback_5_0<false, R, T1, P1, P2, P3, P4,
- P5>(obj, member, p1, p2, p3, p4,
- p5);
- }
- #endif
- template <bool del, class R, class T, class P1, class P2, class P3, class P4,
- class P5, class P6>
- class _ConstTessMemberResultCallback_6_0 : public TessResultCallback<R> {
- public:
- using base = TessResultCallback<R>;
- using MemberSignature = R (T::*)(P1, P2, P3, P4, P5, P6) const;
- private:
- const T* object_;
- MemberSignature member_;
- typename remove_reference<P1>::type p1_;
- typename remove_reference<P2>::type p2_;
- typename remove_reference<P3>::type p3_;
- typename remove_reference<P4>::type p4_;
- typename remove_reference<P5>::type p5_;
- typename remove_reference<P6>::type p6_;
- public:
- inline _ConstTessMemberResultCallback_6_0(const T* object,
- MemberSignature member, P1 p1,
- P2 p2, P3 p3, P4 p4, P5 p5, P6 p6)
- : object_(object),
- member_(member),
- p1_(p1),
- p2_(p2),
- p3_(p3),
- p4_(p4),
- p5_(p5),
- p6_(p6) {}
- R Run() override {
- if (!del) {
- R result = (object_->*member_)(p1_, p2_, p3_, p4_, p5_, p6_);
- return result;
- }
- R result = (object_->*member_)(p1_, p2_, p3_, p4_, p5_, p6_);
- // zero out the pointer to ensure segfault if used again
- member_ = nullptr;
- delete this;
- return result;
- }
- };
- template <bool del, class T, class P1, class P2, class P3, class P4, class P5,
- class P6>
- class _ConstTessMemberResultCallback_6_0<del, void, T, P1, P2, P3, P4, P5, P6>
- : public TessClosure {
- public:
- using base = TessClosure;
- using MemberSignature = void (T::*)(P1, P2, P3, P4, P5, P6) const;
- private:
- const T* object_;
- MemberSignature member_;
- typename remove_reference<P1>::type p1_;
- typename remove_reference<P2>::type p2_;
- typename remove_reference<P3>::type p3_;
- typename remove_reference<P4>::type p4_;
- typename remove_reference<P5>::type p5_;
- typename remove_reference<P6>::type p6_;
- public:
- inline _ConstTessMemberResultCallback_6_0(const T* object,
- MemberSignature member, P1 p1,
- P2 p2, P3 p3, P4 p4, P5 p5, P6 p6)
- : object_(object),
- member_(member),
- p1_(p1),
- p2_(p2),
- p3_(p3),
- p4_(p4),
- p5_(p5),
- p6_(p6) {}
- void Run() override {
- if (!del) {
- (object_->*member_)(p1_, p2_, p3_, p4_, p5_, p6_);
- } else {
- (object_->*member_)(p1_, p2_, p3_, p4_, p5_, p6_);
- // zero out the pointer to ensure segfault if used again
- member_ = nullptr;
- delete this;
- }
- }
- };
- #ifndef SWIG
- template <class T1, class T2, class R, class P1, class P2, class P3, class P4,
- class P5, class P6>
- inline typename _ConstTessMemberResultCallback_6_0<false, R, T1, P1, P2, P3, P4,
- P5, P6>::base*
- NewPermanentTessCallback(
- const T1* obj, R (T2::*member)(P1, P2, P3, P4, P5, P6) const,
- typename Identity<P1>::type p1, typename Identity<P2>::type p2,
- typename Identity<P3>::type p3, typename Identity<P4>::type p4,
- typename Identity<P5>::type p5, typename Identity<P6>::type p6) {
- return new _ConstTessMemberResultCallback_6_0<false, R, T1, P1, P2, P3, P4,
- P5, P6>(obj, member, p1, p2, p3,
- p4, p5, p6);
- }
- #endif
- template <class A1>
- class TessCallback1 {
- public:
- virtual ~TessCallback1() = default;
- virtual void Run(A1) = 0;
- };
- template <class R, class A1>
- class TessResultCallback1 {
- public:
- virtual ~TessResultCallback1() = default;
- virtual R Run(A1) = 0;
- };
- template <class A1, class A2>
- class TessCallback2 {
- public:
- virtual ~TessCallback2() = default;
- virtual void Run(A1, A2) = 0;
- };
- template <class R, class A1, class A2>
- class TessResultCallback2 {
- public:
- virtual ~TessResultCallback2() = default;
- virtual R Run(A1, A2) = 0;
- };
- template <class A1, class A2, class A3>
- class TessCallback3 {
- public:
- virtual ~TessCallback3() = default;
- virtual void Run(A1, A2, A3) = 0;
- };
- template <class R, class A1, class A2, class A3>
- class TessResultCallback3 {
- public:
- virtual ~TessResultCallback3() = default;
- virtual R Run(A1, A2, A3) = 0;
- };
- template <class A1, class A2, class A3, class A4>
- class TessCallback4 {
- public:
- virtual ~TessCallback4() = default;
- virtual void Run(A1, A2, A3, A4) = 0;
- };
- template <class R, class A1, class A2, class A3, class A4>
- class TessResultCallback4 {
- public:
- virtual ~TessResultCallback4() = default;
- virtual R Run(A1, A2, A3, A4) = 0;
- };
- template <bool del, class R, class T, class A1>
- class _TessMemberResultCallback_0_1 : public TessResultCallback1<R, A1> {
- public:
- typedef TessResultCallback1<R, A1> base;
- using MemberSignature = R (T::*)(A1);
- private:
- T* object_;
- MemberSignature member_;
- public:
- inline _TessMemberResultCallback_0_1(T* object, MemberSignature member)
- : object_(object), member_(member) {}
- R Run(A1 a1) override {
- if (!del) {
- R result = (object_->*member_)(a1);
- return result;
- }
- R result = (object_->*member_)(a1);
- // zero out the pointer to ensure segfault if used again
- member_ = nullptr;
- delete this;
- return result;
- }
- };
- template <bool del, class T, class A1>
- class _TessMemberResultCallback_0_1<del, void, T, A1>
- : public TessCallback1<A1> {
- public:
- using base = TessCallback1<A1>;
- using MemberSignature = void (T::*)(A1);
- private:
- T* object_;
- MemberSignature member_;
- public:
- inline _TessMemberResultCallback_0_1(T* object, MemberSignature member)
- : object_(object), member_(member) {}
- void Run(A1 a1) override {
- if (!del) {
- (object_->*member_)(a1);
- } else {
- (object_->*member_)(a1);
- // zero out the pointer to ensure segfault if used again
- member_ = nullptr;
- delete this;
- }
- }
- };
- #ifndef SWIG
- template <class T1, class T2, class R, class A1>
- inline typename _TessMemberResultCallback_0_1<false, R, T1, A1>::base*
- NewPermanentTessCallback(T1* obj, R (T2::*member)(A1)) {
- return new _TessMemberResultCallback_0_1<false, R, T1, A1>(obj, member);
- }
- #endif
- template <bool del, class R, class A1>
- class _TessFunctionResultCallback_0_1 : public TessResultCallback1<R, A1> {
- public:
- typedef TessResultCallback1<R, A1> base;
- using FunctionSignature = R (*)(A1);
- private:
- FunctionSignature function_;
- public:
- inline explicit _TessFunctionResultCallback_0_1(FunctionSignature function)
- : function_(function) {}
- virtual R Run(A1 a1) {
- if (!del) {
- R result = (*function_)(a1);
- return result;
- }
- R result = (*function_)(a1);
- // zero out the pointer to ensure segfault if used again
- function_ = nullptr;
- delete this;
- return result;
- }
- };
- template <bool del, class A1>
- class _TessFunctionResultCallback_0_1<del, void, A1>
- : public TessCallback1<A1> {
- public:
- using base = TessCallback1<A1>;
- using FunctionSignature = void (*)(A1);
- private:
- FunctionSignature function_;
- public:
- inline explicit _TessFunctionResultCallback_0_1(FunctionSignature function)
- : function_(function) {}
- void Run(A1 a1) override {
- if (!del) {
- (*function_)(a1);
- } else {
- (*function_)(a1);
- // zero out the pointer to ensure segfault if used again
- function_ = nullptr;
- delete this;
- }
- }
- };
- template <class R, class A1>
- inline typename _TessFunctionResultCallback_0_1<false, R, A1>::base*
- NewPermanentTessCallback(R (*function)(A1)) {
- return new _TessFunctionResultCallback_0_1<false, R, A1>(function);
- }
- template <bool del, class R, class P1, class A1>
- class _TessFunctionResultCallback_1_1 : public TessResultCallback1<R, A1> {
- public:
- typedef TessResultCallback1<R, A1> base;
- using FunctionSignature = R (*)(P1, A1);
- private:
- FunctionSignature function_;
- typename remove_reference<P1>::type p1_;
- public:
- inline _TessFunctionResultCallback_1_1(FunctionSignature function, P1 p1)
- : function_(function), p1_(p1) {}
- virtual R Run(A1 a1) {
- if (!del) {
- R result = (*function_)(p1_, a1);
- return result;
- }
- R result = (*function_)(p1_, a1);
- // zero out the pointer to ensure segfault if used again
- function_ = nullptr;
- delete this;
- return result;
- }
- };
- template <bool del, class P1, class A1>
- class _TessFunctionResultCallback_1_1<del, void, P1, A1>
- : public TessCallback1<A1> {
- public:
- using base = TessCallback1<A1>;
- using FunctionSignature = void (*)(P1, A1);
- private:
- FunctionSignature function_;
- typename remove_reference<P1>::type p1_;
- public:
- inline _TessFunctionResultCallback_1_1(FunctionSignature function, P1 p1)
- : function_(function), p1_(p1) {}
- void Run(A1 a1) override {
- if (!del) {
- (*function_)(p1_, a1);
- } else {
- (*function_)(p1_, a1);
- // zero out the pointer to ensure segfault if used again
- function_ = nullptr;
- delete this;
- }
- }
- };
- template <class R, class P1, class A1>
- inline typename _TessFunctionResultCallback_1_1<false, R, P1, A1>::base*
- NewPermanentTessCallback(R (*function)(P1, A1),
- typename Identity<P1>::type p1) {
- return new _TessFunctionResultCallback_1_1<false, R, P1, A1>(function, p1);
- }
- template <bool del, class R, class T, class A1, class A2>
- class _ConstTessMemberResultCallback_0_2
- : public TessResultCallback2<R, A1, A2> {
- public:
- typedef TessResultCallback2<R, A1, A2> base;
- using MemberSignature = R (T::*)(A1, A2) const;
- private:
- const T* object_;
- MemberSignature member_;
- public:
- inline _ConstTessMemberResultCallback_0_2(const T* object,
- MemberSignature member)
- : object_(object), member_(member) {}
- R Run(A1 a1, A2 a2) override {
- if (!del) {
- R result = (object_->*member_)(a1, a2);
- return result;
- }
- R result = (object_->*member_)(a1, a2);
- // zero out the pointer to ensure segfault if used again
- member_ = nullptr;
- delete this;
- return result;
- }
- };
- template <bool del, class T, class A1, class A2>
- class _ConstTessMemberResultCallback_0_2<del, void, T, A1, A2>
- : public TessCallback2<A1, A2> {
- public:
- typedef TessCallback2<A1, A2> base;
- using MemberSignature = void (T::*)(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_ = nullptr;
- delete this;
- }
- }
- };
- #ifndef SWIG
- template <class T1, class T2, class R, class A1, class A2>
- inline typename _ConstTessMemberResultCallback_0_2<false, R, T1, A1, A2>::base*
- NewPermanentTessCallback(const T1* obj, R (T2::*member)(A1, A2) const) {
- return new _ConstTessMemberResultCallback_0_2<false, R, T1, A1, A2>(obj,
- member);
- }
- #endif
- template <bool del, class R, class T, class A1, class A2>
- class _TessMemberResultCallback_0_2 : public TessResultCallback2<R, A1, A2> {
- public:
- typedef TessResultCallback2<R, A1, A2> base;
- using MemberSignature = R (T::*)(A1, A2);
- private:
- T* object_;
- MemberSignature member_;
- public:
- inline _TessMemberResultCallback_0_2(T* object, MemberSignature member)
- : object_(object), member_(member) {}
- R Run(A1 a1, A2 a2) override {
- if (!del) {
- R result = (object_->*member_)(a1, a2);
- return result;
- }
- R result = (object_->*member_)(a1, a2);
- // zero out the pointer to ensure segfault if used again
- member_ = nullptr;
- delete this;
- return result;
- }
- };
- template <bool del, class T, class A1, class A2>
- class _TessMemberResultCallback_0_2<del, void, T, A1, A2>
- : public TessCallback2<A1, A2> {
- public:
- typedef TessCallback2<A1, A2> base;
- using MemberSignature = void (T::*)(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_ = nullptr;
- delete this;
- }
- }
- };
- #ifndef SWIG
- template <class T1, class T2, class R, class A1, class A2>
- inline typename _TessMemberResultCallback_0_2<false, R, T1, A1, A2>::base*
- NewPermanentTessCallback(T1* obj, R (T2::*member)(A1, A2)) {
- return new _TessMemberResultCallback_0_2<false, R, T1, A1, A2>(obj, member);
- }
- #endif
- template <bool del, class R, class A1, class A2>
- class _TessFunctionResultCallback_0_2 : public TessResultCallback2<R, A1, A2> {
- public:
- typedef TessResultCallback2<R, A1, A2> base;
- using FunctionSignature = R (*)(A1, A2);
- private:
- FunctionSignature function_;
- public:
- inline explicit _TessFunctionResultCallback_0_2(FunctionSignature function)
- : function_(function) {}
- R Run(A1 a1, A2 a2) override {
- if (!del) {
- R result = (*function_)(a1, a2);
- return result;
- }
- R result = (*function_)(a1, a2);
- // zero out the pointer to ensure segfault if used again
- function_ = nullptr;
- delete this;
- return result;
- }
- };
- template <bool del, class A1, class A2>
- class _TessFunctionResultCallback_0_2<del, void, A1, A2>
- : public TessCallback2<A1, A2> {
- public:
- typedef TessCallback2<A1, A2> base;
- using FunctionSignature = void (*)(A1, A2);
- private:
- FunctionSignature function_;
- public:
- inline explicit _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_ = nullptr;
- delete this;
- }
- }
- };
- template <class R, class A1, class A2>
- inline typename _TessFunctionResultCallback_0_2<false, R, A1, A2>::base*
- NewPermanentTessCallback(R (*function)(A1, A2)) {
- return new _TessFunctionResultCallback_0_2<false, R, A1, A2>(function);
- }
- template <bool del, class R, class T, class P1, class P2, class A1, class A2>
- class _TessMemberResultCallback_2_2 : public TessResultCallback2<R, A1, A2> {
- public:
- typedef TessResultCallback2<R, A1, A2> base;
- using MemberSignature = R (T::*)(P1, P2, A1, A2);
- private:
- T* object_;
- MemberSignature member_;
- typename remove_reference<P1>::type p1_;
- typename remove_reference<P2>::type p2_;
- public:
- inline _TessMemberResultCallback_2_2(T* object, MemberSignature member, P1 p1,
- P2 p2)
- : object_(object), member_(member), p1_(p1), p2_(p2) {}
- R Run(A1 a1, A2 a2) override {
- if (!del) {
- R result = (object_->*member_)(p1_, p2_, a1, a2);
- return result;
- }
- R result = (object_->*member_)(p1_, p2_, a1, a2);
- // zero out the pointer to ensure segfault if used again
- member_ = nullptr;
- delete this;
- return result;
- }
- };
- #ifndef SWIG
- template <class T1, class T2, class R, class P1, class P2, class A1, class A2>
- inline
- typename _TessMemberResultCallback_2_2<false, R, T1, P1, P2, A1, A2>::base*
- NewPermanentTessCallback(T1* obj, R (T2::*member)(P1, P2, A1, A2),
- typename Identity<P1>::type p1,
- typename Identity<P2>::type p2) {
- return new _TessMemberResultCallback_2_2<false, R, T1, P1, P2, A1, A2>(
- obj, member, p1, p2);
- }
- #endif
- template <bool del, class R, class T, class A1, class A2, class A3>
- class _ConstTessMemberResultCallback_0_3
- : public TessResultCallback3<R, A1, A2, A3> {
- public:
- typedef TessResultCallback3<R, A1, A2, A3> base;
- using MemberSignature = R (T::*)(A1, A2, A3) const;
- private:
- const T* object_;
- MemberSignature member_;
- public:
- inline _ConstTessMemberResultCallback_0_3(const T* object,
- MemberSignature member)
- : object_(object), member_(member) {}
- R Run(A1 a1, A2 a2, A3 a3) override {
- if (!del) {
- R result = (object_->*member_)(a1, a2, a3);
- return result;
- }
- R result = (object_->*member_)(a1, a2, a3);
- // zero out the pointer to ensure segfault if used again
- member_ = nullptr;
- delete this;
- return result;
- }
- };
- #ifndef SWIG
- template <class T1, class T2, class R, class A1, class A2, class A3>
- inline
- typename _ConstTessMemberResultCallback_0_3<false, R, T1, A1, A2, A3>::base*
- NewPermanentTessCallback(const T1* obj, R (T2::*member)(A1, A2, A3) const) {
- return new _ConstTessMemberResultCallback_0_3<false, R, T1, A1, A2, A3>(
- obj, member);
- }
- #endif
- template <bool del, class R, class T, class A1, class A2, class A3, class A4>
- class _TessMemberResultCallback_0_4
- : public TessResultCallback4<R, A1, A2, A3, A4> {
- public:
- typedef TessResultCallback4<R, A1, A2, A3, A4> base;
- using MemberSignature = R (T::*)(A1, A2, A3, A4);
- private:
- T* object_;
- MemberSignature member_;
- public:
- inline _TessMemberResultCallback_0_4(T* object, MemberSignature member)
- : object_(object), member_(member) {}
- virtual R Run(A1 a1, A2 a2, A3 a3, A4 a4) {
- if (!del) {
- R result = (object_->*member_)(a1, a2, a3, a4);
- return result;
- }
- R result = (object_->*member_)(a1, a2, a3, a4);
- // zero out the pointer to ensure segfault if used again
- member_ = nullptr;
- delete this;
- return result;
- }
- };
- #ifndef SWIG
- template <class T1, class T2, class R, class A1, class A2, class A3, class A4>
- inline
- typename _TessMemberResultCallback_0_4<false, R, T1, A1, A2, A3, A4>::base*
- NewPermanentTessCallback(T1* obj, R (T2::*member)(A1, A2, A3, A4)) {
- return new _TessMemberResultCallback_0_4<false, R, T1, A1, A2, A3, A4>(
- obj, member);
- }
- #endif
- #endif // TESS_CALLBACK_SPECIALIZATIONS_H_
|