tesscallback.h 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916
  1. ///////////////////////////////////////////////////////////////////////
  2. // File: tesscallback.h
  3. // Description: classes and functions to replace pointer-to-functions
  4. // Author: Samuel Charron
  5. //
  6. // (C) Copyright 2006, Google Inc.
  7. // Licensed under the Apache License, Version 2.0 (the "License");
  8. // you may not use this file except in compliance with the License.
  9. // You may obtain a copy of the License at
  10. // http://www.apache.org/licenses/LICENSE-2.0
  11. // Unless required by applicable law or agreed to in writing, software
  12. // distributed under the License is distributed on an "AS IS" BASIS,
  13. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. // See the License for the specific language governing permissions and
  15. // limitations under the License.
  16. //
  17. ///////////////////////////////////////////////////////////////////////
  18. #ifndef TESS_CALLBACK_SPECIALIZATIONS_H_
  19. #define TESS_CALLBACK_SPECIALIZATIONS_H_
  20. class TessClosure {
  21. public:
  22. virtual ~TessClosure();
  23. virtual void Run() = 0;
  24. };
  25. template <class R>
  26. class TessResultCallback {
  27. public:
  28. virtual ~TessResultCallback() = default;
  29. virtual R Run() = 0;
  30. };
  31. template <bool del, class R, class T>
  32. class _TessMemberResultCallback_0_0 : public TessResultCallback<R> {
  33. public:
  34. using base = TessResultCallback<R>;
  35. using MemberSignature = R (T::*)();
  36. private:
  37. T* object_;
  38. MemberSignature member_;
  39. public:
  40. inline _TessMemberResultCallback_0_0(T* object, MemberSignature member)
  41. : object_(object), member_(member) {}
  42. R Run() override {
  43. if (!del) {
  44. R result = (object_->*member_)();
  45. return result;
  46. }
  47. R result = (object_->*member_)();
  48. // zero out the pointer to ensure segfault if used again
  49. member_ = nullptr;
  50. delete this;
  51. return result;
  52. }
  53. };
  54. template <bool del, class T>
  55. class _TessMemberResultCallback_0_0<del, void, T> : public TessClosure {
  56. public:
  57. using base = TessClosure;
  58. using MemberSignature = void (T::*)();
  59. private:
  60. T* object_;
  61. MemberSignature member_;
  62. public:
  63. inline _TessMemberResultCallback_0_0(T* object, MemberSignature member)
  64. : object_(object), member_(member) {}
  65. void Run() override {
  66. if (!del) {
  67. (object_->*member_)();
  68. } else {
  69. (object_->*member_)();
  70. // zero out the pointer to ensure segfault if used again
  71. member_ = nullptr;
  72. delete this;
  73. }
  74. }
  75. };
  76. #ifndef SWIG
  77. template <class T1, class T2, class R>
  78. inline typename _TessMemberResultCallback_0_0<true, R, T1>::base*
  79. NewTessCallback(T1* obj, R (T2::*member)()) {
  80. return new _TessMemberResultCallback_0_0<true, R, T1>(obj, member);
  81. }
  82. #endif
  83. template <bool del, class R>
  84. class _TessFunctionResultCallback_0_0 : public TessResultCallback<R> {
  85. public:
  86. using base = TessResultCallback<R>;
  87. using FunctionSignature = R (*)();
  88. private:
  89. FunctionSignature function_;
  90. public:
  91. inline explicit _TessFunctionResultCallback_0_0(FunctionSignature function)
  92. : function_(function) {}
  93. virtual R Run() {
  94. if (!del) {
  95. R result = (*function_)();
  96. return result;
  97. }
  98. R result = (*function_)();
  99. // zero out the pointer to ensure segfault if used again
  100. function_ = nullptr;
  101. delete this;
  102. return result;
  103. }
  104. };
  105. template <bool del>
  106. class _TessFunctionResultCallback_0_0<del, void> : public TessClosure {
  107. public:
  108. using base = TessClosure;
  109. using FunctionSignature = void (*)();
  110. private:
  111. FunctionSignature function_;
  112. public:
  113. inline explicit _TessFunctionResultCallback_0_0(FunctionSignature function)
  114. : function_(function) {}
  115. void Run() override {
  116. if (!del) {
  117. (*function_)();
  118. } else {
  119. (*function_)();
  120. // zero out the pointer to ensure segfault if used again
  121. function_ = nullptr;
  122. delete this;
  123. }
  124. }
  125. };
  126. template <class R>
  127. inline typename _TessFunctionResultCallback_0_0<true, R>::base* NewTessCallback(
  128. R (*function)()) {
  129. return new _TessFunctionResultCallback_0_0<true, R>(function);
  130. }
  131. // Specified by TR1 [4.7.2] Reference modifications.
  132. template <class T>
  133. struct remove_reference;
  134. template <typename T>
  135. struct remove_reference {
  136. using type = T;
  137. };
  138. template <typename T>
  139. struct remove_reference<T&> {
  140. using type = T;
  141. };
  142. // Identity<T>::type is a typedef of T. Useful for preventing the
  143. // compiler from inferring the type of an argument in templates.
  144. template <typename T>
  145. struct Identity {
  146. using type = T;
  147. };
  148. template <bool del, class R, class T, class P1, class P2, class P3, class P4,
  149. class P5>
  150. class _ConstTessMemberResultCallback_5_0 : public TessResultCallback<R> {
  151. public:
  152. using base = TessResultCallback<R>;
  153. using MemberSignature = R (T::*)(P1, P2, P3, P4, P5) const;
  154. private:
  155. const T* object_;
  156. MemberSignature member_;
  157. typename remove_reference<P1>::type p1_;
  158. typename remove_reference<P2>::type p2_;
  159. typename remove_reference<P3>::type p3_;
  160. typename remove_reference<P4>::type p4_;
  161. typename remove_reference<P5>::type p5_;
  162. public:
  163. inline _ConstTessMemberResultCallback_5_0(const T* object,
  164. MemberSignature member, P1 p1,
  165. P2 p2, P3 p3, P4 p4, P5 p5)
  166. : object_(object),
  167. member_(member),
  168. p1_(p1),
  169. p2_(p2),
  170. p3_(p3),
  171. p4_(p4),
  172. p5_(p5) {}
  173. R Run() override {
  174. if (!del) {
  175. R result = (object_->*member_)(p1_, p2_, p3_, p4_, p5_);
  176. return result;
  177. }
  178. R result = (object_->*member_)(p1_, p2_, p3_, p4_, p5_);
  179. // zero out the pointer to ensure segfault if used again
  180. member_ = nullptr;
  181. delete this;
  182. return result;
  183. }
  184. };
  185. template <bool del, class T, class P1, class P2, class P3, class P4, class P5>
  186. class _ConstTessMemberResultCallback_5_0<del, void, T, P1, P2, P3, P4, P5>
  187. : public TessClosure {
  188. public:
  189. using base = TessClosure;
  190. using MemberSignature = void (T::*)(P1, P2, P3, P4, P5) const;
  191. private:
  192. const T* object_;
  193. MemberSignature member_;
  194. typename remove_reference<P1>::type p1_;
  195. typename remove_reference<P2>::type p2_;
  196. typename remove_reference<P3>::type p3_;
  197. typename remove_reference<P4>::type p4_;
  198. typename remove_reference<P5>::type p5_;
  199. public:
  200. inline _ConstTessMemberResultCallback_5_0(const T* object,
  201. MemberSignature member, P1 p1,
  202. P2 p2, P3 p3, P4 p4, P5 p5)
  203. : object_(object),
  204. member_(member),
  205. p1_(p1),
  206. p2_(p2),
  207. p3_(p3),
  208. p4_(p4),
  209. p5_(p5) {}
  210. void Run() override {
  211. if (!del) {
  212. (object_->*member_)(p1_, p2_, p3_, p4_, p5_);
  213. } else {
  214. (object_->*member_)(p1_, p2_, p3_, p4_, p5_);
  215. // zero out the pointer to ensure segfault if used again
  216. member_ = nullptr;
  217. delete this;
  218. }
  219. }
  220. };
  221. #ifndef SWIG
  222. template <class T1, class T2, class R, class P1, class P2, class P3, class P4,
  223. class P5>
  224. inline typename _ConstTessMemberResultCallback_5_0<false, R, T1, P1, P2, P3, P4,
  225. P5>::base*
  226. NewPermanentTessCallback(const T1* obj,
  227. R (T2::*member)(P1, P2, P3, P4, P5) const,
  228. typename Identity<P1>::type p1,
  229. typename Identity<P2>::type p2,
  230. typename Identity<P3>::type p3,
  231. typename Identity<P4>::type p4,
  232. typename Identity<P5>::type p5) {
  233. return new _ConstTessMemberResultCallback_5_0<false, R, T1, P1, P2, P3, P4,
  234. P5>(obj, member, p1, p2, p3, p4,
  235. p5);
  236. }
  237. #endif
  238. template <bool del, class R, class T, class P1, class P2, class P3, class P4,
  239. class P5, class P6>
  240. class _ConstTessMemberResultCallback_6_0 : public TessResultCallback<R> {
  241. public:
  242. using base = TessResultCallback<R>;
  243. using MemberSignature = R (T::*)(P1, P2, P3, P4, P5, P6) const;
  244. private:
  245. const T* object_;
  246. MemberSignature member_;
  247. typename remove_reference<P1>::type p1_;
  248. typename remove_reference<P2>::type p2_;
  249. typename remove_reference<P3>::type p3_;
  250. typename remove_reference<P4>::type p4_;
  251. typename remove_reference<P5>::type p5_;
  252. typename remove_reference<P6>::type p6_;
  253. public:
  254. inline _ConstTessMemberResultCallback_6_0(const T* object,
  255. MemberSignature member, P1 p1,
  256. P2 p2, P3 p3, P4 p4, P5 p5, P6 p6)
  257. : object_(object),
  258. member_(member),
  259. p1_(p1),
  260. p2_(p2),
  261. p3_(p3),
  262. p4_(p4),
  263. p5_(p5),
  264. p6_(p6) {}
  265. R Run() override {
  266. if (!del) {
  267. R result = (object_->*member_)(p1_, p2_, p3_, p4_, p5_, p6_);
  268. return result;
  269. }
  270. R result = (object_->*member_)(p1_, p2_, p3_, p4_, p5_, p6_);
  271. // zero out the pointer to ensure segfault if used again
  272. member_ = nullptr;
  273. delete this;
  274. return result;
  275. }
  276. };
  277. template <bool del, class T, class P1, class P2, class P3, class P4, class P5,
  278. class P6>
  279. class _ConstTessMemberResultCallback_6_0<del, void, T, P1, P2, P3, P4, P5, P6>
  280. : public TessClosure {
  281. public:
  282. using base = TessClosure;
  283. using MemberSignature = void (T::*)(P1, P2, P3, P4, P5, P6) const;
  284. private:
  285. const T* object_;
  286. MemberSignature member_;
  287. typename remove_reference<P1>::type p1_;
  288. typename remove_reference<P2>::type p2_;
  289. typename remove_reference<P3>::type p3_;
  290. typename remove_reference<P4>::type p4_;
  291. typename remove_reference<P5>::type p5_;
  292. typename remove_reference<P6>::type p6_;
  293. public:
  294. inline _ConstTessMemberResultCallback_6_0(const T* object,
  295. MemberSignature member, P1 p1,
  296. P2 p2, P3 p3, P4 p4, P5 p5, P6 p6)
  297. : object_(object),
  298. member_(member),
  299. p1_(p1),
  300. p2_(p2),
  301. p3_(p3),
  302. p4_(p4),
  303. p5_(p5),
  304. p6_(p6) {}
  305. void Run() override {
  306. if (!del) {
  307. (object_->*member_)(p1_, p2_, p3_, p4_, p5_, p6_);
  308. } else {
  309. (object_->*member_)(p1_, p2_, p3_, p4_, p5_, p6_);
  310. // zero out the pointer to ensure segfault if used again
  311. member_ = nullptr;
  312. delete this;
  313. }
  314. }
  315. };
  316. #ifndef SWIG
  317. template <class T1, class T2, class R, class P1, class P2, class P3, class P4,
  318. class P5, class P6>
  319. inline typename _ConstTessMemberResultCallback_6_0<false, R, T1, P1, P2, P3, P4,
  320. P5, P6>::base*
  321. NewPermanentTessCallback(
  322. const T1* obj, R (T2::*member)(P1, P2, P3, P4, P5, P6) const,
  323. typename Identity<P1>::type p1, typename Identity<P2>::type p2,
  324. typename Identity<P3>::type p3, typename Identity<P4>::type p4,
  325. typename Identity<P5>::type p5, typename Identity<P6>::type p6) {
  326. return new _ConstTessMemberResultCallback_6_0<false, R, T1, P1, P2, P3, P4,
  327. P5, P6>(obj, member, p1, p2, p3,
  328. p4, p5, p6);
  329. }
  330. #endif
  331. template <class A1>
  332. class TessCallback1 {
  333. public:
  334. virtual ~TessCallback1() = default;
  335. virtual void Run(A1) = 0;
  336. };
  337. template <class R, class A1>
  338. class TessResultCallback1 {
  339. public:
  340. virtual ~TessResultCallback1() = default;
  341. virtual R Run(A1) = 0;
  342. };
  343. template <class A1, class A2>
  344. class TessCallback2 {
  345. public:
  346. virtual ~TessCallback2() = default;
  347. virtual void Run(A1, A2) = 0;
  348. };
  349. template <class R, class A1, class A2>
  350. class TessResultCallback2 {
  351. public:
  352. virtual ~TessResultCallback2() = default;
  353. virtual R Run(A1, A2) = 0;
  354. };
  355. template <class A1, class A2, class A3>
  356. class TessCallback3 {
  357. public:
  358. virtual ~TessCallback3() = default;
  359. virtual void Run(A1, A2, A3) = 0;
  360. };
  361. template <class R, class A1, class A2, class A3>
  362. class TessResultCallback3 {
  363. public:
  364. virtual ~TessResultCallback3() = default;
  365. virtual R Run(A1, A2, A3) = 0;
  366. };
  367. template <class A1, class A2, class A3, class A4>
  368. class TessCallback4 {
  369. public:
  370. virtual ~TessCallback4() = default;
  371. virtual void Run(A1, A2, A3, A4) = 0;
  372. };
  373. template <class R, class A1, class A2, class A3, class A4>
  374. class TessResultCallback4 {
  375. public:
  376. virtual ~TessResultCallback4() = default;
  377. virtual R Run(A1, A2, A3, A4) = 0;
  378. };
  379. template <bool del, class R, class T, class A1>
  380. class _TessMemberResultCallback_0_1 : public TessResultCallback1<R, A1> {
  381. public:
  382. typedef TessResultCallback1<R, A1> base;
  383. using MemberSignature = R (T::*)(A1);
  384. private:
  385. T* object_;
  386. MemberSignature member_;
  387. public:
  388. inline _TessMemberResultCallback_0_1(T* object, MemberSignature member)
  389. : object_(object), member_(member) {}
  390. R Run(A1 a1) override {
  391. if (!del) {
  392. R result = (object_->*member_)(a1);
  393. return result;
  394. }
  395. R result = (object_->*member_)(a1);
  396. // zero out the pointer to ensure segfault if used again
  397. member_ = nullptr;
  398. delete this;
  399. return result;
  400. }
  401. };
  402. template <bool del, class T, class A1>
  403. class _TessMemberResultCallback_0_1<del, void, T, A1>
  404. : public TessCallback1<A1> {
  405. public:
  406. using base = TessCallback1<A1>;
  407. using MemberSignature = void (T::*)(A1);
  408. private:
  409. T* object_;
  410. MemberSignature member_;
  411. public:
  412. inline _TessMemberResultCallback_0_1(T* object, MemberSignature member)
  413. : object_(object), member_(member) {}
  414. void Run(A1 a1) override {
  415. if (!del) {
  416. (object_->*member_)(a1);
  417. } else {
  418. (object_->*member_)(a1);
  419. // zero out the pointer to ensure segfault if used again
  420. member_ = nullptr;
  421. delete this;
  422. }
  423. }
  424. };
  425. #ifndef SWIG
  426. template <class T1, class T2, class R, class A1>
  427. inline typename _TessMemberResultCallback_0_1<false, R, T1, A1>::base*
  428. NewPermanentTessCallback(T1* obj, R (T2::*member)(A1)) {
  429. return new _TessMemberResultCallback_0_1<false, R, T1, A1>(obj, member);
  430. }
  431. #endif
  432. template <bool del, class R, class A1>
  433. class _TessFunctionResultCallback_0_1 : public TessResultCallback1<R, A1> {
  434. public:
  435. typedef TessResultCallback1<R, A1> base;
  436. using FunctionSignature = R (*)(A1);
  437. private:
  438. FunctionSignature function_;
  439. public:
  440. inline explicit _TessFunctionResultCallback_0_1(FunctionSignature function)
  441. : function_(function) {}
  442. virtual R Run(A1 a1) {
  443. if (!del) {
  444. R result = (*function_)(a1);
  445. return result;
  446. }
  447. R result = (*function_)(a1);
  448. // zero out the pointer to ensure segfault if used again
  449. function_ = nullptr;
  450. delete this;
  451. return result;
  452. }
  453. };
  454. template <bool del, class A1>
  455. class _TessFunctionResultCallback_0_1<del, void, A1>
  456. : public TessCallback1<A1> {
  457. public:
  458. using base = TessCallback1<A1>;
  459. using FunctionSignature = void (*)(A1);
  460. private:
  461. FunctionSignature function_;
  462. public:
  463. inline explicit _TessFunctionResultCallback_0_1(FunctionSignature function)
  464. : function_(function) {}
  465. void Run(A1 a1) override {
  466. if (!del) {
  467. (*function_)(a1);
  468. } else {
  469. (*function_)(a1);
  470. // zero out the pointer to ensure segfault if used again
  471. function_ = nullptr;
  472. delete this;
  473. }
  474. }
  475. };
  476. template <class R, class A1>
  477. inline typename _TessFunctionResultCallback_0_1<false, R, A1>::base*
  478. NewPermanentTessCallback(R (*function)(A1)) {
  479. return new _TessFunctionResultCallback_0_1<false, R, A1>(function);
  480. }
  481. template <bool del, class R, class P1, class A1>
  482. class _TessFunctionResultCallback_1_1 : public TessResultCallback1<R, A1> {
  483. public:
  484. typedef TessResultCallback1<R, A1> base;
  485. using FunctionSignature = R (*)(P1, A1);
  486. private:
  487. FunctionSignature function_;
  488. typename remove_reference<P1>::type p1_;
  489. public:
  490. inline _TessFunctionResultCallback_1_1(FunctionSignature function, P1 p1)
  491. : function_(function), p1_(p1) {}
  492. virtual R Run(A1 a1) {
  493. if (!del) {
  494. R result = (*function_)(p1_, a1);
  495. return result;
  496. }
  497. R result = (*function_)(p1_, a1);
  498. // zero out the pointer to ensure segfault if used again
  499. function_ = nullptr;
  500. delete this;
  501. return result;
  502. }
  503. };
  504. template <bool del, class P1, class A1>
  505. class _TessFunctionResultCallback_1_1<del, void, P1, A1>
  506. : public TessCallback1<A1> {
  507. public:
  508. using base = TessCallback1<A1>;
  509. using FunctionSignature = void (*)(P1, A1);
  510. private:
  511. FunctionSignature function_;
  512. typename remove_reference<P1>::type p1_;
  513. public:
  514. inline _TessFunctionResultCallback_1_1(FunctionSignature function, P1 p1)
  515. : function_(function), p1_(p1) {}
  516. void Run(A1 a1) override {
  517. if (!del) {
  518. (*function_)(p1_, a1);
  519. } else {
  520. (*function_)(p1_, a1);
  521. // zero out the pointer to ensure segfault if used again
  522. function_ = nullptr;
  523. delete this;
  524. }
  525. }
  526. };
  527. template <class R, class P1, class A1>
  528. inline typename _TessFunctionResultCallback_1_1<false, R, P1, A1>::base*
  529. NewPermanentTessCallback(R (*function)(P1, A1),
  530. typename Identity<P1>::type p1) {
  531. return new _TessFunctionResultCallback_1_1<false, R, P1, A1>(function, p1);
  532. }
  533. template <bool del, class R, class T, class A1, class A2>
  534. class _ConstTessMemberResultCallback_0_2
  535. : public TessResultCallback2<R, A1, A2> {
  536. public:
  537. typedef TessResultCallback2<R, A1, A2> base;
  538. using MemberSignature = R (T::*)(A1, A2) const;
  539. private:
  540. const T* object_;
  541. MemberSignature member_;
  542. public:
  543. inline _ConstTessMemberResultCallback_0_2(const T* object,
  544. MemberSignature member)
  545. : object_(object), member_(member) {}
  546. R Run(A1 a1, A2 a2) override {
  547. if (!del) {
  548. R result = (object_->*member_)(a1, a2);
  549. return result;
  550. }
  551. R result = (object_->*member_)(a1, a2);
  552. // zero out the pointer to ensure segfault if used again
  553. member_ = nullptr;
  554. delete this;
  555. return result;
  556. }
  557. };
  558. template <bool del, class T, class A1, class A2>
  559. class _ConstTessMemberResultCallback_0_2<del, void, T, A1, A2>
  560. : public TessCallback2<A1, A2> {
  561. public:
  562. typedef TessCallback2<A1, A2> base;
  563. using MemberSignature = void (T::*)(A1, A2) const;
  564. private:
  565. const T* object_;
  566. MemberSignature member_;
  567. public:
  568. inline _ConstTessMemberResultCallback_0_2(const T* object,
  569. MemberSignature member)
  570. : object_(object), member_(member) {}
  571. virtual void Run(A1 a1, A2 a2) {
  572. if (!del) {
  573. (object_->*member_)(a1, a2);
  574. } else {
  575. (object_->*member_)(a1, a2);
  576. // zero out the pointer to ensure segfault if used again
  577. member_ = nullptr;
  578. delete this;
  579. }
  580. }
  581. };
  582. #ifndef SWIG
  583. template <class T1, class T2, class R, class A1, class A2>
  584. inline typename _ConstTessMemberResultCallback_0_2<false, R, T1, A1, A2>::base*
  585. NewPermanentTessCallback(const T1* obj, R (T2::*member)(A1, A2) const) {
  586. return new _ConstTessMemberResultCallback_0_2<false, R, T1, A1, A2>(obj,
  587. member);
  588. }
  589. #endif
  590. template <bool del, class R, class T, class A1, class A2>
  591. class _TessMemberResultCallback_0_2 : public TessResultCallback2<R, A1, A2> {
  592. public:
  593. typedef TessResultCallback2<R, A1, A2> base;
  594. using MemberSignature = R (T::*)(A1, A2);
  595. private:
  596. T* object_;
  597. MemberSignature member_;
  598. public:
  599. inline _TessMemberResultCallback_0_2(T* object, MemberSignature member)
  600. : object_(object), member_(member) {}
  601. R Run(A1 a1, A2 a2) override {
  602. if (!del) {
  603. R result = (object_->*member_)(a1, a2);
  604. return result;
  605. }
  606. R result = (object_->*member_)(a1, a2);
  607. // zero out the pointer to ensure segfault if used again
  608. member_ = nullptr;
  609. delete this;
  610. return result;
  611. }
  612. };
  613. template <bool del, class T, class A1, class A2>
  614. class _TessMemberResultCallback_0_2<del, void, T, A1, A2>
  615. : public TessCallback2<A1, A2> {
  616. public:
  617. typedef TessCallback2<A1, A2> base;
  618. using MemberSignature = void (T::*)(A1, A2);
  619. private:
  620. T* object_;
  621. MemberSignature member_;
  622. public:
  623. inline _TessMemberResultCallback_0_2(T* object, MemberSignature member)
  624. : object_(object), member_(member) {}
  625. virtual void Run(A1 a1, A2 a2) {
  626. if (!del) {
  627. (object_->*member_)(a1, a2);
  628. } else {
  629. (object_->*member_)(a1, a2);
  630. // zero out the pointer to ensure segfault if used again
  631. member_ = nullptr;
  632. delete this;
  633. }
  634. }
  635. };
  636. #ifndef SWIG
  637. template <class T1, class T2, class R, class A1, class A2>
  638. inline typename _TessMemberResultCallback_0_2<false, R, T1, A1, A2>::base*
  639. NewPermanentTessCallback(T1* obj, R (T2::*member)(A1, A2)) {
  640. return new _TessMemberResultCallback_0_2<false, R, T1, A1, A2>(obj, member);
  641. }
  642. #endif
  643. template <bool del, class R, class A1, class A2>
  644. class _TessFunctionResultCallback_0_2 : public TessResultCallback2<R, A1, A2> {
  645. public:
  646. typedef TessResultCallback2<R, A1, A2> base;
  647. using FunctionSignature = R (*)(A1, A2);
  648. private:
  649. FunctionSignature function_;
  650. public:
  651. inline explicit _TessFunctionResultCallback_0_2(FunctionSignature function)
  652. : function_(function) {}
  653. R Run(A1 a1, A2 a2) override {
  654. if (!del) {
  655. R result = (*function_)(a1, a2);
  656. return result;
  657. }
  658. R result = (*function_)(a1, a2);
  659. // zero out the pointer to ensure segfault if used again
  660. function_ = nullptr;
  661. delete this;
  662. return result;
  663. }
  664. };
  665. template <bool del, class A1, class A2>
  666. class _TessFunctionResultCallback_0_2<del, void, A1, A2>
  667. : public TessCallback2<A1, A2> {
  668. public:
  669. typedef TessCallback2<A1, A2> base;
  670. using FunctionSignature = void (*)(A1, A2);
  671. private:
  672. FunctionSignature function_;
  673. public:
  674. inline explicit _TessFunctionResultCallback_0_2(FunctionSignature function)
  675. : function_(function) {}
  676. virtual void Run(A1 a1, A2 a2) {
  677. if (!del) {
  678. (*function_)(a1, a2);
  679. } else {
  680. (*function_)(a1, a2);
  681. // zero out the pointer to ensure segfault if used again
  682. function_ = nullptr;
  683. delete this;
  684. }
  685. }
  686. };
  687. template <class R, class A1, class A2>
  688. inline typename _TessFunctionResultCallback_0_2<false, R, A1, A2>::base*
  689. NewPermanentTessCallback(R (*function)(A1, A2)) {
  690. return new _TessFunctionResultCallback_0_2<false, R, A1, A2>(function);
  691. }
  692. template <bool del, class R, class T, class P1, class P2, class A1, class A2>
  693. class _TessMemberResultCallback_2_2 : public TessResultCallback2<R, A1, A2> {
  694. public:
  695. typedef TessResultCallback2<R, A1, A2> base;
  696. using MemberSignature = R (T::*)(P1, P2, A1, A2);
  697. private:
  698. T* object_;
  699. MemberSignature member_;
  700. typename remove_reference<P1>::type p1_;
  701. typename remove_reference<P2>::type p2_;
  702. public:
  703. inline _TessMemberResultCallback_2_2(T* object, MemberSignature member, P1 p1,
  704. P2 p2)
  705. : object_(object), member_(member), p1_(p1), p2_(p2) {}
  706. R Run(A1 a1, A2 a2) override {
  707. if (!del) {
  708. R result = (object_->*member_)(p1_, p2_, a1, a2);
  709. return result;
  710. }
  711. R result = (object_->*member_)(p1_, p2_, a1, a2);
  712. // zero out the pointer to ensure segfault if used again
  713. member_ = nullptr;
  714. delete this;
  715. return result;
  716. }
  717. };
  718. #ifndef SWIG
  719. template <class T1, class T2, class R, class P1, class P2, class A1, class A2>
  720. inline
  721. typename _TessMemberResultCallback_2_2<false, R, T1, P1, P2, A1, A2>::base*
  722. NewPermanentTessCallback(T1* obj, R (T2::*member)(P1, P2, A1, A2),
  723. typename Identity<P1>::type p1,
  724. typename Identity<P2>::type p2) {
  725. return new _TessMemberResultCallback_2_2<false, R, T1, P1, P2, A1, A2>(
  726. obj, member, p1, p2);
  727. }
  728. #endif
  729. template <bool del, class R, class T, class A1, class A2, class A3>
  730. class _ConstTessMemberResultCallback_0_3
  731. : public TessResultCallback3<R, A1, A2, A3> {
  732. public:
  733. typedef TessResultCallback3<R, A1, A2, A3> base;
  734. using MemberSignature = R (T::*)(A1, A2, A3) const;
  735. private:
  736. const T* object_;
  737. MemberSignature member_;
  738. public:
  739. inline _ConstTessMemberResultCallback_0_3(const T* object,
  740. MemberSignature member)
  741. : object_(object), member_(member) {}
  742. R Run(A1 a1, A2 a2, A3 a3) override {
  743. if (!del) {
  744. R result = (object_->*member_)(a1, a2, a3);
  745. return result;
  746. }
  747. R result = (object_->*member_)(a1, a2, a3);
  748. // zero out the pointer to ensure segfault if used again
  749. member_ = nullptr;
  750. delete this;
  751. return result;
  752. }
  753. };
  754. #ifndef SWIG
  755. template <class T1, class T2, class R, class A1, class A2, class A3>
  756. inline
  757. typename _ConstTessMemberResultCallback_0_3<false, R, T1, A1, A2, A3>::base*
  758. NewPermanentTessCallback(const T1* obj, R (T2::*member)(A1, A2, A3) const) {
  759. return new _ConstTessMemberResultCallback_0_3<false, R, T1, A1, A2, A3>(
  760. obj, member);
  761. }
  762. #endif
  763. template <bool del, class R, class T, class A1, class A2, class A3, class A4>
  764. class _TessMemberResultCallback_0_4
  765. : public TessResultCallback4<R, A1, A2, A3, A4> {
  766. public:
  767. typedef TessResultCallback4<R, A1, A2, A3, A4> base;
  768. using MemberSignature = R (T::*)(A1, A2, A3, A4);
  769. private:
  770. T* object_;
  771. MemberSignature member_;
  772. public:
  773. inline _TessMemberResultCallback_0_4(T* object, MemberSignature member)
  774. : object_(object), member_(member) {}
  775. virtual R Run(A1 a1, A2 a2, A3 a3, A4 a4) {
  776. if (!del) {
  777. R result = (object_->*member_)(a1, a2, a3, a4);
  778. return result;
  779. }
  780. R result = (object_->*member_)(a1, a2, a3, a4);
  781. // zero out the pointer to ensure segfault if used again
  782. member_ = nullptr;
  783. delete this;
  784. return result;
  785. }
  786. };
  787. #ifndef SWIG
  788. template <class T1, class T2, class R, class A1, class A2, class A3, class A4>
  789. inline
  790. typename _TessMemberResultCallback_0_4<false, R, T1, A1, A2, A3, A4>::base*
  791. NewPermanentTessCallback(T1* obj, R (T2::*member)(A1, A2, A3, A4)) {
  792. return new _TessMemberResultCallback_0_4<false, R, T1, A1, A2, A3, A4>(
  793. obj, member);
  794. }
  795. #endif
  796. #endif // TESS_CALLBACK_SPECIALIZATIONS_H_