SeqAn3  3.0.2
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 
16 #include <seqan3/io/exception.hpp>
17 #include <seqan3/range/concept.hpp>
19 #include <seqan3/std/concepts>
20 #include <seqan3/std/iterator>
21 #include <seqan3/std/ranges>
22 #include <seqan3/std/span>
23 #include <seqan3/std/type_traits>
24 
25 namespace seqan3::detail
26 {
27 
28 // ============================================================================
29 // drop_fn (adaptor definition)
30 // ============================================================================
31 
34 struct drop_fn
35 {
37  constexpr auto operator()(size_t drop_size) const noexcept
38  {
39  return detail::adaptor_from_functor{*this, drop_size};
40  }
41 
45  template <std::ranges::range urng_t>
46  constexpr auto operator()(urng_t && urange, size_t drop_size) const
47  {
48  static_assert(std::ranges::viewable_range<urng_t>,
49  "The views::drop adaptor can only be passed viewable_ranges, i.e. Views or &-to-non-View.");
50 
51  [[maybe_unused]] size_t new_size = -1;
52 
53  // safeguard against wrong size
54  if constexpr (std::ranges::sized_range<urng_t>)
55  {
56  size_t urange_size = std::ranges::size(urange);
57  drop_size = std::min(drop_size, urange_size);
58  new_size = urange_size - drop_size;
59  }
60 
61  // string_view
62  if constexpr (is_type_specialisation_of_v<std::remove_cvref_t<urng_t>, std::basic_string_view>)
63  {
64  return urange.substr(drop_size);
65  }
66  // string const &
67  else if constexpr (is_type_specialisation_of_v<std::remove_cvref_t<urng_t>, std::basic_string> &&
69  {
70  return std::basic_string_view{std::ranges::data(urange) + drop_size, new_size};
71  }
72  // contiguous
73  else if constexpr (std::ranges::borrowed_range<urng_t> &&
74  std::ranges::contiguous_range<urng_t> &&
75  std::ranges::sized_range<urng_t>)
76  {
77  return std::span{std::ranges::data(urange) + drop_size, new_size};
78  }
79  // random_access
80  else if constexpr (std::ranges::borrowed_range<urng_t> &&
81  std::ranges::random_access_range<urng_t> &&
82  std::ranges::sized_range<urng_t>)
83  {
84  return std::ranges::subrange<std::ranges::iterator_t<urng_t>, std::ranges::iterator_t<urng_t>>
85  {
86  std::ranges::begin(urange) + drop_size,
87  std::ranges::begin(urange) + drop_size + new_size,
88  new_size
89  };
90  }
91  // std::views::drop
92  else
93  {
94  return std::forward<urng_t>(urange) | std::views::drop(drop_size);
95  }
96  }
97 };
98 
99 } // namespace seqan3::detail
100 
101 // ============================================================================
102 // views::drop (adaptor instance definition)
103 // ============================================================================
104 
105 namespace seqan3::views
106 {
107 
169 inline constexpr auto drop = detail::drop_fn{};
170 
172 
173 } // namespace seqan3::views
seqan3::views
The SeqAn namespace for views.
Definition: view_iota_simd.hpp:218
span
Provides std::span from the C++20 standard library.
std::basic_string
type_traits
Provides C++20 additions to the type_traits header.
std::basic_string_view
iterator
Provides C++20 additions to the <iterator> header.
template_inspection.hpp
Provides seqan3::type_list and auxiliary type traits.
concepts
The Concepts library.
concept.hpp
Additional non-standard concepts for ranges.
exception.hpp
Provides exceptions used in the I/O module.
seqan3::pack_traits::size
constexpr size_t size
The size of a type pack.
Definition: traits.hpp:116
std::min
T min(T... args)
ranges
Adaptations of concepts from the Ranges TS.
std::remove_reference_t
seqan3::views::drop
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:169
std::is_const_v
T is_const_v
std::ranges::begin
T begin(T... args)
std::remove_cvref_t
detail.hpp
Auxiliary header for the views submodule .