Project
Loading...
Searching...
No Matches
bitfield.h
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
14
15#ifndef Q_BITFIELD_H
16#define Q_BITFIELD_H
17
18template <class T, class S>
20{
21 public:
22 bitfield(T v) : bits((S)v) {}
23 bitfield(S v = 0) : bits(v) {}
24 bitfield(const bitfield&) = default;
25 bitfield& operator=(const bitfield&) = default;
26 bitfield operator|(const bitfield v) const { return bits | v.bits; }
27 bitfield operator|(const T v) const { return bits | static_cast<S>(v); }
29 {
30 bits |= v.bits;
31 return *this;
32 }
33 bitfield operator&(const bitfield v) const { return bits & v.bits; }
34 bitfield operator&(const T v) const { return bits & static_cast<S>(v); }
36 {
37 bits &= v.bits;
38 return *this;
39 }
40 bitfield operator~() const { return ~bits; }
41 bool operator==(const bitfield v) { return bits == v.bits; }
42 bool operator==(const T v) { return bits == static_cast<S>(v); }
43 bool operator!=(const bitfield v) { return bits != v.bits; }
44 bool operator!=(const T v) { return bits != static_cast<S>(v); }
45 bitfield& setBits(const bitfield v, bool w)
46 {
47 if (w) {
48 bits |= v.bits;
49 } else {
50 bits &= ~v.bits;
51 }
52 return *this;
53 }
54 void clear() { bits = 0; }
55 void set(S v) { bits = v; }
56 void set(T v) { bits = static_cast<S>(v); }
57 template <typename... Args>
58 void set(T v, Args... args)
59 {
60 this->set(args...);
61 bits |= static_cast<S>(v);
62 }
63 S get() const { return bits; }
64 operator bool() const { return bits; }
65 operator S() const { return bits; }
66 bool isSet(const bitfield& v) const { return *this & v; }
67 bool isSet(const S v) const { return bits & v; }
68 template <typename... Args>
69 bool isSetAll(Args... args)
70 {
71 return (bits & lor(args...).bits) == lor(args...).bits;
72 }
73 template <typename... Args>
74 bool isSetAny(Args... args)
75 {
76 return (bits & lor(args...).bits) != 0;
77 }
78 template <typename... Args>
79 bool isOnlySet(Args... args)
80 {
81 return (bits & ~lor(args...).bits) == 0;
82 }
83 template <typename... Args>
84 static bitfield lor(const Args&... args)
85 {
87 retVal.set(args...);
88 return retVal;
89 }
90
91#if !defined(GPUCA_GPUCODE_DEVICE)
92 static_assert(std::is_void_v<void>, "type_traits header missing");
93 static_assert(std::is_integral_v<S>, "Storage type non integral");
94 static_assert(sizeof(S) >= sizeof(T), "Storage type has insufficient capacity");
95#endif
96
97 private:
98 S bits;
99};
100
101#endif
int32_t retVal
bitfield & operator&=(const bitfield v)
Definition bitfield.h:35
void set(S v)
Definition bitfield.h:55
void set(T v, Args... args)
Definition bitfield.h:58
bool operator==(const bitfield v)
Definition bitfield.h:41
void clear()
Definition bitfield.h:54
bool isSet(const S v) const
Definition bitfield.h:67
bitfield(const bitfield &)=default
void set(T v)
Definition bitfield.h:56
bool operator!=(const bitfield v)
Definition bitfield.h:43
bool operator==(const T v)
Definition bitfield.h:42
bitfield operator&(const T v) const
Definition bitfield.h:34
bitfield(T v)
Definition bitfield.h:22
S get() const
Definition bitfield.h:63
bitfield operator|(const T v) const
Definition bitfield.h:27
bitfield operator|(const bitfield v) const
Definition bitfield.h:26
bitfield & setBits(const bitfield v, bool w)
Definition bitfield.h:45
bitfield & operator=(const bitfield &)=default
bitfield operator~() const
Definition bitfield.h:40
bitfield(S v=0)
Definition bitfield.h:23
bool isSetAll(Args... args)
Definition bitfield.h:69
bitfield & operator|=(const bitfield v)
Definition bitfield.h:28
bool isSetAny(Args... args)
Definition bitfield.h:74
static bitfield lor(const Args &... args)
Definition bitfield.h:84
bool isOnlySet(Args... args)
Definition bitfield.h:79
bool isSet(const bitfield &v) const
Definition bitfield.h:66
bitfield operator&(const bitfield v) const
Definition bitfield.h:33
bool operator!=(const T v)
Definition bitfield.h:44
const GLdouble * v
Definition glcorearb.h:832
GLenum GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const void * bits
Definition glcorearb.h:4150
GLubyte GLubyte GLubyte GLubyte w
Definition glcorearb.h:852