basedOpinionated utility library |
git clone git://git.dimitrijedobrota.com/based.git |
Log | Files | Refs | README | LICENSE | HACKING | CONTRIBUTING | CODE_OF_CONDUCT | BUILDING |
commit | 32dbe6106d0a67a6fea16db955e6b99b3dc587d2 |
parent | 46ecfeefdd364d5bc73cdcfca5daf588c1d6e654 |
author | Dimitrije Dobrota < mail@dimitrijedobrota.com > |
date | Wed, 16 Apr 2025 21:48:00 +0200 |
All different signature combinations
M | include/based/template.hpp | | | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --- |
1 files changed, 186 insertions(+), 5 deletions(-)
diff --git a/ include/based/template.hpp b/ include/based/template.hpp
@@ -1,6 +1,5 @@
#pragma once
#include <array>
#include <cstddef>
#include <functional>
#include <type_traits>
@@ -17,18 +16,200 @@
template<typename Ret, typename... Args>
struct signature<Ret(Args...)>
{
using sig_type = Ret(Args...);
using arg_type = std::tuple<Args...>;
using ret_type = Ret;
};
template<typename Ret, typename Obj, typename... Args>
struct signature<Ret (Obj::*)(Args...)>
template<typename Ret, typename Obj, bool Ne, typename... Args>
struct signature<Ret (Obj::*)(Args...) noexcept(Ne)>
{
using sig_type = Ret(Args...);
using arg_type = std::tuple<Args...>;
using ret_type = Ret;
using const_val = std::false_type;
using volatile_val = std::false_type;
using lvalref_val = std::false_type;
using rvalref_val = std::false_type;
using noexcept_val = std::integral_constant<bool, Ne>;
};
template<typename Ret, typename Obj, bool Ne, typename... Args>
struct signature<Ret (Obj::*)(Args...) & noexcept(Ne)>
{
using sig_type = Ret(Args...);
using arg_type = std::tuple<Args...>;
using ret_type = Ret;
using const_val = std::false_type;
using volatile_val = std::false_type;
using lvalref_val = std::true_type;
using rvalref_val = std::false_type;
using noexcept_val = std::integral_constant<bool, Ne>;
};
template<typename Ret, typename Obj, bool Ne, typename... Args>
struct signature<Ret (Obj::*)(Args...) && noexcept(Ne)>
{
using sig_type = Ret(Args...);
using arg_type = std::tuple<Args...>;
using ret_type = Ret;
using const_val = std::false_type;
using volatile_val = std::false_type;
using lvalref_val = std::false_type;
using rvalref_val = std::true_type;
using noexcept_val = std::integral_constant<bool, Ne>;
};
template<typename Ret, typename Obj, bool Ne, typename... Args>
struct signature<Ret (Obj::*)(Args...) const noexcept(Ne)>
{
using sig_type = Ret(Args...);
using arg_type = std::tuple<Args...>;
using ret_type = Ret;
using const_val = std::true_type;
using volatile_val = std::false_type;
using lvalref_val = std::false_type;
using rvalref_val = std::false_type;
using noexcept_val = std::integral_constant<bool, Ne>;
};
template<typename Ret, typename Obj, bool Ne, typename... Args>
struct signature<Ret (Obj::*)(Args...) const & noexcept(Ne)>
{
using sig_type = Ret(Args...);
using arg_type = std::tuple<Args...>;
using ret_type = Ret;
using const_val = std::true_type;
using volatile_val = std::false_type;
using lvalref_val = std::true_type;
using rvalref_val = std::false_type;
using noexcept_val = std::integral_constant<bool, Ne>;
};
template<typename Ret, typename Obj, bool Ne, typename... Args>
struct signature<Ret (Obj::*)(Args...) const && noexcept(Ne)>
{
using sig_type = Ret(Args...);
using arg_type = std::tuple<Args...>;
using ret_type = Ret;
using const_val = std::true_type;
using volatile_val = std::false_type;
using lvalref_val = std::false_type;
using rvalref_val = std::true_type;
using noexcept_val = std::integral_constant<bool, Ne>;
};
template<typename Ret, typename Obj, typename... Args>
struct signature<Ret (Obj::*)(Args...) const>
template<typename Ret, typename Obj, bool Ne, typename... Args>
struct signature<Ret (Obj::*)(Args...) volatile noexcept(Ne)>
{
using sig_type = Ret(Args...);
using arg_type = std::tuple<Args...>;
using ret_type = Ret;
using const_val = std::false_type;
using volatile_val = std::true_type;
using lvalref_val = std::false_type;
using rvalref_val = std::false_type;
using noexcept_val = std::integral_constant<bool, Ne>;
};
template<typename Ret, typename Obj, bool Ne, typename... Args>
struct signature<Ret (Obj::*)(Args...) volatile & noexcept(Ne)>
{
using sig_type = Ret(Args...);
using arg_type = std::tuple<Args...>;
using ret_type = Ret;
using const_val = std::false_type;
using volatile_val = std::true_type;
using lvalref_val = std::true_type;
using rvalref_val = std::false_type;
using noexcept_val = std::integral_constant<bool, Ne>;
};
template<typename Ret, typename Obj, bool Ne, typename... Args>
struct signature<Ret (Obj::*)(Args...) volatile && noexcept(Ne)>
{
using sig_type = Ret(Args...);
using arg_type = std::tuple<Args...>;
using ret_type = Ret;
using const_val = std::false_type;
using volatile_val = std::true_type;
using lvalref_val = std::false_type;
using rvalref_val = std::true_type;
using noexcept_val = std::integral_constant<bool, Ne>;
};
template<typename Ret, typename Obj, bool Ne, typename... Args>
struct signature<Ret (Obj::*)(Args...) const volatile noexcept(Ne)>
{
using sig_type = Ret(Args...);
using arg_type = std::tuple<Args...>;
using ret_type = Ret;
using const_val = std::true_type;
using volatile_val = std::true_type;
using lvalref_val = std::false_type;
using rvalref_val = std::false_type;
using noexcept_val = std::integral_constant<bool, Ne>;
};
template<typename Ret, typename Obj, bool Ne, typename... Args>
struct signature<Ret (Obj::*)(Args...) const volatile & noexcept(Ne)>
{
using sig_type = Ret(Args...);
using arg_type = std::tuple<Args...>;
using ret_type = Ret;
using const_val = std::true_type;
using volatile_val = std::true_type;
using lvalref_val = std::true_type;
using rvalref_val = std::false_type;
using noexcept_val = std::integral_constant<bool, Ne>;
};
template<typename Ret, typename Obj, bool Ne, typename... Args>
struct signature<Ret (Obj::*)(Args...) const volatile && noexcept(Ne)>
{
using sig_type = Ret(Args...);
using arg_type = std::tuple<Args...>;
using ret_type = Ret;
using const_val = std::true_type;
using volatile_val = std::true_type;
using lvalref_val = std::false_type;
using rvalref_val = std::true_type;
using noexcept_val = std::integral_constant<bool, Ne>;
};
/* ----- Overload Lambdas ----- */