SeqAn3 3.3.0-rc.1
The Modern C++ library for sequence analysis.
 
Loading...
Searching...
No Matches
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
27namespace seqan3
28{
29
59class cigar : public alphabet_tuple_base<cigar, uint32_t, exposition_only::cigar_operation>
60{
61private:
64
66 friend base_t;
68
69public:
97
101 constexpr cigar() noexcept = default;
102 constexpr cigar(cigar const &) noexcept = default;
103 constexpr cigar(cigar &&) noexcept = default;
104 constexpr cigar & operator=(cigar const &) noexcept = default;
105 constexpr cigar & operator=(cigar &&) noexcept = default;
106 ~cigar() noexcept = default;
107
108 // Inherit constructors from base
109 using base_t::base_t;
110
119 SEQAN3_DOXYGEN_ONLY((constexpr cigar(component_type const alph) noexcept {}))
120
129 SEQAN3_DOXYGEN_ONLY((constexpr cigar & operator=(component_type const alph) noexcept {}))
130
131 // Inherit operators from base
132 using base_t::operator=;
134
143 {
144 small_string<11> ret{}; // maximum number of digits for uint32_t + 1 char for the cigar operation
145 ret.resize(11);
146
147 auto [ptr, errc] = std::to_chars(ret.data(), ret.data() + 10, get<0>(*this));
148
149 *ptr = seqan3::to_char(get<1>(*this));
150 (void)errc;
151
152 ret.resize(ptr - ret.data() + 1);
153 return ret;
154 }
156
170 cigar & assign_string(std::string_view const input) noexcept
171 {
172 uint32_t num{};
173 auto [ptr, errc] = std::from_chars(input.data(), input.data() + input.size(), num);
174
175 if ((errc != std::errc{}) || (!char_is_valid_for<operation>(*ptr)))
176 {
177 get<0>(*this) = 0;
178 assign_char_to('P', get<1>(*this));
179 }
180 else
181 {
182 get<0>(*this) = num;
183 assign_char_to(*ptr, get<1>(*this));
184 }
185
186 return *this;
187 }
189
199 SEQAN3_DOXYGEN_ONLY((friend template <size_t index> constexpr auto get(cigar & l) noexcept {}))
200
201
209 SEQAN3_DOXYGEN_ONLY((friend template <typename type> constexpr auto get(cigar & l) noexcept {}))
211};
212
214template <typename char_t>
215inline debug_stream_type<char_t> & operator<<(debug_stream_type<char_t> & s, cigar const c)
216{
217 s << c.to_string();
218 return s;
219}
220
221inline namespace literals
222{
223
224// ------------------------------------------------------------------
225// literals
226// ------------------------------------------------------------------
227
241constexpr cigar::operation operator""_cigar_operation(char const c) noexcept
242{
243 return cigar::operation{}.assign_char(c);
244}
246
247} // namespace literals
248
249} // 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
Assign from a character, implicitly converts invalid characters.
Definition: alphabet_base.hpp:163
The CRTP base for a combined alphabet that contains multiple values of different alphabets at the sam...
Definition: alphabet_tuple_base.hpp:116
The seqan3::cigar semialphabet pairs a counter with a seqan3::cigar::operation letter.
Definition: alphabet/cigar/cigar.hpp:60
friend constexpr auto get(cigar &l) noexcept
Tuple-like access to the contained components.
Definition: alphabet/cigar/cigar.hpp:199
cigar & assign_string(std::string_view const input) noexcept
Assign from a std::string_view.
Definition: alphabet/cigar/cigar.hpp:170
constexpr cigar() noexcept=default
Defaulted.
alphabet_tuple_base< cigar, uint32_t, exposition_only::cigar_operation > base_t
The base class.
Definition: alphabet/cigar/cigar.hpp:63
small_string< 11 > to_string() const noexcept
Return the string representation.
Definition: alphabet/cigar/cigar.hpp:142
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.
T from_chars(T... args)
debug_stream_type< char_t > & operator<<(debug_stream_type< char_t > &stream, alignment_t &&alignment)
Stream operator for alignments, which are represented as tuples of aligned sequences.
Definition: debug_stream_alignment.hpp:110
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
A constexpr string implementation to manipulate string literals at compile time.
T to_chars(T... args)
Provides alphabet adaptations for standard uint types.