SeqAn3  3.0.1
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  drop_size = std::min(drop_size, static_cast<size_t>(std::ranges::size(urange)));
57  new_size = std::ranges::size(urange) - drop_size;
58  }
59 
60  // string_view
61  if constexpr (is_type_specialisation_of_v<remove_cvref_t<urng_t>, std::basic_string_view>)
62  {
63  return urange.substr(drop_size);
64  }
65  // string const &
66  else if constexpr (is_type_specialisation_of_v<remove_cvref_t<urng_t>, std::basic_string> &&
68  {
69  return std::basic_string_view{std::ranges::data(urange) + drop_size, new_size};
70  }
71  // contiguous
72  else if constexpr (forwarding_range<urng_t> &&
73  std::ranges::contiguous_range<urng_t> &&
74  std::ranges::sized_range<urng_t>)
75  {
76  return std::span{std::ranges::data(urange) + drop_size, new_size};
77  }
78  // random_access
79  else if constexpr (forwarding_range<urng_t> &&
80  std::ranges::random_access_range<urng_t> &&
81  std::ranges::sized_range<urng_t>)
82  {
83  return std::ranges::subrange<std::ranges::iterator_t<urng_t>, std::ranges::iterator_t<urng_t>>
84  {
85  std::ranges::begin(urange) + drop_size,
86  std::ranges::begin(urange) + drop_size + new_size,
87  new_size
88  };
89  }
90  // std::views::drop
91  else
92  {
93  return std::forward<urng_t>(urange) | std::views::drop(drop_size);
94  }
95  }
96 };
97 
98 } // namespace seqan3::detail
99 
100 // ============================================================================
101 // views::drop (adaptor instance definition)
102 // ============================================================================
103 
104 namespace seqan3::views
105 {
106 
168 inline constexpr auto drop = detail::drop_fn{};
169 
171 
172 } // namespace seqan3::views
seqan3::views
The SeqAn namespace for views.
Definition: view_to_simd.hpp:672
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:168
std::is_const_v
T is_const_v
std::ranges::begin
T begin(T... args)
forwarding_range
Specifies a range whose iterators may outlive the range and remain valid.
detail.hpp
Auxiliary header for the views submodule .