126template <
field ...fs>
137 static constexpr size_t size =
sizeof...(fs);
140 static constexpr size_t index_of(
field f)
142 for (
size_t i = 0; i <
sizeof...(fs); ++i)
143 if (as_array[i] == f)
149 static constexpr bool contains(
field f)
151 return index_of(f) != npos;
154 static_assert([] ()
constexpr
156 for (
size_t i = 0; i < as_array.size(); ++i)
157 for (
size_t j = i + 1; j < as_array.size(); ++j)
158 if (as_array[i] == as_array[j])
162 } (),
"You may not include a field twice into fields<>.");
189template <
typename field_types,
typename field_
ids>
190struct record : detail::transfer_template_args_onto_t<field_types, std::tuple>
194 template <
typename t>
196 requires requires (t & v) { v.
clear(); }
198 static constexpr void clear_element(t & v)
noexcept(
noexcept(v.clear()))
204 template <
typename t>
205 static constexpr void clear_element(t & v)
noexcept(
noexcept(std::declval<t &>() = t{}))
211 static constexpr auto expander = [] (
auto & ...args) { (clear_element(args), ...); };
215 using base_type = detail::transfer_template_args_onto_t<field_types, std::tuple>;
228 using base_type::base_type;
232 "You must give as many IDs as types to seqan3::record.");
248 template <field f,
typename tuple_t>
249 static decltype(
auto) get_impl(field_constant<f>, tuple_t && record_as_tuple)
251 static_assert(
field_ids::contains(f),
"The record does not contain the field you wish to retrieve.");
252#if SEQAN3_WORKAROUND_GCC_94967
255 if constexpr (!std::is_lvalue_reference_v<tuple_t> && std::is_const_v<tuple_t>)
258 using return_t = std::tuple_element_t<field_ids::index_of(f), tuple_t>;
259 return static_cast<return_t
const &&
>(std::get<field_ids::index_of(f)>(std::move(record_as_tuple)));
263 return std::get<field_ids::index_of(f)>(std::forward<tuple_t>(record_as_tuple));
266 return std::get<field_ids::index_of(f)>(std::forward<tuple_t>(record_as_tuple));
281template <
typename field_types,
typename field_
ids>
282struct tuple_size<
seqan3::record<field_types, field_ids>>
283 : tuple_size<typename seqan3::record<field_types, field_ids>::base_type>
291template <
size_t elem_no,
typename field_types,
typename field_
ids>
292struct tuple_element<elem_no,
seqan3::record<field_types, field_ids>>
293 : tuple_element<elem_no, typename seqan3::record<field_types, field_ids>::base_type>
field
An enumerator for the fields used in file formats.
Definition: record.hpp:63
@ energy
Energy of a folded sequence, represented by one float number.
@ comment
Comment field of arbitrary content, usually a string.
@ structure
Fixed interactions, usually a string of structure alphabet characters.
@ bpp
Base pair probability matrix of interactions, usually a matrix of float numbers.
@ react
Reactivity values of the sequence characters given in a vector of float numbers.
@ flag
The alignment flag (bit information), uint16_t value.
@ react_err
Reactivity error values given in a vector corresponding to seqan3::field::react.
@ ref_offset
Sequence (seqan3::field::ref_seq) relative start position (0-based), unsigned value.
@ ref_seq
The (reference) "sequence" information, usually a range of nucleotides or amino acids.
@ alignment
The (pairwise) alignment stored in an object that models seqan3::detail::pairwise_alignment.
@ cigar
The cigar vector (std::vector<seqan3::cigar>) representing the alignment in SAM/BAM format.
@ mapq
The mapping quality of the seqan3::field::seq alignment, usually a Phred-scaled score.
@ user_defined_2
Identifier for user defined file formats and specialisations.
@ user_defined_5
Identifier for user defined file formats and specialisations.
@ bit_score
The bit score (statistical significance indicator), unsigned value.
@ user_defined_0
Identifier for user defined file formats and specialisations.
@ user_defined_8
Identifier for user defined file formats and specialisations.
@ user_defined_3
Identifier for user defined file formats and specialisations.
@ offset
Sequence (seqan3::field::seq) relative start position (0-based), unsigned value.
@ mate
The mate pair information given as a std::tuple of reference name, offset and template length.
@ header_ptr
A pointer to the seqan3::sam_file_header object storing header information.
@ user_defined_7
Identifier for user defined file formats and specialisations.
@ user_defined_4
Identifier for user defined file formats and specialisations.
@ ref_id
The identifier of the (reference) sequence that seqan3::field::seq was aligned to.
@ structured_seq
Sequence and fixed interactions combined in one range.
@ evalue
The e-value (length normalized bit score), double value.
@ id
The identifier, usually a string.
@ user_defined_6
Identifier for user defined file formats and specialisations.
@ tags
The optional tags in the SAM format, stored in a dictionary.
@ user_defined_1
Identifier for user defined file formats and specialisations.
@ user_defined_9
Identifier for user defined file formats and specialisations.
@ seq
The "sequence", usually a range of nucleotides or amino acids.
@ qual
The qualities, usually in Phred score notation.
constexpr bool contains
Whether a type occurs in a type list or not.
Definition: traits.hpp:231
constexpr size_t size
The size of a type pack.
Definition: traits.hpp:151
The main SeqAn3 namespace.
Definition: cigar_operation_table.hpp:2
SeqAn specific customisations in the standard namespace.
A class template that holds a choice of seqan3::field.
Definition: record.hpp:128
The class template that file records are based on; behaves like a std::tuple.
Definition: record.hpp:191
record(record &&)=default
Defaulted.
void clear() noexcept(noexcept(std::apply(expander, std::declval< record & >())))
Clears containers that provide .clear() and (re-)initialises all other elements with = {}.
Definition: record.hpp:235
~record()=default
Defaulted.
detail::transfer_template_args_onto_t< field_types, std::tuple > base_type
A specialisation of std::tuple.
Definition: record.hpp:215
record & operator=(record const &)=default
Defaulted.
record()=default
Defaulted.
record & operator=(record &&)=default
Defaulted.
record(record const &)=default
Defaulted.
Provides type traits for working with templates.