-
Notifications
You must be signed in to change notification settings - Fork 75
/
Copy pathsort4.cxx
39 lines (29 loc) · 1.07 KB
/
sort4.cxx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <type_traits>
#include <cstdio>
template<template auto...> struct list;
template<typename T>
using sort_and_filter = list<
T.type_args.filter(!_0.is_empty).sort(sizeof(_0) > sizeof(_1))...
>;
template<typename... Ts>
constexpr bool is_reverse_sorted =
(... && (sizeof(Ts...[:-2]) >= sizeof(Ts...[1:])));
template<int size>
struct dummy_t {
char x[size];
};
struct empty_t { };
// Start with a mix of empties and unsorted types.
using Unsorted = list<
dummy_t<59>, empty_t, dummy_t<22>, dummy_t<61>, dummy_t<28>,
empty_t, dummy_t<18>, dummy_t<59>, dummy_t<25>, dummy_t<75>,
dummy_t<22>, dummy_t<70>, empty_t, dummy_t<30>, empty_t,
dummy_t<12>, dummy_t<37>, dummy_t<27>, empty_t, dummy_t<84>
>;
// Discard the empties and sort the remaining types by decreasing size.
using Sorted = list<
dummy_t<84>, dummy_t<75>, dummy_t<70>, dummy_t<61>, dummy_t<59>,
dummy_t<59>, dummy_t<37>, dummy_t<30>, dummy_t<28>, dummy_t<27>,
dummy_t<25>, dummy_t<22>, dummy_t<22>, dummy_t<18>, dummy_t<12>
>;
static_assert(Sorted == sort_and_filter<Unsorted>);