]> git.xonotic.org Git - xonotic/netradiant.git/blobdiff - libs/generic/callback.h
Inject OpenGLBinding instead of using GlobalOpenGL() everywhere
[xonotic/netradiant.git] / libs / generic / callback.h
index 577dd9d958bd337082f9c2479c5c1803e664c1a3..7dc5d85be772c30a7060e1a73a8dd0be5c42ee0a 100644 (file)
@@ -346,4 +346,26 @@ inline Callback<R(Ts...)> makeCallbackF(R(*func)(Ts...)) {
     return BindFirstOpaque<detail::FreeCallerWrapper<R(Ts...)>>(pVoid);
 }
 
+template<typename Lambda>
+inline Callback<get_func<Lambda>> makeCallbackL(const Lambda &lambda) {
+       static_assert(sizeof(Lambda) == 1, "lambda must not capture");
+       return makeCallbackF(+lambda);
+}
+
+template<typename Lambda>
+inline Callback<detail::ArgShift<get_func<Lambda>>> makeCallbackL(get_argument<Lambda, 0> env, const Lambda &lambda) {
+       static_assert(sizeof(Lambda) == 1, "lambda must not capture");
+       using R = get_result_type<Lambda>;
+       using Env = get_argument<Lambda, 0>;
+       struct Caller {
+               using func = R(Env);
+               static R call(Env env) {
+                       (void) (func *) nullptr;
+                       const Lambda &x = *(const Lambda *) nullptr;
+                       x(env);
+               }
+       };
+       return makeCallback<Caller>(Caller(), env);
+}
+
 #endif