SeqAn3  3.0.1
The Modern C++ library for sequence analysis.
trim.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 
19 #include <seqan3/std/ranges>
20 
21 namespace seqan3::detail
22 {
23 
29 struct trim_fn
30 {
32  template <typename threshold_t>
33  constexpr auto operator()(threshold_t const threshold) const
34  {
36  "The threshold must either be a quality alphabet or an integral type "
37  "in which case it is compared with the underlying phred type.");
38 
39  return adaptor_from_functor{*this, threshold};
40  }
41 
47  template <std::ranges::input_range irng_t, typename threshold_t>
48  constexpr auto operator()(irng_t && irange, threshold_t const threshold) const
49  {
50  static_assert(quality_alphabet<std::remove_reference_t<reference_t<irng_t>>>,
51  "views::trim can only operate on ranges over seqan3::quality_alphabet.");
52  static_assert(std::same_as<remove_cvref_t<threshold_t>, remove_cvref_t<reference_t<irng_t>>> ||
53  std::integral<remove_cvref_t<threshold_t>>,
54  "The threshold must either be a letter of the underlying alphabet or an integral type "
55  "in which case it is compared with the underlying phred type.");
56 
57  return views::take_until(std::forward<irng_t>(irange), [threshold] (auto const value)
58  {
59  if constexpr (std::same_as<remove_cvref_t<threshold_t>, remove_cvref_t<reference_t<irng_t>>>)
60  {
61  return to_phred(value) < to_phred(threshold);
62  }
63  else
64  {
65  using c_t = std::common_type_t<decltype(to_phred(value)), threshold_t>;
66  return static_cast<c_t>(to_phred(value)) < static_cast<c_t>(threshold);
67  }
68  });
69  }
70 };
71 
72 } // namespace seqan3::detail
73 
74 namespace seqan3::views
75 {
76 
128 inline constexpr auto trim = deep{seqan3::detail::trim_fn{}};
129 
131 
132 } // namespace seqan3::views
seqan3::remove_cvref_t
std::remove_cv_t< std::remove_reference_t< t > > remove_cvref_t
Return the input type with const, volatile and references removed (type trait).
Definition: basic.hpp:35
qualified.hpp
Provides quality alphabet composites.
seqan3::views
The SeqAn namespace for views.
Definition: view_to_simd.hpp:672
take_until.hpp
Provides seqan3::views::take_until and seqan3::views::take_until_or_throw.
all.hpp
Provides various type traits.
quality_alphabet
A concept that indicates whether an alphabet represents quality scores.
std::common_type_t
seqan3::views::trim
constexpr auto trim
A view that does quality-threshold trimming on a range of seqan3::quality_alphabet.
Definition: trim.hpp:128
same_as
The concept std::same_as<T, U> is satisfied if and only if T and U denote the same type.
seqan3::views::deep
A wrapper type around an existing view adaptor that enables "deep view" behaviour for that view.
Definition: deep.hpp:101
seqan3::views::take_until
constexpr auto take_until
A view adaptor that returns elements from the underlying range until the functor evaluates to true (o...
Definition: take_until.hpp:585
seqan3::to_phred
constexpr auto to_phred
The public getter function for the phred representation of a quality score.
Definition: concept.hpp:89
ranges
Adaptations of concepts from the Ranges TS.
deep.hpp
Provides seqan3::views::deep.
std::remove_reference_t
integral
The concept integral is satisfied if and only if T is an integral type.