summaryrefslogtreecommitdiffhomepage
path: root/main-window
diff options
context:
space:
mode:
Diffstat (limited to 'main-window')
-rw-r--r--main-window/mixin-traits.cpp11
-rw-r--r--main-window/mixin-traits.hpp30
2 files changed, 22 insertions, 19 deletions
diff --git a/main-window/mixin-traits.cpp b/main-window/mixin-traits.cpp
index f914605e..a374eade 100644
--- a/main-window/mixin-traits.cpp
+++ b/main-window/mixin-traits.cpp
@@ -3,7 +3,7 @@
#ifdef MIXIN_TRAIT_TESTS
# include "mixin-traits.hpp"
-namespace mixins::traits_detail {
+//namespace mixins::traits_detail {
struct A {};
struct B : A {};
@@ -16,22 +16,23 @@ template<> struct mixin_traits<B>
template<> struct mixin_traits<A>
{
- using depends = tuple<B>;
+ using depends = tuple<>;
};
template<> struct mixin_traits<C>
{
- using depends = tuple<B, A>;
+ using depends = tuple<A>;
};
extern void test1();
void test1()
{
- //impl<A> fail1;
+ //impl<C> fail1;
impl<B> ok1;
+ impl<A> ok2;
}
-} // ns mixins::traits_detail
+//} // ns mixins::traits_detail
#endif
diff --git a/main-window/mixin-traits.hpp b/main-window/mixin-traits.hpp
index 5988dc83..07eec98d 100644
--- a/main-window/mixin-traits.hpp
+++ b/main-window/mixin-traits.hpp
@@ -6,15 +6,15 @@
#include <type_traits>
-namespace mixins::traits_detail {
+//namespace mixins::traits_detail {
using namespace meta;
template<typename... xs>
- using tuple = meta::detail::tuple<xs...> {}
+ using tuple = meta::detail::tuple<xs...>;
template<typename t>
struct mixin_traits {
- using depends = tuple<>;
+ //using depends = tuple<>;
};
template<typename klass, typename...> struct check_depends_;
@@ -22,20 +22,21 @@ namespace mixins::traits_detail {
template<typename klass>
struct check_depends_<klass>
{
- static constexpr bool recurse() { return true; }
+ using type = std::bool_constant<true>;
};
template<typename klass, typename x, typename... xs>
struct check_depends_<klass, x, xs...>
{
- static constexpr bool recurse()
- {
- using depends = typename mixin_traits<x>::depends;
-
- return (std::is_base_of_v<x, klass> || std::is_same_v<x, klass>) &&
- check_depends_<klass, xs...>::recurse() &&
- lift<check_depends_, cons<klass, depends>>::recurse();
- }
+ using b1 = std::is_base_of<x, klass>;
+ using b2 = typename check_depends_<klass, xs...>::type;
+
+ using depends = typename mixin_traits<x>::depends;
+ using t1 = cons<klass, depends>;
+ using t2 = lift<check_depends_, t1>;
+ using b3 = typename t2::type;
+
+ using type = std::bool_constant<b1::value && b2::value && b3::value>;
};
#if 0
@@ -58,6 +59,7 @@ namespace mixins::traits_detail {
template<typename t>
class impl
{
- static_assert(lift<check_depends_, cons<t, typename mixin_traits<t>::depends>>::recurse());
+ using t1 = typename lift<check_depends_, cons<t, typename mixin_traits<t>::depends>>::type;
+ static_assert(t1::value);
};
-} // ns mixins::traits_detail
+//} // ns mixins::traits_detail