swift
integersequence.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (C) 2016 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
5 
6 #ifndef SWIFT_MISC_INTEGERSEQUENCE_H
7 #define SWIFT_MISC_INTEGERSEQUENCE_H
8 
9 #include <cstddef>
10 
11 namespace swift::misc::private_ns
12 {
14 
15  // Remove elements from an index_sequence for which a pack parameter fails to satisfy a given predicate.
16  template <typename, typename T, bool...>
17  struct MaskSequenceImpl
18  {
19  using type = T;
20  };
21 
22  template <size_t I, size_t... Is, bool... Mask, size_t... Js>
23  struct MaskSequenceImpl<std::index_sequence<I, Is...>, std::index_sequence<Js...>, true, Mask...>
24  {
25  using type =
26  typename MaskSequenceImpl<std::index_sequence<Is...>, std::index_sequence<Js..., I>, Mask...>::type;
27  };
28 
29  template <size_t I, size_t... Is, bool... Mask, size_t... Js>
30  struct MaskSequenceImpl<std::index_sequence<I, Is...>, std::index_sequence<Js...>, false, Mask...>
31  {
32  using type = typename MaskSequenceImpl<std::index_sequence<Is...>, std::index_sequence<Js...>, Mask...>::type;
33  };
34 
35  template <typename Seq, bool... Mask>
36  using MaskSequence = typename MaskSequenceImpl<Seq, std::index_sequence<>, Mask...>::type;
37 
39 } // namespace swift::misc::private_ns
40 
41 #endif // SWIFT_MISC_INTEGERSEQUENCE_H