diff options
Diffstat (limited to 'Runtime/Lua/LuaBind/signal/bind.h')
-rw-r--r-- | Runtime/Lua/LuaBind/signal/bind.h | 510 |
1 files changed, 510 insertions, 0 deletions
diff --git a/Runtime/Lua/LuaBind/signal/bind.h b/Runtime/Lua/LuaBind/signal/bind.h new file mode 100644 index 0000000..e29896b --- /dev/null +++ b/Runtime/Lua/LuaBind/signal/bind.h @@ -0,0 +1,510 @@ +// Aseprite Base Library +// Copyright (c) 2001-2013 David Capello +// +// This file is released under the terms of the MIT license. +// Read LICENSE.txt for more information. + +#ifndef BASE_BIND_H_INCLUDED +#define BASE_BIND_H_INCLUDED +#pragma once + +// BindAdapter0_fun +template<typename R, typename F> +class BindAdapter0_fun +{ + F f; +public: + BindAdapter0_fun(const F& f) : f(f) { } + + R operator()() { return f(); } + + template<typename A1> + R operator()(const A1& a1) { return f(); } + + template<typename A1, typename A2> + R operator()(const A1& a1, const A2& a2) { return f(); } + + template<typename A1, typename A2, typename A3> + R operator()(const A1& a1, const A2& a2, const A3& a3) { return f(); } + + template<typename A1, typename A2, typename A3, typename A4> + R operator()(const A1& a1, const A2& a2, const A3& a3, const A4& a4) { return f(); } +}; + +template<typename F> +class BindAdapter0_fun<void, F> +{ + F f; +public: + BindAdapter0_fun(const F& f) : f(f) { } + + void operator()() { f(); } + + template<typename A1> + void operator()(const A1& a1) { f(); } + + template<typename A1, typename A2> + void operator()(const A1& a1, const A2& a2) { f(); } + + template<typename A1, typename A2, typename A3> + void operator()(const A1& a1, const A2& a2, const A3& a3) { f(); } + + template<typename A1, typename A2, typename A3, typename A4> + void operator()(const A1& a1, const A2& a2, const A3& a3, const A4& a4) { f(); } +}; + +template<typename R, typename F> +BindAdapter0_fun<R, F> +Bind(const F& f) +{ + return BindAdapter0_fun<R, F>(f); +} + +// BindAdapter0_mem +template<typename R, typename T> +class BindAdapter0_mem +{ + R (T::*m)(); + T* t; +public: + template<typename T2> + BindAdapter0_mem(R (T::*m)(), T2* t) : m(m), t(t) { } + + R operator()() { return (t->*m)(); } + + template <typename A1> + R operator()(const A1& a1) { return (t->*m)(); } + + template <typename A1, typename A2> + R operator()(const A1& a1, const A2& a2) { return (t->*m)(); } + + template <typename A1, typename A2, typename A3> + R operator()(const A1& a1, const A2& a2, const A3& a3) { return (t->*m)(); } + + template <typename A1, typename A2, typename A3, typename A4> + R operator()(const A1& a1, const A2& a2, const A3& a3, const A4& a4) { return (t->*m)(); } +}; + +template<typename T> +class BindAdapter0_mem<void, T> +{ + void (T::*m)(); + T* t; +public: + template<typename T2> + BindAdapter0_mem(void (T::*m)(), T2* t) : m(m), t(t) { } + + void operator()() { (t->*m)(); } + + template <typename A1> + void operator()(const A1& a1) { (t->*m)(); } + + template <typename A1, typename A2> + void operator()(const A1& a1, const A2& a2) { (t->*m)(); } + + template <typename A1, typename A2, typename A3> + void operator()(const A1& a1, const A2& a2, const A3& a3) { (t->*m)(); } + + template <typename A1, typename A2, typename A3, typename A4> + void operator()(const A1& a1, const A2& a2, const A3& a3, const A4& a4) { (t->*m)(); } +}; + +template<typename R, typename T, typename T2> +BindAdapter0_mem<R, T> +Bind(R (T::*m)(), T2* t) +{ + return BindAdapter0_mem<R, T>(m, t); +} + +// BindAdapter1_fun +template<typename R, typename F, + typename X1> +class BindAdapter1_fun +{ + F f; + X1 x1; +public: + BindAdapter1_fun(const F& f, X1 x1) : f(f), x1(x1) { } + + R operator()() { return f(x1); } + + template<typename A1> + R operator()(const A1& a1) { return f(x1); } + + template<typename A1, typename A2> + R operator()(const A1& a1, const A2& a2) { return f(x1); } + + template<typename A1, typename A2, typename A3> + R operator()(const A1& a1, const A2& a2, const A3& a3) { return f(x1); } + + template<typename A1, typename A2, typename A3, typename A4> + R operator()(const A1& a1, const A2& a2, const A3& a3, const A4& a4) { return f(x1); } +}; + +template<typename F, + typename X1> +class BindAdapter1_fun<void, F, X1> +{ + F f; + X1 x1; +public: + BindAdapter1_fun(const F& f, X1 x1) : f(f), x1(x1) { } + + void operator()() { f(x1); } + + template<typename A1> + void operator()(const A1& a1) { f(x1); } + + template<typename A1, typename A2> + void operator()(const A1& a1, const A2& a2) { f(x1); } + + template<typename A1, typename A2, typename A3> + void operator()(const A1& a1, const A2& a2, const A3& a3) { f(x1); } + + template<typename A1, typename A2, typename A3, typename A4> + void operator()(const A1& a1, const A2& a2, const A3& a3, const A4& a4) { f(x1); } +}; + +template<typename R, typename F, + typename X1> +BindAdapter1_fun<R, F, X1> +Bind(const F& f, X1 x1) +{ + return BindAdapter1_fun<R, F, X1>(f, x1); +} + +// BindAdapter1_mem +template<typename R, typename T, + typename B1, + typename X1> +class BindAdapter1_mem +{ + R (T::*m)(B1); + T* t; + X1 x1; +public: + template<typename T2> + BindAdapter1_mem(R (T::*m)(B1), T2* t, X1 x1) : m(m), t(t), x1(x1) { } + + R operator()() { return (t->*m)(x1); } + + template <typename A1> + R operator()(const A1& a1) { return (t->*m)(x1); } + + template <typename A1, typename A2> + R operator()(const A1& a1, const A2& a2) { return (t->*m)(x1); } + + template <typename A1, typename A2, typename A3> + R operator()(const A1& a1, const A2& a2, const A3& a3) { return (t->*m)(x1); } + + template <typename A1, typename A2, typename A3, typename A4> + R operator()(const A1& a1, const A2& a2, const A3& a3, const A4& a4) { return (t->*m)(x1); } +}; + +template<typename T, + typename B1, + typename X1> +class BindAdapter1_mem<void, T, B1, X1> +{ + void (T::*m)(B1); + T* t; + X1 x1; +public: + template<typename T2> + BindAdapter1_mem(void (T::*m)(B1), T2* t, X1 x1) : m(m), t(t), x1(x1) { } + + void operator()() { (t->*m)(x1); } + + template <typename A1> + void operator()(const A1& a1) { (t->*m)(x1); } + + template <typename A1, typename A2> + void operator()(const A1& a1, const A2& a2) { (t->*m)(x1); } + + template <typename A1, typename A2, typename A3> + void operator()(const A1& a1, const A2& a2, const A3& a3) { (t->*m)(x1); } + + template <typename A1, typename A2, typename A3, typename A4> + void operator()(const A1& a1, const A2& a2, const A3& a3, const A4& a4) { (t->*m)(x1); } +}; + +template<typename R, typename T, typename T2, + typename B1, typename X1> +BindAdapter1_mem<R, T, B1, X1> +Bind(R (T::*m)(B1), T2* t, X1 x1) +{ + return BindAdapter1_mem<R, T, B1, X1>(m, t, x1); +} + +// BindAdapter2_fun +template<typename R, typename F, + typename X1, typename X2> +class BindAdapter2_fun +{ + F f; + X1 x1; + X2 x2; +public: + BindAdapter2_fun(const F& f, X1 x1, X2 x2) : f(f), x1(x1), x2(x2) { } + + R operator()() { return f(x1, x2); } + + template<typename A1> + R operator()(const A1& a1) { return f(x1, x2); } + + template<typename A1, typename A2> + R operator()(const A1& a1, const A2& a2) { return f(x1, x2); } + + template<typename A1, typename A2, typename A3> + R operator()(const A1& a1, const A2& a2, const A3& a3) { return f(x1, x2); } + + template<typename A1, typename A2, typename A3, typename A4> + R operator()(const A1& a1, const A2& a2, const A3& a3, const A4& a4) { return f(x1, x2); } +}; + +template<typename F, + typename X1, typename X2> +class BindAdapter2_fun<void, F, X1, X2> +{ + F f; + X1 x1; + X2 x2; +public: + BindAdapter2_fun(const F& f, X1 x1, X2 x2) : f(f), x1(x1), x2(x2) { } + + void operator()() { f(x1, x2); } + + template<typename A1> + void operator()(const A1& a1) { f(x1, x2); } + + template<typename A1, typename A2> + void operator()(const A1& a1, const A2& a2) { f(x1, x2); } + + template<typename A1, typename A2, typename A3> + void operator()(const A1& a1, const A2& a2, const A3& a3) { f(x1, x2); } + + template<typename A1, typename A2, typename A3, typename A4> + void operator()(const A1& a1, const A2& a2, const A3& a3, const A4& a4) { f(x1, x2); } +}; + +template<typename R, typename F, + typename X1, typename X2> +BindAdapter2_fun<R, F, X1, X2> +Bind(const F& f, X1 x1, X2 x2) +{ + return BindAdapter2_fun<R, F, X1, X2>(f, x1, x2); +} + +// BindAdapter2_mem +template<typename R, typename T, + typename B1, typename B2, + typename X1, typename X2> +class BindAdapter2_mem +{ + R (T::*m)(B1, B2); + T* t; + X1 x1; + X2 x2; +public: + template<typename T2> + BindAdapter2_mem(R (T::*m)(B1, B2), T2* t, X1 x1, X2 x2) : m(m), t(t), x1(x1), x2(x2) { } + + R operator()() { return (t->*m)(x1, x2); } + + template<typename A1> + R operator()(const A1& a1) { return (t->*m)(x1, x2); } + + template<typename A1, typename A2> + R operator()(const A1& a1, const A2& a2) { return (t->*m)(x1, x2); } + + template<typename A1, typename A2, typename A3> + R operator()(const A1& a1, const A2& a2, const A3& a3) { return (t->*m)(x1, x2); } + + template<typename A1, typename A2, typename A3, typename A4> + R operator()(const A1& a1, const A2& a2, const A3& a3, const A4& a4) { return (t->*m)(x1, x2); } +}; + +template<typename T, + typename B1, typename B2, + typename X1, typename X2> +class BindAdapter2_mem<void, T, B1, B2, X1, X2> +{ + void (T::*m)(B1, B2); + T* t; + X1 x1; + X2 x2; +public: + template<typename T2> + BindAdapter2_mem(void (T::*m)(B1, B2), T2* t, X1 x1, X2 x2) : m(m), t(t), x1(x1), x2(x2) { } + + void operator()() { (t->*m)(x1, x2); } + + template<typename A1> + void operator()(const A1& a1) { (t->*m)(x1, x2); } + + template<typename A1, typename A2> + void operator()(const A1& a1, const A2& a2) { (t->*m)(x1, x2); } + + template<typename A1, typename A2, typename A3> + void operator()(const A1& a1, const A2& a2, const A3& a3) { (t->*m)(x1, x2); } + + template<typename A1, typename A2, typename A3, typename A4> + void operator()(const A1& a1, const A2& a2, const A3& a3, const A4& a4) { (t->*m)(x1, x2); } +}; + +template<typename R, typename T, typename T2, typename B1, typename B2, typename X1, typename X2> +BindAdapter2_mem<R, T, B1, B2, X1, X2> +Bind(R (T::*m)(B1, B2), T2* t, X1 x1, X2 x2) +{ + return BindAdapter2_mem<R, T, B1, B2, X1, X2>(m, t, x1, x2); +} + +// BindAdapter3_fun +template<typename R, typename F, + typename X1, typename X2, typename X3> +class BindAdapter3_fun +{ + F f; + X1 x1; + X2 x2; + X3 x3; +public: + BindAdapter3_fun(const F& f, X1 x1, X2 x2, X3 x3) : f(f), x1(x1), x2(x2), x3(x3) { } + + R operator()() { return f(x1, x2, x3); } + + template<typename A1> + R operator()(const A1& a1) { return f(x1, x2, x3); } + + template<typename A1, typename A2> + R operator()(const A1& a1, const A2& a2) { return f(x1, x2, x3); } + + template<typename A1, typename A2, typename A3> + R operator()(const A1& a1, const A2& a2, const A3& a3) { return f(x1, x2, x3); } + + template<typename A1, typename A2, typename A3, typename A4> + R operator()(const A1& a1, const A2& a2, const A3& a3, const A4& a4) { return f(x1, x2, x3); } +}; + +template<typename F, + typename X1, typename X2, typename X3> +class BindAdapter3_fun<void, F, X1, X2, X3> +{ + F f; + X1 x1; + X2 x2; + X3 x3; +public: + BindAdapter3_fun(const F& f, X1 x1, X2 x2, X3 x3) : f(f), x1(x1), x2(x2), x3(x3) { } + + void operator()() { f(x1, x2, x3); } + + template<typename A1> + void operator()(const A1& a1) { f(x1, x2, x3); } + + template<typename A1, typename A2> + void operator()(const A1& a1, const A2& a2) { f(x1, x2, x3); } + + template<typename A1, typename A2, typename A3> + void operator()(const A1& a1, const A2& a2, const A3& a3) { f(x1, x2, x3); } + + template<typename A1, typename A2, typename A3, typename A4> + void operator()(const A1& a1, const A2& a2, const A3& a3, const A4& a4) { f(x1, x2, x3); } +}; + +template<typename R, typename F, + typename X1, typename X2, typename X3> +BindAdapter3_fun<R, F, X1, X2, X3> +Bind(const F& f, X1 x1, X2 x2, X3 x3) +{ + return BindAdapter3_fun<R, F, X1, X2, X3>(f, x1, x2, x3); +} + +// BindAdapter3_mem +template<typename R, typename T, + typename B1, typename B2, typename B3, + typename X1, typename X2, typename X3> +class BindAdapter3_mem +{ + R (T::*m)(B1, B2, B3); + T* t; + X1 x1; + X2 x2; + X3 x3; +public: + template<typename T2> + BindAdapter3_mem(R (T::*m)(B1, B2, B3), T2* t, X1 x1, X2 x2, X3 x3) : m(m), t(t), x1(x1), x2(x2), x3(x3) { } + + R operator()() { return (t->*m)(x1, x2, x3); } + + template<typename A1> + R operator()(const A1& a1) { return (t->*m)(x1, x2, x3); } + + template<typename A1, typename A2> + R operator()(const A1& a1, const A2& a2) { return (t->*m)(x1, x2, x3); } + + template<typename A1, typename A2, typename A3> + R operator()(const A1& a1, const A2& a2, const A3& a3) { return (t->*m)(x1, x2, x3); } + + template<typename A1, typename A2, typename A3, typename A4> + R operator()(const A1& a1, const A2& a2, const A3& a3, const A4& a4) { return (t->*m)(x1, x2, x3); } +}; + +template<typename T, + typename B1, typename B2, typename B3, + typename X1, typename X2, typename X3> +class BindAdapter3_mem<void, T, B1, B2, B3, X1, X2, X3> +{ + void (T::*m)(B1, B2, B3); + T* t; + X1 x1; + X2 x2; + X3 x3; +public: + template<typename T2> + BindAdapter3_mem(void (T::*m)(B1, B2, B3), T2* t, X1 x1, X2 x2) : m(m), t(t), x1(x1), x2(x2) { } + + void operator()() { (t->*m)(x1, x2, x3); } + + template<typename A1> + void operator()(const A1& a1) { (t->*m)(x1, x2, x3); } + + template<typename A1, typename A2> + void operator()(const A1& a1, const A2& a2) { (t->*m)(x1, x2, x3); } + + template<typename A1, typename A2, typename A3> + void operator()(const A1& a1, const A2& a2, const A3& a3) { (t->*m)(x1, x2, x3); } + + template<typename A1, typename A2, typename A3, typename A4> + void operator()(const A1& a1, const A2& a2, const A3& a3, const A4& a4) { (t->*m)(x1, x2, x3); } +}; + +template<typename R, typename T, typename T2, + typename B1, typename B2, typename B3, + typename X1, typename X2, typename X3> +BindAdapter3_mem<R, T, B1, B2, B3, X1, X2, X3> +Bind(R (T::*m)(B1, B2, B3), T2* t, X1 x1, X2 x2) +{ + return BindAdapter3_mem<R, T, B1, B2, B3, X1, X2, X3>(m, t, x1, x2); +} + +// Helper class to holds references as pointers (to avoid copying the +// original object). +template<class T> +class RefWrapper +{ + T* ptr; +public: + RefWrapper(T& ref) : ptr(&ref) { } + operator T&() const { return *ptr; } +}; + +// Creates RefWrappers, useful to wrap arguments that have to be +// passed as a reference when you use Bind. +template<class T> +RefWrapper<T> Ref(T& ref) +{ + return RefWrapper<T>(ref); +} + +#endif |