Maipa's Standard Library Extension 1.5.6
mstd
Loading...
Searching...
No Matches
flags.hpp
1/*
2 * mstd - Maipa's Standard Library
3 *
4 * Licensed under the BSD 3-Clause License with Attribution Requirement.
5 * See the LICENSE file for details: https://github.com/MAIPA01/mstd/blob/main/LICENSE
6 *
7 * Copyright (c) 2025, Patryk Antosik (MAIPA01)
8 */
9
10#pragma once
11#ifndef _MSTD_FLAGS_HPP_
12 #define _MSTD_FLAGS_HPP_
13
14 #include <mstd/config.hpp>
15
17_MSTD_WARNING("this is only available for c++17 and greater!");
18 #else
19
20 #include <mstd/management_types.hpp>
21
22namespace mstd {
24 template<class BitsEnum>
25 #else
26 template<class BitsEnum, std::enable_if_t<std::is_enum_v<BitsEnum>, bool> >
27 #endif
28 _MSTD_REQUIRES(std::is_enum_v<BitsEnum>)
29 class flags {
30 public:
31 using bits_type = BitsEnum;
32 using value_type = std::underlying_type_t<BitsEnum>;
33
34 private:
36
37 public:
38 #pragma region DEFAULT_CONSTRUCTORS
39 _MSTD_CONSTEXPR17 flags() noexcept = default;
40 _MSTD_CONSTEXPR17 flags(const flags& other) noexcept = default;
41 _MSTD_CONSTEXPR17 flags(flags&& other) noexcept = default;
42 #pragma endregion
43
44 #pragma region CONVERSIONS_CONSTRUCTORS
45
46 _MSTD_CONSTEXPR17 flags(const bits_type bit) noexcept : _flags(static_cast<value_type>(bit)) {}
47
48 explicit _MSTD_CONSTEXPR17 flags(const value_type flags) noexcept : _flags(flags) {}
49
50 #pragma endregion
51
52 _MSTD_CONSTEXPR20 ~flags() noexcept = default;
53
54 #pragma region DEFAULT_ASSIGNMENT_OPERATOR
55 _MSTD_CONSTEXPR17 flags& operator=(const flags& other) noexcept = default;
56 _MSTD_CONSTEXPR17 flags& operator=(flags&& other) noexcept = default;
57 #pragma endregion
58
59 [[nodiscard]] _MSTD_CONSTEXPR17 bool contains(const flags other) const noexcept {
60 return (_flags & other._flags) == other._flags;
61 }
62
63 [[nodiscard]] _MSTD_CONSTEXPR17 value_type value() const noexcept { return _flags; }
64
65 [[nodiscard]] _MSTD_CONSTEXPR17 explicit operator value_type() const noexcept { return value(); }
66
67 [[nodiscard]] _MSTD_CONSTEXPR17 flags operator|(const flags other) const noexcept { return flags(_flags | other._flags); }
68
69 [[nodiscard]] _MSTD_CONSTEXPR17 flags operator&(const flags other) const noexcept { return flags(_flags & other._flags); }
70
71 [[nodiscard]] _MSTD_CONSTEXPR17 flags operator^(const flags other) const noexcept { return flags(_flags ^ other._flags); }
72
73 _MSTD_CONSTEXPR17 flags& operator|=(const flags other) noexcept {
75 return *this;
76 }
77
78 _MSTD_CONSTEXPR17 flags& operator&=(const flags other) noexcept {
80 return *this;
81 }
82
83 _MSTD_CONSTEXPR17 flags& operator^=(const flags other) noexcept {
85 return *this;
86 }
87
88 [[nodiscard]] _MSTD_CONSTEXPR17 bool operator==(const flags other) const noexcept { return _flags == other._flags; }
89
90 [[nodiscard]] _MSTD_CONSTEXPR17 bool operator!=(const flags other) const noexcept { return !(*this == other); }
91
92 [[nodiscard]] _MSTD_CONSTEXPR17 flags operator~() const noexcept {
94 }
95
96 [[nodiscard]] _MSTD_CONSTEXPR17 bool operator!() const noexcept { return _flags == 0; }
97
98 [[nodiscard]] _MSTD_CONSTEXPR17 operator bool() const noexcept { return _flags != 0; }
99 };
100
101 template<class BitsEnum>
102 [[nodiscard]] _MSTD_CONSTEXPR17 flags<BitsEnum> operator|(const BitsEnum bit, const BitsEnum otherBit) noexcept {
103 return flags(bit) | otherBit;
104 }
105} // namespace mstd
106 #endif
107#endif
Definition flags.hpp:29
_MSTD_CONSTEXPR17 flags(const flags &other) noexcept=default
_MSTD_CONSTEXPR17 flags operator&(const flags other) const noexcept
Definition flags.hpp:69
_MSTD_CONSTEXPR20 ~flags() noexcept=default
std::underlying_type_t< BitsEnum > value_type
Definition flags.hpp:32
_MSTD_CONSTEXPR17 flags & operator=(const flags &other) noexcept=default
_MSTD_CONSTEXPR17 flags & operator|=(const flags other) noexcept
Definition flags.hpp:73
_MSTD_CONSTEXPR17 flags(const bits_type bit) noexcept
Definition flags.hpp:46
_MSTD_CONSTEXPR17 flags operator|(const flags other) const noexcept
Definition flags.hpp:67
_MSTD_CONSTEXPR17 flags & operator&=(const flags other) noexcept
Definition flags.hpp:78
_MSTD_CONSTEXPR17 value_type value() const noexcept
Definition flags.hpp:63
_MSTD_CONSTEXPR17 operator value_type() const noexcept
Definition flags.hpp:65
_MSTD_CONSTEXPR17 bool operator==(const flags other) const noexcept
Definition flags.hpp:88
_MSTD_CONSTEXPR17 flags & operator^=(const flags other) noexcept
Definition flags.hpp:83
BitsEnum bits_type
Definition flags.hpp:31
_MSTD_CONSTEXPR17 flags() noexcept=default
_MSTD_CONSTEXPR17 operator bool() const noexcept
Definition flags.hpp:98
_MSTD_CONSTEXPR17 flags(flags &&other) noexcept=default
_MSTD_CONSTEXPR17 flags operator^(const flags other) const noexcept
Definition flags.hpp:71
_MSTD_CONSTEXPR17 flags operator~() const noexcept
Definition flags.hpp:92
_MSTD_CONSTEXPR17 bool contains(const flags other) const noexcept
Definition flags.hpp:59
value_type _flags
Definition flags.hpp:35
_MSTD_CONSTEXPR17 flags(const value_type flags) noexcept
Definition flags.hpp:48
_MSTD_CONSTEXPR17 bool operator!() const noexcept
Definition flags.hpp:96
_MSTD_CONSTEXPR17 flags & operator=(flags &&other) noexcept=default
_MSTD_CONSTEXPR17 bool operator!=(const flags other) const noexcept
Definition flags.hpp:90
#define _MSTD_HAS_CXX17
Definition config.hpp:45
#define _MSTD_CONSTEXPR17
Definition config.hpp:76
#define _MSTD_HAS_CXX20
Definition config.hpp:52
#define _MSTD_REQUIRES(condition)
Definition config.hpp:86
#define _MSTD_CONSTEXPR20
Definition config.hpp:84
Definition arithmetic_types.hpp:23
_MSTD_CONSTEXPR17 flags< BitsEnum > operator|(const BitsEnum bit, const BitsEnum otherBit) noexcept
Definition flags.hpp:102