SeqAn3  3.0.3
The Modern C++ library for sequence analysis.
type_reduce.hpp
Go to the documentation of this file.
1 // -----------------------------------------------------------------------------------------------------
2 // Copyright (c) 2006-2021, Knut Reinert & Freie Universität Berlin
3 // Copyright (c) 2016-2021, 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 <seqan3/std/concepts>
16 #include <seqan3/std/ranges>
17 #include <seqan3/std/span>
18 #include <string_view>
19 
22 
23 namespace seqan3::detail
24 {
25 
26 // ============================================================================
27 // type_reduce_fn (adaptor definition)
28 // ============================================================================
29 
32 class type_reduce_fn : public adaptor_base<type_reduce_fn>
33 {
34 private:
36  using base_t = adaptor_base<type_reduce_fn>;
37 
38 public:
40  using base_t::base_t;
41 
42 private:
44  friend base_t;
45 
49  template <std::ranges::range urng_t>
50  static constexpr auto impl(urng_t && urange)
51  {
52  static_assert(std::ranges::viewable_range<urng_t>,
53  "The views::type_reduce adaptor can only be passed viewable_ranges, i.e. Views or &-to-non-View.");
54 
55  // views are always passed as-is
56  if constexpr (std::ranges::view<std::remove_cvref_t<urng_t>>)
57  {
58  return std::views::all(std::forward<urng_t>(urange));
59  }
60  // string const &
61  else if constexpr (is_type_specialisation_of_v<std::remove_cvref_t<urng_t>, std::basic_string> &&
63  {
64  return std::basic_string_view{std::ranges::data(urange), std::ranges::size(urange)};
65  }
66  // contiguous
67  else if constexpr (std::ranges::borrowed_range<urng_t> &&
68  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> &&
75  std::ranges::random_access_range<urng_t> &&
76  std::ranges::sized_range<urng_t>)
77  {
78  return std::ranges::subrange<std::ranges::iterator_t<urng_t>, std::ranges::iterator_t<urng_t>>
79  {
80  std::ranges::begin(urange),
81  std::ranges::begin(urange) + std::ranges::size(urange),
82  std::ranges::size(urange)
83  };
84  }
85  // pass to std::views::all (will return ref-view)
86  else
87  {
88  return std::views::all(std::forward<urng_t>(urange));
89  }
90  }
91 };
92 
93 } // namespace seqan3::detail
94 
95 // ============================================================================
96 // views::type_reduce (adaptor instance definition)
97 // ============================================================================
98 
99 namespace seqan3::views
100 {
101 
158 inline constexpr auto type_reduce = detail::type_reduce_fn{};
159 
161 
162 } // namespace seqan3::views
163 
164 namespace seqan3
165 {
171 template <typename t>
172 using type_reduce_t = decltype(views::type_reduce(std::declval<t>()));
173 
177 #ifdef SEQAN3_DEPRECATED_310
178 template <typename t>
180 #endif // SEQAN3_DEPRECATED_310
181 }
Provides seqan3::detail::adaptor_base and seqan3::detail::combined_adaptor.
T begin(T... args)
The Concepts library.
Provides type traits for working with templates.
constexpr size_t size
The size of a type pack.
Definition: traits.hpp:151
constexpr auto type_reduce
A view adaptor that behaves like std::views::all, but type erases certain ranges.
Definition: type_reduce.hpp:158
T is_const_v
The SeqAn namespace for views.
Definition: char_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:172
type_reduce_t< t > type_reduce_view
[DEPRECATED] Deduces the return value of seqan3::views::type_reduce.
Definition: type_reduce.hpp:179
#define SEQAN3_DEPRECATED_310
Deprecation message for SeqAn 3.1.0 release.
Definition: platform.hpp:203
Adaptations of concepts from the Ranges TS.
Provides std::span from the C++20 standard library.