Created
September 26, 2020 20:41
-
-
Save Morwenn/89790cf4f4273c4d3c9f17992e119b44 to your computer and use it in GitHub Desktop.
Integer range in the spirit of std::integer_sequence
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* Copyright (c) 2015 Morwenn | |
* SPDX-License-Identifier: BSL-1.0 | |
*/ | |
#ifndef CPPSORT_UTILITY_MAKE_INTEGER_RANGE_H_ | |
#define CPPSORT_UTILITY_MAKE_INTEGER_RANGE_H_ | |
//////////////////////////////////////////////////////////// | |
// Headers | |
//////////////////////////////////////////////////////////// | |
#include <cstddef> | |
#include <utility> | |
namespace cppsort | |
{ | |
namespace utility | |
{ | |
namespace detail | |
{ | |
template< | |
typename Integer, | |
typename SequenceBase, | |
Integer Begin, | |
Integer Step, | |
bool IsIncreasing | |
> | |
struct integer_range_impl; | |
template< | |
typename Integer, | |
Integer... N, | |
Integer Begin, | |
Integer Step | |
> | |
struct integer_range_impl<Integer, std::integer_sequence<Integer, N...>, Begin, Step, true> | |
{ | |
using type = std::integer_sequence<Integer, (N * Step + Begin)...>; | |
}; | |
template< | |
typename Integer, | |
Integer... N, | |
Integer Begin, | |
Integer Step | |
> | |
struct integer_range_impl<Integer, std::integer_sequence<Integer, N...>, Begin, Step, false> | |
{ | |
using type = std::integer_sequence<Integer, (Begin - N * Step)...>; | |
}; | |
} | |
template< | |
typename Integer, | |
Integer Begin, | |
Integer End, | |
Integer Step = 1 | |
> | |
using make_integer_range = typename detail::integer_range_impl< | |
Integer, | |
std::make_integer_sequence< | |
Integer, | |
((Begin < End ? End - Begin : Begin - End) - 1) / (Step ? Step : 1) + 1 | |
>, | |
Begin, | |
(Step ? Step : 1), | |
(Begin < End) | |
>::type; | |
template< | |
std::size_t Begin, | |
std::size_t End, | |
std::size_t Step = 1u | |
> | |
using make_index_range = make_integer_range<std::size_t, Begin, End, Step>; | |
}} | |
#endif // CPPSORT_UTILITY_MAKE_INTEGER_RANGE_H_ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment