ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/gvpe/src/callback.h
Revision: 1.16
Committed: Sun Nov 18 00:02:56 2018 UTC (5 years, 6 months ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Changes since 1.15: +13 -368 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 pcg 1.1 /*
2 pcg 1.15 * callback.h -- C++ callback mechanism
3 root 1.16 * Copyright (C) 2003-2018 Marc Lehmann <pcg@goof.com>
4 pcg 1.15 *
5     * This file is part of GVPE.
6     *
7     * This program is free software; you can redistribute it and/or modify it
8     * under the terms of the GNU General Public License as published by the
9     * Free Software Foundation; either version 3 of the License, or (at your
10     * option) any later version.
11     *
12     * This program is distributed in the hope that it will be useful, but
13     * WITHOUT ANY WARRANTY; without even the implied warranty of
14     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
15     * Public License for more details.
16     *
17     * You should have received a copy of the GNU General Public License along
18     * with this program; if not, see <http://www.gnu.org/licenses/>.
19     *
20     * Additional permission under GNU GPL version 3 section 7
21     *
22     * If you modify this Program, or any covered work, by linking or
23     * combining it with the OpenSSL project's OpenSSL library (or a modified
24     * version of that library), containing parts covered by the terms of the
25     * OpenSSL or SSLeay licenses, the licensors of this Program grant you
26     * additional permission to convey the resulting work. Corresponding
27     * Source for a non-source form of such a combination shall include the
28     * source code for the parts of OpenSSL used as well as that of the
29     * covered work.
30 pcg 1.1 */
31    
32 pcg 1.4 #ifndef CALLBACK_H__
33     #define CALLBACK_H__
34 pcg 1.1
35 root 1.16 #define CALLBACK_H_VERSION 4
36 pcg 1.10
37 pcg 1.12 template<typename signature>
38     struct callback;
39 pcg 1.10
40 root 1.16 template<class R, class ...Args>
41     struct callback<R (Args...)>
42 pcg 1.14 {
43 root 1.16 typedef R (*ptr_type)(void *self, Args...);
44 pcg 1.2
45 root 1.16 template<class K, R (K::*method)(Args...)>
46 pcg 1.12 void set (K *object)
47 pcg 1.11 {
48 pcg 1.12 self = object;
49     func = thunk<K, method>;
50 pcg 1.11 }
51    
52 root 1.16 R call (Args... args) const
53 pcg 1.11 {
54 root 1.16 return func (self, args...);
55 pcg 1.11 }
56 pcg 1.2
57 root 1.16 R operator ()(Args... args) const
58 pcg 1.11 {
59 root 1.16 return call (args...);
60 pcg 1.11 }
61 pcg 1.12
62     private:
63    
64     void *self;
65     ptr_type func;
66 pcg 1.10
67 root 1.16 template<class klass, R (klass::*method)(Args...)>
68     static R thunk (void *self, Args... args)
69 pcg 1.12 {
70     klass *obj = static_cast<klass *>(self);
71 root 1.16 return (obj->*method) (args...);
72 pcg 1.12 }
73 pcg 1.14 };
74    
75 pcg 1.1 #endif