SeqAn3 3.2.0
The Modern C++ library for sequence analysis.
type_reduce.hpp
Go to the documentation of this file.
1// -----------------------------------------------------------------------------------------------------
2// Copyright (c) 2006-2022, Knut Reinert & Freie Universität Berlin
3// Copyright (c) 2016-2022, Knut Reinert & MPI für molekulare Genetik
4// This file may be used, modified and/or redistributed under the terms of the 3-clause BSD-License
5// shipped with this file and also available at: https://github.com/seqan/seqan3/blob/master/LICENSE.md
6// -----------------------------------------------------------------------------------------------------
7
13#pragma once
14
15#include <concepts>
16#include <ranges>
17#include <span>
18#include <string_view>
19
22
23namespace seqan3::detail
24{
25
26// ============================================================================
27// type_reduce_fn (adaptor definition)
28// ============================================================================
29
32class type_reduce_fn : public adaptor_base<type_reduce_fn>
33{
34private:
36 using base_t = adaptor_base<type_reduce_fn>;
37
38public:
40 using base_t::base_t;
41
42private:
44 friend base_t;
45
49 template <std::ranges::range urng_t>
50 static constexpr auto impl(urng_t && urange)
51 {
52 static_assert(
53 std::ranges::viewable_range<urng_t>,
54 "The views::type_reduce adaptor can only be passed viewable_ranges, i.e. Views or &-to-non-View.");
55
56 // string_view
57 if constexpr (is_type_specialisation_of_v<std::remove_cvref_t<urng_t>, std::basic_string_view>)
58 {
59 return std::views::all(std::forward<urng_t>(urange));
60 }
61 // string const &
62 else if constexpr (is_type_specialisation_of_v<std::remove_cvref_t<urng_t>, std::basic_string>
63 && std::is_const_v<std::remove_reference_t<urng_t>>)
64 {
65 return std::basic_string_view{std::ranges::data(urange), std::ranges::size(urange)};
66 }
67 // contiguous
68 else if constexpr (std::ranges::borrowed_range<urng_t> && std::ranges::contiguous_range<urng_t>
69 && std::ranges::sized_range<urng_t>)
70 {
71 return std::span{std::ranges::data(urange), std::ranges::size(urange)};
72 }
73 // random_access
74 else if constexpr (std::ranges::borrowed_range<urng_t> && std::ranges::random_access_range<urng_t>
75 && std::ranges::sized_range<urng_t>)
76 {
77 return std::ranges::subrange<std::ranges::iterator_t<urng_t>, std::ranges::iterator_t<urng_t>>{
78 std::ranges::begin(urange),
79 std::ranges::begin(urange) + std::ranges::size(urange),
80 std::ranges::size(urange)};
81 }
82 // pass to std::views::all (will return a view or ref-view)
83 else
84 {
85 return std::views::all(std::forward<urng_t>(urange));
86 }
87 }
88};
89
90} // namespace seqan3::detail
91
92// ============================================================================
93// views::type_reduce (adaptor instance definition)
94// ============================================================================
95
96namespace seqan3::views
97{
150inline constexpr auto type_reduce = detail::type_reduce_fn{};
151
152} // namespace seqan3::views
153
154namespace seqan3
155{
161template <typename t>
162using type_reduce_t = decltype(views::type_reduce(std::declval<t>()));
163} // namespace seqan3
Provides seqan3::detail::adaptor_base and seqan3::detail::combined_adaptor.
T begin(T... args)
constexpr size_t size
The size of a type pack.
Definition: traits.hpp:146
constexpr auto type_reduce
A view adaptor that behaves like std::views::all, but type erases certain ranges.
Definition: type_reduce.hpp:150
The SeqAn namespace for views.
Definition: char_strictly_to.hpp:22
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
decltype(views::type_reduce(std::declval< t >())) type_reduce_t
Deduces the return value of seqan3::views::type_reduce.
Definition: type_reduce.hpp:162
Provides type traits for working with templates.