Skip to content

Commit b5c0f7b

Browse files
committed
second step of fix for #262
1 parent f9318d1 commit b5c0f7b

File tree

4 files changed

+27
-21
lines changed

4 files changed

+27
-21
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ CXX_STANDARD := 20
1111

1212
PEDANTIC:=-pedantic
1313

14-
override CXXFLAGS := $(CXXFLAGS) -std=c++$(CXX_STANDARD) -Iinclude -O3 $(PEDANTIC) -Wall -Wextra -Werror -Wconversion
14+
override CXXFLAGS := $(CXXFLAGS) -std=c++$(CXX_STANDARD) -Iinclude -O3 $(PEDANTIC) -Wall -Wextra -Werror -Wconversion -D_LIBCPP_DEBUG=1
1515
LDFLAGS :=
1616

1717
TESTS := $(wildcard tests/*.cpp) $(wildcard tests/benchmark/*.cpp)

include/ctre/return_type.hpp

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

1616
namespace ctre {
1717

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{}; }
18+
constexpr auto is_random_accessible_f(const std::random_access_iterator_tag &) { return std::true_type{}; }
19+
constexpr auto is_random_accessible_f(...) { return std::false_type{}; }
2020

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{}; }
21+
template <typename T> constexpr auto is_reverse_iterator_f(const std::reverse_iterator<T> &) { return std::true_type{}; }
22+
constexpr auto is_reverse_iterator_f(...) { return std::false_type{}; }
2323

2424
template <typename T> constexpr bool is_random_accessible = decltype(is_random_accessible_f(std::declval<const T &>())){};
2525
template <typename T> constexpr bool is_reverse_iterator = decltype(is_reverse_iterator_f(std::declval<const T &>())){};
@@ -86,7 +86,7 @@ template <size_t Id, typename Name = void> struct captured_content {
8686
}
8787

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

9191
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).");
9292

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

123123
template <typename It = Iterator> constexpr CTRE_FORCE_INLINE auto to_view() const noexcept {
124124
// random access, because C++ (waving hands around)
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{});
125+
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>;
126126

127127
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.");
128128

single-header/ctre-unicode.hpp

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3241,11 +3241,14 @@ struct utf8_range {
32413241

32423242
namespace ctre {
32433243

3244-
constexpr bool is_random_accessible(const std::random_access_iterator_tag &) { return true; }
3245-
constexpr bool is_random_accessible(...) { return false; }
3244+
constexpr auto is_random_accessible_f(const std::random_access_iterator_tag &) { return std::true_type{}; }
3245+
constexpr auto is_random_accessible_f(...) { return std::false_type{}; }
32463246

3247-
template <typename T> constexpr bool is_reverse_iterator(const std::reverse_iterator<T> &) { return true; }
3248-
constexpr bool is_reverse_iterator(...) { return false; }
3247+
template <typename T> constexpr auto is_reverse_iterator_f(const std::reverse_iterator<T> &) { return std::true_type{}; }
3248+
constexpr auto is_reverse_iterator_f(...) { return std::false_type{}; }
3249+
3250+
template <typename T> constexpr bool is_random_accessible = decltype(is_random_accessible_f(std::declval<const T &>())){};
3251+
template <typename T> constexpr bool is_reverse_iterator = decltype(is_reverse_iterator_f(std::declval<const T &>())){};
32493252

32503253
struct not_matched_tag_t { };
32513254

@@ -3295,7 +3298,7 @@ template <size_t Id, typename Name = void> struct captured_content {
32953298
}
32963299

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

33003303
#if __cpp_char8_t >= 201811
33013304
if constexpr (std::is_same_v<Iterator, utf8_iterator>) {
@@ -3309,7 +3312,7 @@ template <size_t Id, typename Name = void> struct captured_content {
33093312
}
33103313

33113314
template <typename It = Iterator> constexpr CTRE_FORCE_INLINE const auto * data() const noexcept {
3312-
constexpr bool must_be_contiguous_nonreverse_iterator = is_random_accessible(typename std::iterator_traits<It>::iterator_category{}) && !is_reverse_iterator(It{});
3315+
constexpr bool must_be_contiguous_nonreverse_iterator = is_random_accessible<typename std::iterator_traits<It>::iterator_category> && !is_reverse_iterator<It>;
33133316

33143317
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).");
33153318

@@ -3345,7 +3348,7 @@ template <size_t Id, typename Name = void> struct captured_content {
33453348

33463349
template <typename It = Iterator> constexpr CTRE_FORCE_INLINE auto to_view() const noexcept {
33473350
// random access, because C++ (waving hands around)
3348-
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{});
3351+
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>;
33493352

33503353
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.");
33513354

single-header/ctre.hpp

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3238,11 +3238,14 @@ struct utf8_range {
32383238

32393239
namespace ctre {
32403240

3241-
constexpr bool is_random_accessible(const std::random_access_iterator_tag &) { return true; }
3242-
constexpr bool is_random_accessible(...) { return false; }
3241+
constexpr auto is_random_accessible_f(const std::random_access_iterator_tag &) { return std::true_type{}; }
3242+
constexpr auto is_random_accessible_f(...) { return std::false_type{}; }
32433243

3244-
template <typename T> constexpr bool is_reverse_iterator(const std::reverse_iterator<T> &) { return true; }
3245-
constexpr bool is_reverse_iterator(...) { return false; }
3244+
template <typename T> constexpr auto is_reverse_iterator_f(const std::reverse_iterator<T> &) { return std::true_type{}; }
3245+
constexpr auto is_reverse_iterator_f(...) { return std::false_type{}; }
3246+
3247+
template <typename T> constexpr bool is_random_accessible = decltype(is_random_accessible_f(std::declval<const T &>())){};
3248+
template <typename T> constexpr bool is_reverse_iterator = decltype(is_reverse_iterator_f(std::declval<const T &>())){};
32463249

32473250
struct not_matched_tag_t { };
32483251

@@ -3292,7 +3295,7 @@ template <size_t Id, typename Name = void> struct captured_content {
32923295
}
32933296

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

32973300
#if __cpp_char8_t >= 201811
32983301
if constexpr (std::is_same_v<Iterator, utf8_iterator>) {
@@ -3306,7 +3309,7 @@ template <size_t Id, typename Name = void> struct captured_content {
33063309
}
33073310

33083311
template <typename It = Iterator> constexpr CTRE_FORCE_INLINE const auto * data() const noexcept {
3309-
constexpr bool must_be_contiguous_nonreverse_iterator = is_random_accessible(typename std::iterator_traits<It>::iterator_category{}) && !is_reverse_iterator(It{});
3312+
constexpr bool must_be_contiguous_nonreverse_iterator = is_random_accessible<typename std::iterator_traits<It>::iterator_category> && !is_reverse_iterator<It>;
33103313

33113314
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).");
33123315

@@ -3342,7 +3345,7 @@ template <size_t Id, typename Name = void> struct captured_content {
33423345

33433346
template <typename It = Iterator> constexpr CTRE_FORCE_INLINE auto to_view() const noexcept {
33443347
// random access, because C++ (waving hands around)
3345-
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{});
3348+
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>;
33463349

33473350
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.");
33483351

0 commit comments

Comments
 (0)