Depsgraph: New dependency graph integration commit
[blender.git] / source / blender / depsgraph / util / depsgraph_util_function.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2014 Blender Foundation.
19  * All rights reserved.
20  *
21  * Original Author: Lukas Toenne
22  * Contributor(s): 
23  */
24
25 #ifndef __DEPSGRAPH_UTIL_FUNCTION_H__
26 #define __DEPSGRAPH_UTIL_FUNCTION_H__
27
28 #if (__cplusplus > 199711L) || (defined(_MSC_VER) && _MSC_VER >= 1800)
29
30 #include <functional>
31
32 using std::function;
33 using namespace std::placeholders;
34 #define function_bind std::bind
35
36 #elif defined(HAVE_BOOST_FUNCTION_BINDINGS)
37
38 #include <boost/bind.hpp>
39 #include <boost/function.hpp>
40
41 using boost::function;
42 #define function_bind boost::bind
43
44 #else
45
46 #pragma message("No available function binding implementation. Using stub instead, disabling new depsgraph")
47
48 #ifndef WITH_LEGACY_DEPSGRAPH
49 #  error "Unable to build new depsgraph and legacy one is disabled."
50 #endif
51
52 #define DISABLE_NEW_DEPSGRAPH
53
54 #include <cstdlib>
55
56 template<typename T>
57 class function {
58 public:
59         function() {};
60         function(void *) {}
61         operator bool() const { return false; }
62         bool operator== (void*) { return false; }
63
64         template<typename T1>
65         void operator() (T1) {
66                 BLI_assert(!"Should not be used");
67         }
68 };
69
70 class Wrap {
71 public:
72         Wrap() {}
73         template <typename T>
74         Wrap(T /*arg*/) {}
75 };
76
77 template <typename T>
78 void *function_bind(T func,
79                     Wrap arg1 = Wrap(),
80                     Wrap arg2 = Wrap(),
81                     Wrap arg3 = Wrap(),
82                     Wrap arg4 = Wrap(),
83                     Wrap arg5 = Wrap(),
84                     Wrap arg6 = Wrap(),
85                     Wrap arg7 = Wrap())
86 {
87         BLI_assert(!"Should not be used");
88         (void)func;
89         (void)arg1;
90         (void)arg2;
91         (void)arg3;
92         (void)arg4;
93         (void)arg5;
94         (void)arg6;
95         (void)arg7;
96         return NULL;
97 }
98
99 #define _1 Wrap()
100 #define _2 Wrap()
101 #define _3 Wrap()
102 #define _4 Wrap()
103
104 #endif
105
106 #endif  /* __DEPSGRAPH_UTIL_SET_H__ */