diff --git a/include/metal/list.hpp b/include/metal/list.hpp index d1458eaf..fdb5ad78 100644 --- a/include/metal/list.hpp +++ b/include/metal/list.hpp @@ -27,7 +27,6 @@ #include #include #include -#include #include #include #include @@ -35,7 +34,6 @@ #include #include #include -#include #include #include #include diff --git a/include/metal/list/merge.hpp b/include/metal/list/merge.hpp deleted file mode 100644 index fe1b26f3..00000000 --- a/include/metal/list/merge.hpp +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright Bruno Dutra 2015-2016 -// Distributed under the Boost Software License, Version 1.0. -// See accompanying file LICENSE.txt or copy at http://boost.org/LICENSE_1_0.txt - -#ifndef METAL_LIST_MERGE_HPP -#define METAL_LIST_MERGE_HPP - -#include -#include -#include -#include -#include -#include - -namespace metal -{ - namespace detail - { - template - struct _merge_impl; - - template - using merge_impl = typename _merge_impl::type; - } - - /// \ingroup list - /// ... - template - using merge = reduce< - list, head>, tail...>, - partial, if_, lbd>> - >; -} - -#include -#include -#include -#include -#include -#include - -namespace metal -{ - namespace detail - { - template< - typename lbd, - typename xh, typename xt, - typename yh, typename yt - > - using merge_impl_recurse = join< - list, - remove_if>, - list, - merge_impl>, yt> - >; - - template - struct _merge_impl - {}; - - template< - template class expr, - typename xh, typename... xt, - typename yh, typename... yt - > - struct _merge_impl, list, list, - not_> - > : - _invoke< - lambda, - lambda, xh, list, yh, list - > - {}; - - template< - template class expr, - typename xh, typename... xt, - typename yh, typename... yt - > - struct _merge_impl, list, list, - not_>> - > : - _invoke< - lambda, - lambda, yh, list, xh, list - > - {}; - - template - struct _merge_impl, list<>> - { - using type = list; - }; - - template - struct _merge_impl, list> - { - using type = list; - }; - - template - struct _merge_impl, list<>> - { - using type = list<>; - }; - } -} - -#endif diff --git a/include/metal/list/reduce.hpp b/include/metal/list/reduce.hpp deleted file mode 100644 index 77a11598..00000000 --- a/include/metal/list/reduce.hpp +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright Bruno Dutra 2015-2016 -// Distributed under the Boost Software License, Version 1.0. -// See accompanying file LICENSE.txt or copy at http://boost.org/LICENSE_1_0.txt - -#ifndef METAL_LIST_REDUCE_HPP -#define METAL_LIST_REDUCE_HPP - -#include -#include -#include -#include -#include -#include -#include - -namespace metal -{ - namespace detail - { - template - struct _reduce; - } - - /// \ingroup list - /// ... - template< - typename seq, typename lbd, - typename beg = number<0>, - typename end = size - > - using reduce = typename detail::_reduce< - seq, - if_, lbd>, - if_, beg>, greater>>>, beg>, - if_, end>, greater>>>, end> - >::type; -} - -#include -#include - -namespace metal -{ - namespace detail - { - template< - typename seq, typename lbd, - typename beg, typename mid, typename end - > - using reduce_recurse = invoke::type, - typename _reduce::type - >; - - template - struct _reduce - {}; - - template - struct _reduce, number> : - _invoke< - lambda, - seq, lbd, number, number<(b + e)/2>, number - > - {}; - - template - struct _reduce, number> - { - using type = at>; - }; - - template - struct _reduce, number> - { - using type = at>; - }; - - template - struct _reduce, number> - {}; - } -} - -#endif diff --git a/include/metal/list/sort.hpp b/include/metal/list/sort.hpp index 455863af..a217b6c6 100644 --- a/include/metal/list/sort.hpp +++ b/include/metal/list/sort.hpp @@ -5,22 +5,113 @@ #ifndef METAL_LIST_SORT_HPP #define METAL_LIST_SORT_HPP -#include -#include -#include -#include #include -#include +#include namespace metal { + namespace detail + { + template + struct _sort; + } + /// \ingroup list /// ... template - using sort = metal::apply< - metal::partial, lbd, metal::list<>>, - metal::transpose> - >; + using sort = typename detail::_sort, lbd>>::type; +} + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace metal +{ + namespace detail + { + template + struct _merge; + + template + using merge = typename _merge::type; + + template + using merge_impl = join< + remove_if>, + remove_if>, + merge< + lbd, + copy_if>, + copy_if> + > + >; + + template + struct _merge + {}; + + template< + typename lbd, + typename xh, typename... xt, + typename yh, typename... yt + > + struct _merge, list> : + _invoke< + lambda, + lbd, list, xh, list, yh + > + {}; + + template + struct _merge> + { + using type = seq; + }; + + template + struct _merge, seq> + { + using type = seq; + }; + + template + struct _merge, list<>> + { + using type = list<>; + }; + + template + using sort_impl = merge< + lbd, + sort, div, number<2>>>, lbd>, + sort, number<2>>, size>, lbd> + >; + + template + struct _sort : + _invoke, seq, lbd> + {}; + + template + struct _sort, lbd> + { + using type = list; + }; + + template + struct _sort, lbd> + { + using type = list<>; + }; + } } #endif diff --git a/test/src/metal/list/merge.cpp b/test/src/metal/list/merge.cpp deleted file mode 100644 index 2478622f..00000000 --- a/test/src/metal/list/merge.cpp +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright Bruno Dutra 2015-2016 -// Distributed under the Boost Software License, Version 1.0. -// See accompanying file LICENSE.txt or copy at http://boost.org/LICENSE_1_0.txt - -#include -#include -#include -#include -#include -#include -#include - -#include "test.hpp" - -#define MATRIX(M, N) \ - CHECK((metal::is_invocable, VAL(M) COMMA(N) VALS(N)>), (FALSE)); \ - CHECK((metal::is_invocable, VAL(M) COMMA(N) NUMS(N)>), (FALSE)); \ - CHECK((metal::is_invocable, VAL(M) COMMA(N) PAIRS(N)>), (FALSE)); \ - CHECK((metal::is_invocable, VAL(M) COMMA(N) LISTS(N)>), (FALSE)); \ - CHECK((metal::is_invocable, VAL(M) COMMA(N) MAPS(N)>), (FALSE)); \ - CHECK((metal::is_invocable, VAL(M) COMMA(N) LBDS(N)>), (FALSE)); \ - CHECK((metal::is_invocable, NUM(M) COMMA(N) VALS(N)>), (FALSE)); \ - CHECK((metal::is_invocable, NUM(M) COMMA(N) NUMS(N)>), (FALSE)); \ - CHECK((metal::is_invocable, NUM(M) COMMA(N) PAIRS(N)>), (FALSE)); \ - CHECK((metal::is_invocable, NUM(M) COMMA(N) LISTS(N)>), (FALSE)); \ - CHECK((metal::is_invocable, NUM(M) COMMA(N) MAPS(N)>), (FALSE)); \ - CHECK((metal::is_invocable, NUM(M) COMMA(N) LBDS(N)>), (FALSE)); \ - CHECK((metal::is_invocable, PAIR(M) COMMA(N) VALS(N)>), (FALSE)); \ - CHECK((metal::is_invocable, PAIR(M) COMMA(N) NUMS(N)>), (FALSE)); \ - CHECK((metal::is_invocable, PAIR(M) COMMA(N) PAIRS(N)>), (FALSE)); \ - CHECK((metal::is_invocable, PAIR(M) COMMA(N) LISTS(N)>), (FALSE)); \ - CHECK((metal::is_invocable, PAIR(M) COMMA(N) MAPS(N)>), (FALSE)); \ - CHECK((metal::is_invocable, PAIR(M) COMMA(N) LBDS(N)>), (FALSE)); \ - CHECK((metal::is_invocable, LIST(M) COMMA(N) VALS(N)>), (FALSE)); \ - CHECK((metal::is_invocable, LIST(M) COMMA(N) NUMS(N)>), (FALSE)); \ - CHECK((metal::is_invocable, LIST(M) COMMA(N) PAIRS(N)>), (FALSE)); \ - CHECK((metal::is_invocable, LIST(M) COMMA(N) LISTS(N)>), (FALSE)); \ - CHECK((metal::is_invocable, LIST(M) COMMA(N) MAPS(N)>), (FALSE)); \ - CHECK((metal::is_invocable, LIST(M) COMMA(N) LBDS(N)>), (FALSE)); \ - CHECK((metal::is_invocable, MAP(M) COMMA(N) VALS(N)>), (FALSE)); \ - CHECK((metal::is_invocable, MAP(M) COMMA(N) NUMS(N)>), (FALSE)); \ - CHECK((metal::is_invocable, MAP(M) COMMA(N) PAIRS(N)>), (FALSE)); \ - CHECK((metal::is_invocable, MAP(M) COMMA(N) LISTS(N)>), (FALSE)); \ - CHECK((metal::is_invocable, MAP(M) COMMA(N) MAPS(N)>), (FALSE)); \ - CHECK((metal::is_invocable, MAP(M) COMMA(N) LBDS(N)>), (FALSE)); \ - CHECK((metal::is_invocable, LBD(M) COMMA(N) VALS(N)>), (FALSE)); \ - CHECK((metal::is_invocable, LBD(M) COMMA(N) NUMS(N)>), (FALSE)); \ - CHECK((metal::is_invocable, LBD(M) COMMA(N) PAIRS(N)>), (BOOL((N == 1) || (M == 2 && N)))); \ - CHECK((metal::is_invocable, LBD(M) COMMA(N) LISTS(N)>), (BOOL((N > 0 && N <= 2) || (M == 2 && N)))); \ - CHECK((metal::is_invocable, LBD(M) COMMA(N) MAPS(N)>), (BOOL((N > 0 && N <= 2) || (M == 2 && N)))); \ - CHECK((metal::is_invocable, LBD(M) COMMA(N) LBDS(N)>), (FALSE)); \ - CHECK((metal::is_invocable, LBD(M) COMMA(N) VALS(N)>), (FALSE)); \ - CHECK((metal::is_invocable, LBD(M) COMMA(N) NUMS(N)>), (FALSE)); \ - CHECK((metal::is_invocable, LBD(_) COMMA(N) VALS(N)>), (FALSE)); \ - CHECK((metal::is_invocable, LBD(_) COMMA(N) NUMS(N)>), (FALSE)); \ - CHECK((metal::is_invocable, LBD(_) COMMA(N) PAIRS(N)>), (BOOL(N == 1))); \ - CHECK((metal::is_invocable, LBD(_) COMMA(N) LISTS(N)>), (BOOL(N > 0 && N <= 2))); \ - CHECK((metal::is_invocable, LBD(_) COMMA(N) MAPS(N)>), (BOOL(N > 0 && N <= 2))); \ - CHECK((metal::is_invocable, LBD(_) COMMA(N) LBDS(N)>), (FALSE)); \ - CHECK((metal::merge, RENUM(INC(M), TAIL, metal::list)>), (metal::list)); \ -/**/ - -GEN(MATRIX) diff --git a/test/src/metal/list/reduce.cpp b/test/src/metal/list/reduce.cpp deleted file mode 100644 index d832d888..00000000 --- a/test/src/metal/list/reduce.cpp +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright Bruno Dutra 2015-2016 -// Distributed under the Boost Software License, Version 1.0. -// See accompanying file LICENSE.txt or copy at http://boost.org/LICENSE_1_0.txt - -#include -#include -#include -#include -#include - -#include "test.hpp" - -#define MATRIX(M, N) \ - CHECK((metal::is_invocable, VAL(M), VAL(N), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, VAL(M), NUM(N), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, VAL(M), PAIR(N), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, VAL(M), LIST(N), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, VAL(M), MAP(N), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, VAL(M), LBD(N), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, VAL(M), LBD(_), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, NUM(M), VAL(N), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, NUM(M), NUM(N), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, NUM(M), PAIR(N), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, NUM(M), LIST(N), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, NUM(M), MAP(N), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, NUM(M), LBD(N), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, NUM(M), LBD(_), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, PAIR(M), VAL(N), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, PAIR(M), NUM(N), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, PAIR(M), PAIR(N), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, PAIR(M), LIST(N), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, PAIR(M), MAP(N), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, PAIR(M), LBD(N), NUM(0), NUM(M)>), (BOOL(M == 1 || (M == 2 && N == 2)))); \ - CHECK((metal::is_invocable, PAIR(M), LBD(_), NUM(0), NUM(M)>), (BOOL(M && M < 3))); \ - CHECK((metal::is_invocable, LIST(M), VAL(N), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, LIST(M), NUM(N), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, LIST(M), PAIR(N), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, LIST(M), LIST(N), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, LIST(M), MAP(N), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, LIST(M), LBD(N), NUM(0), NUM(M)>), (BOOL(M == 1 || (M && N == 2)))); \ - CHECK((metal::is_invocable, LIST(M), LBD(_), NUM(0), NUM(M)>), (BOOL(M > 0))); \ - CHECK((metal::is_invocable, MAP(M), VAL(N), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, MAP(M), NUM(N), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, MAP(M), PAIR(N), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, MAP(M), LIST(N), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, MAP(M), MAP(N), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, MAP(M), LBD(N), NUM(0), NUM(M)>), (BOOL(M == 1 || (M && N == 2)))); \ - CHECK((metal::is_invocable, MAP(M), LBD(_), NUM(0), NUM(M)>), (BOOL(M > 0))); \ - CHECK((metal::is_invocable, LBD(M), VAL(N), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, LBD(M), NUM(N), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, LBD(M), PAIR(N), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, LBD(M), LIST(N), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, LBD(M), MAP(N), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, LBD(M), LBD(N), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, LBD(M), LBD(_), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, LBD(_), LBD(N), VAL(N), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, LBD(_), LBD(N), NUM(N), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, LBD(_), LBD(N), PAIR(N), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, LBD(_), LBD(N), LIST(N), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, LBD(_), LBD(N), MAP(N), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, LBD(_), LBD(N), LBD(N), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, LBD(_), LBD(N), LBD(_), NUM(0), NUM(M)>), (FALSE)); \ - CHECK((metal::is_invocable, PAIR(M), LBD(_), NUM(M), NUM(N)>), (BOOL(M != N && M < 3 && N < 3))); \ - CHECK((metal::is_invocable, LIST(M), LBD(_), NUM(M), NUM(N)>), (BOOL(M > N))); \ - CHECK((metal::is_invocable, MAP(M), LBD(_), NUM(M), NUM(N)>), (BOOL(M > N))); \ - CHECK((metal::reduce), (metal::reduce)); \ -/**/ - -GEN(MATRIX) - diff --git a/test/src/metal/list/sort.cpp b/test/src/metal/list/sort.cpp index 7583beda..9c024dcc 100644 --- a/test/src/metal/list/sort.cpp +++ b/test/src/metal/list/sort.cpp @@ -31,21 +31,21 @@ CHECK((metal::is_invocable, PAIR(M), PAIR(N)>), (FALSE)); \ CHECK((metal::is_invocable, PAIR(M), LIST(N)>), (FALSE)); \ CHECK((metal::is_invocable, PAIR(M), MAP(N)>), (FALSE)); \ - CHECK((metal::is_invocable, PAIR(M), LBD(N)>), (BOOL(N == 2))); \ + CHECK((metal::is_invocable, PAIR(M), LBD(N)>), (FALSE)); \ CHECK((metal::is_invocable, PAIR(M), LBD(_)>), (FALSE)); \ CHECK((metal::is_invocable, LIST(M), VAL(N)>), (FALSE)); \ CHECK((metal::is_invocable, LIST(M), NUM(N)>), (FALSE)); \ CHECK((metal::is_invocable, LIST(M), PAIR(N)>), (FALSE)); \ CHECK((metal::is_invocable, LIST(M), LIST(N)>), (FALSE)); \ CHECK((metal::is_invocable, LIST(M), MAP(N)>), (FALSE)); \ - CHECK((metal::is_invocable, LIST(M), LBD(N)>), (BOOL(M < 2 || N == 2))); \ + CHECK((metal::is_invocable, LIST(M), LBD(N)>), (BOOL(M < 2))); \ CHECK((metal::is_invocable, LIST(M), LBD(_)>), (BOOL(M < 2))); \ CHECK((metal::is_invocable, MAP(M), VAL(N)>), (FALSE)); \ CHECK((metal::is_invocable, MAP(M), NUM(N)>), (FALSE)); \ CHECK((metal::is_invocable, MAP(M), PAIR(N)>), (FALSE)); \ CHECK((metal::is_invocable, MAP(M), LIST(N)>), (FALSE)); \ CHECK((metal::is_invocable, MAP(M), MAP(N)>), (FALSE)); \ - CHECK((metal::is_invocable, MAP(M), LBD(N)>), (BOOL(M < 2 || N == 2))); \ + CHECK((metal::is_invocable, MAP(M), LBD(N)>), (BOOL(M < 2))); \ CHECK((metal::is_invocable, MAP(M), LBD(_)>), (BOOL(M < 2))); \ CHECK((metal::is_invocable, LBD(M), VAL(N)>), (FALSE)); \ CHECK((metal::is_invocable, LBD(M), NUM(N)>), (FALSE)); \