Skip to content

Commit 5d07997

Browse files
authored
Merge pull request #3360 from eseiler/fix/ranges_to
[FIX] gcc15: conditionally borrowed_range views
2 parents 7f01aac + e70c5e0 commit 5d07997

File tree

5 files changed

+38
-0
lines changed

5 files changed

+38
-0
lines changed

include/seqan3/io/views/detail/take_exactly_view.hpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -549,6 +549,7 @@ namespace seqan3::detail
549549
* | std::ranges::sized_range | | ***guaranteed*** |
550550
* | std::ranges::common_range | | *preserved* |
551551
* | std::ranges::output_range | | *preserved* except if `urng_t` is std::basic_string|
552+
* | std::ranges::borrowed_range | | *preserved* |
552553
* | seqan3::const_iterable_range | | *preserved* |
553554
* | | | |
554555
* | std::ranges::range_reference_t | | std::ranges::range_reference_t<urng_t> |
@@ -586,3 +587,12 @@ inline constexpr auto take_exactly = take_exactly_fn<false>{};
586587
*/
587588
inline constexpr auto take_exactly_or_throw = take_exactly_fn<true>{};
588589
} // namespace seqan3::detail
590+
591+
namespace std::ranges
592+
{
593+
//!\cond
594+
template <std::ranges::view urng_t, bool or_throw>
595+
inline constexpr bool enable_borrowed_range<seqan3::detail::view_take_exactly<urng_t, or_throw>> =
596+
enable_borrowed_range<urng_t>;
597+
//!\endcond
598+
} // namespace std::ranges

include/seqan3/io/views/detail/take_until_view.hpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -531,6 +531,7 @@ namespace seqan3::detail
531531
* | std::ranges::sized_range | | *lost* |
532532
* | std::ranges::common_range | | *lost* |
533533
* | std::ranges::output_range | | *preserved* |
534+
* | std::ranges::borrowed_range | | *preserved* |
534535
* | seqan3::const_iterable_range | | <i>preserved</i>¹ |
535536
* | | | |
536537
* | std::ranges::range_reference_t | | std::ranges::range_reference_t<urng_t> |
@@ -602,3 +603,12 @@ inline constexpr auto take_until_and_consume = take_until_fn<false, true>{};
602603
inline constexpr auto take_until_or_throw_and_consume = take_until_fn<true, true>{};
603604

604605
} // namespace seqan3::detail
606+
607+
namespace std::ranges
608+
{
609+
//!\cond
610+
template <std::ranges::view urng_t, typename fun_t, bool or_throw, bool and_consume>
611+
inline constexpr bool enable_borrowed_range<seqan3::detail::view_take_until<urng_t, fun_t, or_throw, and_consume>> =
612+
enable_borrowed_range<urng_t>;
613+
//!\endcond
614+
} // namespace std::ranges

include/seqan3/utility/views/single_pass_input.hpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,7 @@ namespace seqan3::views
327327
* | std::ranges::sized_range | | *lost* |
328328
* | std::ranges::common_range | | *lost* |
329329
* | std::ranges::output_range | | *lost* |
330+
* | std::ranges::borrowed_range | | *preserved* |
330331
* | seqan3::const_iterable_range | | *lost* |
331332
* | | | |
332333
* | std::ranges::range_reference_t | | std::ranges::range_reference_t<urng_t> |
@@ -346,3 +347,12 @@ inline constexpr auto single_pass_input = detail::adaptor_for_view_without_args<
346347

347348
} // namespace seqan3::views
348349
//![adaptor_def]
350+
351+
namespace std::ranges
352+
{
353+
//!\cond
354+
template <std::ranges::view urng_t>
355+
inline constexpr bool enable_borrowed_range<seqan3::detail::single_pass_input_view<urng_t>> =
356+
enable_borrowed_range<urng_t>;
357+
//!\endcond
358+
} // namespace std::ranges

test/unit/io/views/detail/take_exactly_view_test.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ void do_concepts(adaptor_t && adaptor, bool const exactly)
6969
EXPECT_TRUE(std::ranges::common_range<decltype(v1)>);
7070
EXPECT_TRUE(seqan3::const_iterable_range<decltype(v1)>);
7171
EXPECT_TRUE((std::ranges::output_range<decltype(v1), int>));
72+
EXPECT_TRUE(std::ranges::borrowed_range<decltype(v1)>);
73+
EXPECT_TRUE(std::ranges::borrowed_range<decltype(vec | adaptor)>);
7274

7375
auto v3 = vec
7476
| std::views::transform(
@@ -101,6 +103,8 @@ void do_concepts(adaptor_t && adaptor, bool const exactly)
101103
EXPECT_FALSE(std::ranges::common_range<decltype(v2)>);
102104
EXPECT_FALSE(seqan3::const_iterable_range<decltype(v2)>);
103105
EXPECT_FALSE((std::ranges::output_range<decltype(v2), int>));
106+
EXPECT_TRUE(std::ranges::borrowed_range<decltype(v2)>);
107+
EXPECT_TRUE(std::ranges::borrowed_range<decltype(vec | seqan3::views::single_pass_input | adaptor)>);
104108

105109
// explicit test for non const-iterable views
106110
// https://github.com/seqan/seqan3/pull/1734#discussion_r408829267

test/unit/io/views/detail/take_until_view_test.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ void do_concepts(adaptor_t && adaptor, bool const_it)
6565
EXPECT_FALSE(std::ranges::common_range<decltype(v1)>);
6666
EXPECT_EQ(seqan3::const_iterable_range<decltype(v1)>, const_it);
6767
EXPECT_TRUE((std::ranges::output_range<decltype(v1), char>));
68+
EXPECT_TRUE(std::ranges::borrowed_range<decltype(v1)>);
69+
EXPECT_TRUE(std::ranges::borrowed_range<decltype(vec | adaptor)>);
6870

6971
auto v2 = vec | seqan3::views::single_pass_input | adaptor;
7072

@@ -77,6 +79,8 @@ void do_concepts(adaptor_t && adaptor, bool const_it)
7779
EXPECT_FALSE(std::ranges::common_range<decltype(v2)>);
7880
EXPECT_FALSE(seqan3::const_iterable_range<decltype(v2)>);
7981
EXPECT_FALSE((std::ranges::output_range<decltype(v2), char>)); // lost by single_pass_input
82+
EXPECT_TRUE(std::ranges::borrowed_range<decltype(v2)>);
83+
EXPECT_TRUE(std::ranges::borrowed_range<decltype(vec | seqan3::views::single_pass_input | adaptor)>);
8084

8185
// explicit test for non const-iterable views
8286
// https://github.com/seqan/seqan3/pull/1734#discussion_r408829267

0 commit comments

Comments
 (0)