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-2020, Knut Reinert & Freie Universität Berlin
3 // Copyright (c) 2016-2020, 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/iterator>
17 #include <seqan3/std/ranges>
18 #include <seqan3/std/span>
19 #include <seqan3/std/type_traits>
20 
22 #include <seqan3/io/exception.hpp>
23 #include <seqan3/range/concept.hpp>
25 
26 namespace seqan3::detail
27 {
28 
29 // ============================================================================
30 // drop_fn (adaptor definition)
31 // ============================================================================
32 
35 struct drop_fn
36 {
38  constexpr auto operator()(size_t drop_size) const noexcept
39  {
40  return detail::adaptor_from_functor{*this, drop_size};
41  }
42 
46  template <std::ranges::range urng_t>
47  constexpr auto operator()(urng_t && urange, size_t drop_size) const
48  {
49  static_assert(std::ranges::viewable_range<urng_t>,
50  "The views::drop adaptor can only be passed viewable_ranges, i.e. Views or &-to-non-View.");
51 
52  [[maybe_unused]] size_t new_size = -1;
53 
54  // safeguard against wrong size
55  if constexpr (std::ranges::sized_range<urng_t>)
56  {
57  size_t urange_size = std::ranges::size(urange);
58  drop_size = std::min(drop_size, urange_size);
59  new_size = urange_size - drop_size;
60  }
61 
62  // string_view
63  if constexpr (is_type_specialisation_of_v<std::remove_cvref_t<urng_t>, std::basic_string_view>)
64  {
65  return urange.substr(drop_size);
66  }
67  // string const &
68  else if constexpr (is_type_specialisation_of_v<std::remove_cvref_t<urng_t>, std::basic_string> &&
70  {
71  return std::basic_string_view{std::ranges::data(urange) + drop_size, new_size};
72  }
73  // contiguous
74  else if constexpr (std::ranges::borrowed_range<urng_t> &&
75  std::ranges::contiguous_range<urng_t> &&
76  std::ranges::sized_range<urng_t>)
77  {
78  return std::span{std::ranges::data(urange) + drop_size, new_size};
79  }
80  // random_access
81  else if constexpr (std::ranges::borrowed_range<urng_t> &&
82  std::ranges::random_access_range<urng_t> &&
83  std::ranges::sized_range<urng_t>)
84  {
85  return std::ranges::subrange<std::ranges::iterator_t<urng_t>, std::ranges::iterator_t<urng_t>>
86  {
87  std::ranges::begin(urange) + drop_size,
88  std::ranges::begin(urange) + drop_size + new_size,
89  new_size
90  };
91  }
92  // std::views::drop
93  else
94  {
95  using drop_size_t = std::ranges::range_difference_t<urng_t>;
96  // urange | std::views::drop(drop_size);
97  return std::views::drop(std::forward<urng_t>(urange), static_cast<drop_size_t>(drop_size));
98  }
99  }
100 };
101 
102 } // namespace seqan3::detail
103 
104 // ============================================================================
105 // views::drop (adaptor instance definition)
106 // ============================================================================
107 
108 namespace seqan3::views
109 {
110 
172 inline constexpr auto drop = detail::drop_fn{};
173 
175 
176 } // namespace seqan3::views
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:150
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:172
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.
Additional non-standard concepts for ranges.
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.