SeqAn3  3.0.3
The Modern C++ library for sequence analysis.
drop.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 
14 #pragma once
15 
16 #include <seqan3/std/concepts>
17 #include <seqan3/std/iterator>
18 #include <seqan3/std/ranges>
19 #include <seqan3/std/span>
20 #include <seqan3/std/type_traits>
21 
24 #include <seqan3/io/exception.hpp>
25 
26 #ifdef SEQAN3_DEPRECATED_310
27 namespace seqan3::detail
28 {
29 
30 // ============================================================================
31 // drop_fn (adaptor definition)
32 // ============================================================================
33 
36 struct drop_fn
37 {
39  constexpr auto operator()(size_t drop_size) const noexcept
40  {
41  return detail::adaptor_from_functor{*this, drop_size};
42  }
43 
47  template <std::ranges::range urng_t>
48  constexpr auto operator()(urng_t && urange, size_t drop_size) const
49  {
50  static_assert(std::ranges::viewable_range<urng_t>,
51  "The views::drop adaptor can only be passed viewable_ranges, i.e. Views or &-to-non-View.");
52 
53  [[maybe_unused]] size_t new_size = -1;
54 
55  // safeguard against wrong size
56  if constexpr (std::ranges::sized_range<urng_t>)
57  {
58  // in standard
59  size_t urange_size = std::ranges::size(urange);
60  drop_size = std::min(drop_size, urange_size);
61  new_size = urange_size - drop_size;
62  }
63 
64  // string_view
65  if constexpr (is_type_specialisation_of_v<std::remove_cvref_t<urng_t>, std::basic_string_view>)
66  {
67  // in standard
68  return urange.substr(drop_size);
69  }
70  // string const &
71  else if constexpr (is_type_specialisation_of_v<std::remove_cvref_t<urng_t>, std::basic_string> &&
73  {
74  // not in standard
75  return std::basic_string_view{std::ranges::data(urange) + drop_size, new_size};
76  }
77  // contiguous
78  else if constexpr (std::ranges::borrowed_range<urng_t> &&
79  std::ranges::contiguous_range<urng_t> &&
80  std::ranges::sized_range<urng_t>)
81  {
82  // in standard
83  return std::span{std::ranges::data(urange) + drop_size, new_size};
84  }
85  // random_access
86  else if constexpr (std::ranges::borrowed_range<urng_t> &&
87  std::ranges::random_access_range<urng_t> &&
88  std::ranges::sized_range<urng_t>)
89  {
90  // not in standard
91  return std::ranges::subrange<std::ranges::iterator_t<urng_t>, std::ranges::iterator_t<urng_t>>
92  {
93  std::ranges::begin(urange) + drop_size,
94  std::ranges::begin(urange) + drop_size + new_size,
95  new_size
96  };
97  }
98  // std::views::drop
99  else
100  {
101  using drop_size_t = std::ranges::range_difference_t<urng_t>;
102  // urange | std::views::drop(drop_size);
103  return std::views::drop(std::forward<urng_t>(urange), static_cast<drop_size_t>(drop_size));
104  }
105  }
106 };
107 
108 } // namespace seqan3::detail
109 
110 // ============================================================================
111 // views::drop (adaptor instance definition)
112 // ============================================================================
113 
114 namespace seqan3::views
115 {
116 
180 SEQAN3_DEPRECATED_310 inline constexpr auto drop = detail::drop_fn{};
181 
183 
184 } // namespace seqan3::views
185 #endif // SEQAN3_DEPRECATED_310
Provides seqan3::detail::adaptor_from_functor.
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 drop
A view adaptor that returns all elements after n from the underlying range (or an empty range if the ...
Definition: drop.hpp:180
Provides exceptions used in the I/O module.
T is_const_v
Provides C++20 additions to the <iterator> header.
T min(T... args)
The SeqAn namespace for views.
Definition: char_to.hpp:22
#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.
Provides C++20 additions to the type_traits header.