Advertisement
zhangsongcui

Compile time sort

Mar 23rd, 2018
218
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.18 KB | None | 0 0
  1. template <int N>
  2. struct PrintNumber;
  3.  
  4. template <int... Items>
  5. struct IndexSequence {
  6. };
  7.  
  8. template <typename Sequence1, typename Sequence2>
  9. struct ConcatSequence;
  10.  
  11. template<int... I1, int... I2>
  12. struct ConcatSequence<IndexSequence<I1...>, IndexSequence<I2...>> {
  13.     using type = IndexSequence<I1..., I2...>;
  14. };
  15.  
  16. template <typename Sequence, int... Items>
  17. struct T;
  18.  
  19. template <typename Sequence, int Max, int First, int... Others>
  20. struct T<Sequence, Max, First, Others...> {
  21.     using OtherSequence = typename ConcatSequence<Sequence, IndexSequence<(Max < First ? Max : First)>>::type;
  22.     using U = T<OtherSequence, (Max < First ? First : Max), Others...>;
  23.     U u;
  24. };
  25.  
  26. template <typename Sequence, int Max>
  27. struct T<Sequence, Max>;
  28.  
  29. template <int... Items, int Max>
  30. struct T<IndexSequence<Items...>, Max> {
  31.     using U = int;
  32.     using Next = T<IndexSequence<>, Items...>;
  33.     Next next;
  34.     PrintNumber<Max> _;
  35. };
  36.  
  37. template <int Max>
  38. struct T<IndexSequence<>, Max> {
  39.     using U = int;
  40.     PrintNumber<Max> _;
  41. };
  42.  
  43. int main() {
  44.     static_assert(false, "Sort [2, 1, 7, 4, 9, 6, 8, 5, 3] at compile time:");
  45.     T<IndexSequence<>, 2, 1, 7, 4, 9, 6, 8, 5, 3>::U test;
  46. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement