SeqAn3  3.0.1
The Modern C++ library for sequence analysis.
add_enum_bitwise_operators.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 
15 #include <type_traits>
16 
17 #include <seqan3/core/platform.hpp>
18 
19 namespace seqan3
20 {
21 
34 template <typename t>
35 constexpr bool add_enum_bitwise_operators = false;
36 
44 template <typename t>
45 constexpr t operator& (t lhs, t rhs) noexcept
46  requires std::is_enum_v<t> && add_enum_bitwise_operators<t>
47 {
48  return static_cast<t>(static_cast<std::underlying_type_t<t>>(lhs) & static_cast<std::underlying_type_t<t>>(rhs));
49 }
50 
51 template <typename t>
52 constexpr t operator| (t lhs, t rhs) noexcept
53  requires std::is_enum_v<t> && add_enum_bitwise_operators<t>
54 {
55  return static_cast<t>(static_cast<std::underlying_type_t<t>>(lhs) | static_cast<std::underlying_type_t<t>>(rhs));
56 }
57 
58 template <typename t>
59 constexpr t operator^ (t lhs, t rhs) noexcept
60  requires std::is_enum_v<t> && add_enum_bitwise_operators<t>
61 {
62  return static_cast<t>(static_cast<std::underlying_type_t<t>>(lhs) ^ static_cast<std::underlying_type_t<t>>(rhs));
63 }
64 
65 template <typename t>
66 constexpr t operator~ (t lhs) noexcept
67  requires std::is_enum_v<t> && add_enum_bitwise_operators<t>
68 {
69  return static_cast<t>(~static_cast<std::underlying_type_t<t>>(lhs));
70 }
71 
72 template <typename t>
73 constexpr t & operator&= (t & lhs, t rhs) noexcept
74  requires std::is_enum_v<t> && add_enum_bitwise_operators<t>
75 {
76  lhs = lhs & rhs;
77  return lhs;
78 }
79 
80 template <typename t>
81 constexpr t & operator|= (t & lhs, t rhs) noexcept
82  requires std::is_enum_v<t> && add_enum_bitwise_operators<t>
83 {
84  lhs = lhs | rhs;
85  return lhs;
86 }
87 
88 template <typename t>
89 constexpr t & operator^= (t & lhs, t rhs) noexcept
90  requires std::is_enum_v<t> && add_enum_bitwise_operators<t>
91 {
92  lhs = lhs ^ rhs;
93  return lhs;
94 }
96 
97 } // namespace seqan3
seqan3::operator|
auto operator|(validator1_type &&vali1, validator2_type &&vali2)
Enables the chaining of validators.
Definition: validators.hpp:1023
std::underlying_type_t
seqan3
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:36
platform.hpp
Provides platform and dependency checks.
seqan3::add_enum_bitwise_operators
constexpr bool add_enum_bitwise_operators
Set to true for a scoped enum to have binary operators overloaded.
Definition: add_enum_bitwise_operators.hpp:35