Skip to content

Commit f9318d1

Browse files
committed
first step of fix for #262
1 parent 65181b9 commit f9318d1

File tree

1 file changed

+10
-7
lines changed

1 file changed

+10
-7
lines changed

include/ctre/return_type.hpp

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,14 @@
1515

1616
namespace ctre {
1717

18-
constexpr bool is_random_accessible(const std::random_access_iterator_tag &) { return true; }
19-
constexpr bool is_random_accessible(...) { return false; }
18+
constexpr bool is_random_accessible_f(const std::random_access_iterator_tag &) { return std::true_type{}; }
19+
//constexpr bool is_random_accessible_f(...) { return std::false_type{}; }
2020

21-
template <typename T> constexpr bool is_reverse_iterator(const std::reverse_iterator<T> &) { return true; }
22-
constexpr bool is_reverse_iterator(...) { return false; }
21+
template <typename T> constexpr bool is_reverse_iterator_f(const std::reverse_iterator<T> &) { return std::true_type{}; }
22+
constexpr bool is_reverse_iterator_f(...) { return std::false_type{}; }
23+
24+
template <typename T> constexpr bool is_random_accessible = decltype(is_random_accessible_f(std::declval<const T &>())){};
25+
template <typename T> constexpr bool is_reverse_iterator = decltype(is_reverse_iterator_f(std::declval<const T &>())){};
2326

2427
struct not_matched_tag_t { };
2528

@@ -69,7 +72,7 @@ template <size_t Id, typename Name = void> struct captured_content {
6972
}
7073

7174
template <typename It = Iterator> constexpr CTRE_FORCE_INLINE const auto * data_unsafe() const noexcept {
72-
static_assert(!is_reverse_iterator(It{}), "Iterator in your capture must not be reverse!");
75+
static_assert(!is_reverse_iterator<It>, "Iterator in your capture must not be reverse!");
7376

7477
#if __cpp_char8_t >= 201811
7578
if constexpr (std::is_same_v<Iterator, utf8_iterator>) {
@@ -83,7 +86,7 @@ template <size_t Id, typename Name = void> struct captured_content {
8386
}
8487

8588
template <typename It = Iterator> constexpr CTRE_FORCE_INLINE const auto * data() const noexcept {
86-
constexpr bool must_be_contiguous_nonreverse_iterator = is_random_accessible(typename std::iterator_traits<It>::iterator_category{}) && !is_reverse_iterator(It{});
89+
constexpr bool must_be_contiguous_nonreverse_iterator = is_random_accessible_f(typename std::iterator_traits<It>::iterator_category{}) && !is_reverse_iterator_f(It{});
8790

8891
static_assert(must_be_contiguous_nonreverse_iterator, "To access result as a pointer you need to provide a random access iterator/range to regex (which is not reverse iterator based).");
8992

@@ -119,7 +122,7 @@ template <size_t Id, typename Name = void> struct captured_content {
119122

120123
template <typename It = Iterator> constexpr CTRE_FORCE_INLINE auto to_view() const noexcept {
121124
// random access, because C++ (waving hands around)
122-
constexpr bool must_be_nonreverse_contiguous_iterator = is_random_accessible(typename std::iterator_traits<std::remove_const_t<It>>::iterator_category{}) && !is_reverse_iterator(It{});
125+
constexpr bool must_be_nonreverse_contiguous_iterator = is_random_accessible_f(typename std::iterator_traits<std::remove_const_t<It>>::iterator_category{}) && !is_reverse_iterator_f(It{});
123126

124127
static_assert(must_be_nonreverse_contiguous_iterator, "To convert capture into a basic_string_view you need to provide a pointer or a contiguous non-reverse iterator/range to regex.");
125128

0 commit comments

Comments
 (0)