SeqAn3  3.2.0-rc.1
The Modern C++ library for sequence analysis.
alphabet/cigar/cigar.hpp
Go to the documentation of this file.
1 // -----------------------------------------------------------------------------------------------------
2 // Copyright (c) 2006-2022, Knut Reinert & Freie Universität Berlin
3 // Copyright (c) 2016-2022, 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/charconv>
16 
22 
23 // ------------------------------------------------------------------
24 // cigar
25 // ------------------------------------------------------------------
26 
27 namespace seqan3
28 {
29 
59 class cigar : public alphabet_tuple_base<cigar, uint32_t, exposition_only::cigar_operation>
60 {
61 private:
63  using base_t = alphabet_tuple_base<cigar, uint32_t, exposition_only::cigar_operation>;
64 
66  friend base_t;
68 
69 public:
99 
103  constexpr cigar() noexcept = default;
104  constexpr cigar(cigar const &) noexcept = default;
105  constexpr cigar(cigar &&) noexcept = default;
106  constexpr cigar & operator=(cigar const &) noexcept = default;
107  constexpr cigar & operator=(cigar &&) noexcept = default;
108  ~cigar() noexcept = default;
109 
110  // Inherit constructors from base
111  using base_t::base_t;
112 
121  SEQAN3_DOXYGEN_ONLY((constexpr cigar(component_type const alph) noexcept {}))
122 
131  SEQAN3_DOXYGEN_ONLY((constexpr cigar & operator=(component_type const alph) noexcept {}))
132 
133  // Inherit operators from base
134  using base_t::operator=;
136 
144  small_string<11> to_string() const noexcept
145  {
146  small_string<11> ret{}; // maximum number of digits for uint32_t + 1 char for the cigar operation
147  ret.resize(11);
148 
149  auto [ptr, errc] = std::to_chars(ret.data(), ret.data() + 10, get<0>(*this));
150 
151  *ptr = seqan3::to_char(get<1>(*this));
152  (void)errc;
153 
154  ret.resize(ptr - ret.data() + 1);
155  return ret;
156  }
158 
172  cigar & assign_string(std::string_view const input) noexcept
173  {
174  uint32_t num{};
175  auto [ptr, errc] = std::from_chars(input.data(), input.data() + input.size(), num);
176 
177  if ((errc != std::errc{}) || (!char_is_valid_for<operation>(*ptr)))
178  {
179  get<0>(*this) = 0;
180  assign_char_to('P', get<1>(*this));
181  }
182  else
183  {
184  get<0>(*this) = num;
185  assign_char_to(*ptr, get<1>(*this));
186  }
187 
188  return *this;
189  }
191 
201  SEQAN3_DOXYGEN_ONLY((friend template <size_t index> constexpr auto get(cigar & l) noexcept {}))
202 
203 
211  SEQAN3_DOXYGEN_ONLY((friend template <typename type> constexpr auto get(cigar & l) noexcept {}))
213 };
214 
216 template <typename char_t>
217 inline debug_stream_type<char_t> & operator<<(debug_stream_type<char_t> & s, cigar const c)
218 {
219  s << c.to_string();
220  return s;
221 }
222 
223 inline namespace literals
224 {
225 
226 // ------------------------------------------------------------------
227 // literals
228 // ------------------------------------------------------------------
229 
243 constexpr cigar::operation operator""_cigar_operation(char const c) noexcept
244 {
245  return cigar::operation{}.assign_char(c);
246 }
248 
249 } // namespace literals
250 
251 } // namespace seqan3
Provides seqan3::alphabet_tuple_base.
The <charconv> header from C++17's standard library.
Introduces the seqan3::exposition_only::cigar_operation alphabet.
constexpr derived_type & assign_char(char_type const chr) noexcept requires(!std
Assign from a character, implicitly converts invalid characters.
Definition: alphabet_base.hpp:163
The seqan3::cigar semialphabet pairs a counter with a seqan3::cigar::operation letter.
Definition: alphabet/cigar/cigar.hpp:60
constexpr friend auto get(cigar &l) noexcept
Definition: alphabet/cigar/cigar.hpp:201
small_string< 11 > to_string() const noexcept
Return the string representation.
Definition: alphabet/cigar/cigar.hpp:144
cigar & assign_string(std::string_view const input) noexcept
Assign from a std::string_view.
Definition: alphabet/cigar/cigar.hpp:172
constexpr cigar() noexcept=default
Defaulted.
The actual implementation of seqan3::cigar::operation for documentation purposes only.
Definition: cigar_operation.hpp:48
Implements a small string that can be used for compile time computations.
Definition: small_string.hpp:44
constexpr void resize(size_type const count) noexcept
Resizes the container to contain count elements.
Definition: small_string.hpp:232
Provides seqan3::debug_stream and related types.
constexpr auto assign_char_to
Assign a character to an alphabet object.
Definition: alphabet/concept.hpp:524
constexpr auto to_char
Return the char representation of an alphabet object.
Definition: alphabet/concept.hpp:386
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
requires detail::debug_stream_range_guard< alignment_matrix_t > &&detail::matrix< alignment_matrix_t > debug_stream_type< char_t > & operator<<(debug_stream_type< char_t > &s, alignment_matrix_t &&matrix)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: debug_matrix.hpp:496
A constexpr string implementation to manipulate string literals at compile time.
Provides alphabet adaptations for standard uint types.