SeqAn3
add_enum_bitwise_operators.hpp
Go to the documentation of this file.
1 // ============================================================================
2 // SeqAn - The Library for Sequence Analysis
3 // ============================================================================
4 //
5 // Copyright (c) 2006-2018, Knut Reinert & Freie Universitaet Berlin
6 // Copyright (c) 2016-2018, Knut Reinert & MPI Molekulare Genetik
7 // All rights reserved.
8 //
9 // Redistribution and use in source and binary forms, with or without
10 // modification, are permitted provided that the following conditions are met:
11 //
12 // * Redistributions of source code must retain the above copyright
13 // notice, this list of conditions and the following disclaimer.
14 // * Redistributions in binary form must reproduce the above copyright
15 // notice, this list of conditions and the following disclaimer in the
16 // documentation and/or other materials provided with the distribution.
17 // * Neither the name of Knut Reinert or the FU Berlin nor the names of
18 // its contributors may be used to endorse or promote products derived
19 // from this software without specific prior written permission.
20 //
21 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 // ARE DISCLAIMED. IN NO EVENT SHALL KNUT REINERT OR THE FU BERLIN BE LIABLE
25 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27 // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28 // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 // OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
31 // DAMAGE.
32 //
33 // ============================================================================
34 
40 #pragma once
41 
42 #include <type_traits>
43 
44 #include <seqan3/core/platform.hpp>
45 
46 namespace seqan3
47 {
48 
61 template <typename t>
62 constexpr bool add_enum_bitwise_operators = false;
63 
71 template <typename t>
72 constexpr t operator& (t lhs, t rhs) noexcept
73  requires std::is_enum_v<t> && add_enum_bitwise_operators<t>
74 {
75  return static_cast<t>(static_cast<std::underlying_type_t<t>>(lhs) & static_cast<std::underlying_type_t<t>>(rhs));
76 }
77 
78 template <typename t>
79 constexpr t operator| (t lhs, t rhs) noexcept
80  requires std::is_enum_v<t> && add_enum_bitwise_operators<t>
81 {
82  return static_cast<t>(static_cast<std::underlying_type_t<t>>(lhs) | static_cast<std::underlying_type_t<t>>(rhs));
83 }
84 
85 template <typename t>
86 constexpr t operator^ (t lhs, t rhs) noexcept
87  requires std::is_enum_v<t> && add_enum_bitwise_operators<t>
88 {
89  return static_cast<t>(static_cast<std::underlying_type_t<t>>(lhs) ^ static_cast<std::underlying_type_t<t>>(rhs));
90 }
91 
92 template <typename t>
93 constexpr t operator~ (t lhs) noexcept
94  requires std::is_enum_v<t> && add_enum_bitwise_operators<t>
95 {
96  return static_cast<t>(~static_cast<std::underlying_type_t<t>>(lhs));
97 }
98 
99 template <typename t>
100 constexpr t & operator&= (t & lhs, t rhs) noexcept
101  requires std::is_enum_v<t> && add_enum_bitwise_operators<t>
102 {
103  lhs = lhs & rhs;
104  return lhs;
105 }
106 
107 template <typename t>
108 constexpr t & operator|= (t & lhs, t rhs) noexcept
109  requires std::is_enum_v<t> && add_enum_bitwise_operators<t>
110 {
111  lhs = lhs | rhs;
112  return lhs;
113 }
114 
115 template <typename t>
116 constexpr t & operator^= (t & lhs, t rhs) noexcept
117  requires std::is_enum_v<t> && add_enum_bitwise_operators<t>
118 {
119  lhs = lhs ^ rhs;
120  return lhs;
121 }
123 
124 } // namespace seqan3
Contains platform and dependency checks.
constexpr bool add_enum_bitwise_operators
Set to true for a scoped enum to have binary operators overloaded.
Definition: add_enum_bitwise_operators.hpp:62
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:58
Provides C++20 additions to the type_traits header.
auto operator|(validator1_type &&vali1, validator2_type &&vali2)
Enables the chaining of validators. !
Definition: validators.hpp:671