Skip to content

Commit

Permalink
[FEATURE] map_io reader and SAM input.
Browse files Browse the repository at this point in the history
  • Loading branch information
smehringer committed Mar 11, 2022
1 parent 0d99ece commit 6b35140
Show file tree
Hide file tree
Showing 18 changed files with 3,525 additions and 13 deletions.
151 changes: 151 additions & 0 deletions include/bio/detail/add_enum_bitwise_operators.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
// -----------------------------------------------------------------------------------------------------
// Copyright (c) 2006-2021, Knut Reinert & Freie Universität Berlin
// Copyright (c) 2016-2021, Knut Reinert & MPI für molekulare Genetik
// This file may be used, modified and/or redistributed under the terms of the 3-clause BSD-License
// shipped with this file and also available at: https://github.com/seqan/seqan3/blob/master/LICENSE.md
// -----------------------------------------------------------------------------------------------------

/*!\file
* \brief Provides seqan3::add_enum_bitwise_operators.
* \author Hannes Hauswedell <hannes.hauswedell AT fu-berlin.de>
*/

#pragma once

#include <type_traits>

#include <seqan3/core/platform.hpp>

namespace bio::map_io
{
/*!\interface seqan3::enum_bitwise_operators
* \brief You can expect these functions on all types that overload seqan3::add_enum_bitwise_operators.
*/
/*!\name Requirements for seqan3::enum_bitwise_operators
* \relates seqan3::enum_bitwise_operators
* \brief You can expect these member functions.
* \{
* \fn operator&(t lhs, t rhs)
* \brief Returns the binary `&` operator of lhs and rhs.
* \param lhs First enum.
* \param rhs Second enum.
*
* \returns the binary conjunction of `lhs` and `rhs`.
*
* \fn operator|(t lhs, t rhs)
* \brief Returns the binary `|` operator of lhs and rhs.
* \param lhs First enum.
* \param rhs Second enum.
*
* \returns the binary disjunction of `lhs` and `rhs`.
*
* \fn operator^(t lhs, t rhs)
* \brief Returns the binary `^` operator of lhs and rhs.
* \param lhs First enum.
* \param rhs Second enum.
*
* \returns the binary XOR operation on `lhs` and `rhs`.
*
* \fn operator~(t lhs)
* \brief Returns the binary `~` operator of lhs.
* \param lhs First enum.
*
* \returns the binary NOT operation on `lhs`.
*
* \fn operator&=(t & lhs, t rhs)
* \brief Returns the binary `&=` operator of lhs and rhs.
* \param lhs First enum.
* \param rhs Second enum.
*
* \returns the binary AND assigment on `lhs`.
*
* \fn operator|=(t & lhs, t rhs)
* \brief Returns the binary `|=` operator of lhs and rhs.
* \param lhs First enum.
* \param rhs Second enum.
*
* \returns the binary OR assignment on `lhs`.
*
* \fn operator^=(t & lhs, t rhs)
* \brief Returns the binary `^=` operator of lhs and rhs.
* \param lhs First enum.
* \param rhs Second enum.
*
* \returns the binary XOR assignment on `lhs`.
* \}
*/

//!\cond DEV
/*!\brief Set to true for a scoped enum to have binary operators overloaded.
* \ingroup core
*
* \details
*
* If this type trait is specialised for an enum, the binary operators `&`, `|`, `^`, `~`, `&=`, `|=`, `^=` will be
* added and behave just like for ints or unscoped enums.
*
* ### Example
*
* \include test/snippet/core/add_enum_bitwise_operators.cpp
*/
template <typename t>
constexpr bool add_enum_bitwise_operators = false;

/*!\name Binary operators for scoped enums
* \brief Perform binary operations like on ints or weak enums. These overloads are available if
* seqan3::add_enum_bitwise_operators is defined for your type.
* \ingroup core
*
* \details
*
* \see seqan3::add_enum_bitwise_operators
* \{
*/
template <typename t>
constexpr t operator&(t lhs, t rhs) noexcept requires std::is_enum_v<t> && add_enum_bitwise_operators<t>
{
return static_cast<t>(static_cast<std::underlying_type_t<t>>(lhs) & static_cast<std::underlying_type_t<t>>(rhs));
}

template <typename t>
constexpr t operator|(t lhs, t rhs) noexcept requires std::is_enum_v<t> && add_enum_bitwise_operators<t>
{
return static_cast<t>(static_cast<std::underlying_type_t<t>>(lhs) | static_cast<std::underlying_type_t<t>>(rhs));
}

template <typename t>
constexpr t operator^(t lhs, t rhs) noexcept requires std::is_enum_v<t> && add_enum_bitwise_operators<t>
{
return static_cast<t>(static_cast<std::underlying_type_t<t>>(lhs) ^ static_cast<std::underlying_type_t<t>>(rhs));
}

template <typename t>
constexpr t operator~(t lhs) noexcept requires std::is_enum_v<t> && add_enum_bitwise_operators<t>
{
return static_cast<t>(~static_cast<std::underlying_type_t<t>>(lhs));
}

template <typename t>
constexpr t & operator&=(t & lhs, t rhs) noexcept requires std::is_enum_v<t> && add_enum_bitwise_operators<t>
{
lhs = lhs & rhs;
return lhs;
}

template <typename t>
constexpr t & operator|=(t & lhs, t rhs) noexcept requires std::is_enum_v<t> && add_enum_bitwise_operators<t>
{
lhs = lhs | rhs;
return lhs;
}

template <typename t>
constexpr t & operator^=(t & lhs, t rhs) noexcept requires std::is_enum_v<t> && add_enum_bitwise_operators<t>
{
lhs = lhs ^ rhs;
return lhs;
}
//!\}
//!\endcond

} // namespace bio::map_io
52 changes: 52 additions & 0 deletions include/bio/format/sam.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
// -----------------------------------------------------------------------------------------------------
// Copyright (c) 2006-2021, Knut Reinert & Freie Universität Berlin
// Copyright (c) 2016-2021, Knut Reinert & MPI für molekulare Genetik
// Copyright (c) 2020-2021, deCODE Genetics
// This file may be used, modified and/or redistributed under the terms of the 3-clause BSD-License
// shipped with this file and also available at: https://github.com/seqan/seqan3/blob/master/LICENSE.md
// -----------------------------------------------------------------------------------------------------

/*!\file
* brief Provides the seqan3::format_sam.
* \author Hannes Hauswedell <hannes.hauswedell AT decode.is>
*/

#pragma once

#include <string>
#include <vector>

#include <bio/platform.hpp>

namespace bio
{

/*!\brief The sam format.
* \ingroup format
*
* \details
*
* This is the sam format tag. If you want to read sam files, use bio::map_io::reader, and if you want
* to write sam files, use bio::map_io::writer.
*
* ### Introduction
*
* sam is the de-facto-standard for mapping storage in bionformatics. See the
* [article on wikipedia](todo) for a an in-depth description of the format.
*
* ### Fields
*
* todo
*
* ### Implementation notes
*
* todo
*
*/
struct sam
{
//!\brief The valid file extensions for this format; note that you can modify this value.
static inline std::vector<std::string> file_extensions{{"sam"}};
};

} // namespace bio
Loading

0 comments on commit 6b35140

Please sign in to comment.