diff options
author | Jan Dalheimer <jan@dalheimer.de> | 2015-06-06 12:30:49 +0200 |
---|---|---|
committer | Petr Mrázek <peterix@gmail.com> | 2015-06-06 21:23:05 +0200 |
commit | 1e51b62c882b5fc1554efb46cb41c3d54157626c (patch) | |
tree | 08e81ac1382d8528584c9f237aaf8ff976e2af8a /logic/TypeMagic.h | |
parent | 24db645167b42adba5d9c221215be83bef39e2a1 (diff) | |
download | MultiMC-1e51b62c882b5fc1554efb46cb41c3d54157626c.tar MultiMC-1e51b62c882b5fc1554efb46cb41c3d54157626c.tar.gz MultiMC-1e51b62c882b5fc1554efb46cb41c3d54157626c.tar.lz MultiMC-1e51b62c882b5fc1554efb46cb41c3d54157626c.tar.xz MultiMC-1e51b62c882b5fc1554efb46cb41c3d54157626c.zip |
NOISSUE Comment and bugfix the Resource system
Diffstat (limited to 'logic/TypeMagic.h')
-rw-r--r-- | logic/TypeMagic.h | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/logic/TypeMagic.h b/logic/TypeMagic.h new file mode 100644 index 00000000..fa9d12a9 --- /dev/null +++ b/logic/TypeMagic.h @@ -0,0 +1,37 @@ +#pragma once + +namespace TypeMagic +{ +/** "Cleans" the given type T by stripping references (&) and cv-qualifiers (const, volatile) from it + * const int => int + * QString & => QString + * const unsigned long long & => unsigned long long + * + * Usage: + * using Cleaned = Detail::CleanType<const int>; + * static_assert(std::is_same<Cleaned, int>, "Cleaned == int"); + */ +// the order of remove_cv and remove_reference matters! +template <typename T> +using CleanType = typename std::remove_cv<typename std::remove_reference<T>::type>::type; + +/// For functors (structs with operator()), including lambdas, which in **most** cases are functors +/// "Calls" Function<Ret(*)(Arg)> or Function<Ret(C::*)(Arg)> +template <typename T> struct Function : public Function<decltype(&T::operator())> {}; +/// For function pointers (&function), including static members (&Class::member) +template <typename Ret, typename Arg> struct Function<Ret(*)(Arg)> : public Function<Ret(Arg)> {}; +/// Default specialization used by others. +template <typename Ret, typename Arg> struct Function<Ret(Arg)> +{ + using ReturnType = Ret; + using Argument = Arg; +}; +/// For member functions. Also used by the lambda overload if the lambda captures [this] +template <class C, typename Ret, typename Arg> struct Function<Ret(C::*)(Arg)> : public Function<Ret(Arg)> {}; +template <class C, typename Ret, typename Arg> struct Function<Ret(C::*)(Arg) const> : public Function<Ret(Arg)> {}; +/// Overload for references +template <typename F> struct Function<F&> : public Function<F> {}; +/// Overload for rvalues +template <typename F> struct Function<F&&> : public Function<F> {}; +// for more info: https://functionalcpp.wordpress.com/2013/08/05/function-traits/ +} |