Project
Loading...
Searching...
No Matches
AbstractRef.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
15
16#ifndef ALICEO2_ABSTRACT_REF_H
17#define ALICEO2_ABSTRACT_REF_H
18
19#include "GPUCommonDef.h"
20#include "GPUCommonRtypes.h"
21#include "GPUCommonTypeTraits.h"
22
23namespace o2::dataformats
24{
25
26template <int NBIdx, int NBSrc, int NBFlg>
28{
29 template <int NBIT>
30 static constexpr auto MVAR()
31 {
32 static_assert(NBIT <= 64, "> 64 bits not supported");
33 if constexpr (NBIT > 32) {
34 uint64_t tp = 0;
35 return tp;
36 } else if constexpr (NBIT > 16) {
37 uint32_t tp = 0;
38 return tp;
39 } else if constexpr (NBIT > 8) {
40 uint16_t tp = 0;
41 return tp;
42 } else {
43 uint8_t tp = 0;
44 return tp;
45 }
46 }
47
48 public:
49 using Base_t = decltype(AbstractRef::MVAR<NBIdx + NBSrc + NBFlg>());
50 using Idx_t = decltype(AbstractRef::MVAR<NBIdx>());
51 using Src_t = decltype(AbstractRef::MVAR<NBSrc>());
52 using Flg_t = decltype(AbstractRef::MVAR<NBFlg>());
53
54 static constexpr Base_t BaseMask = Base_t((((0x1U << (NBIdx + NBSrc + NBFlg - 1)) - 1) << 1) + 1);
55 static constexpr Idx_t IdxMask = Idx_t((((0x1U << (NBIdx - 1)) - 1) << 1) + 1);
56 static constexpr Src_t SrcMask = Src_t((((0x1U << (NBSrc - 1)) - 1) << 1) + 1);
57 static constexpr Flg_t FlgMask = Flg_t((((0x1U << (NBFlg - 1)) - 1) << 1) + 1);
58 static constexpr int NBitsIndex() { return NBIdx; }
59 static constexpr int NBitsSource() { return NBSrc; }
60 static constexpr int NBitsFlags() { return NBFlg; }
61
62 GPUdDefault() AbstractRef() = default;
63
64 GPUdi() AbstractRef(Idx_t idx, Src_t src) { set(idx, src); }
65 GPUdi() AbstractRef(Base_t raw) : mRef(raw) {}
66
67 //
68 GPUdi() Idx_t getIndex() const { return static_cast<Idx_t>(mRef & IdxMask); }
69 GPUdi() void setIndex(Idx_t idx) { mRef = (mRef & (BaseMask & ~IdxMask)) | (IdxMask & idx); }
70
71 //
72 GPUdi() Src_t getSource() const { return static_cast<Idx_t>((mRef >> NBIdx) & SrcMask); }
73 GPUdi() void setSource(Src_t src) { mRef = (mRef & (BaseMask & ~(SrcMask << NBIdx))) | ((SrcMask & src) << NBIdx); }
74
75 //
76 GPUdi() Flg_t getFlags() const { return static_cast<Flg_t>((mRef >> (NBIdx + NBSrc)) & FlgMask); }
77 GPUdi() void setFlags(Flg_t f) { mRef = (mRef & (BaseMask & ~(FlgMask << (NBIdx + NBSrc)))) | ((FlgMask & f) << NBIdx); }
78 GPUdi() bool testBit(int i) const { return (mRef >> (NBIdx + NBSrc)) & ((0x1U << i) & FlgMask); }
79 GPUdi() void setBit(int i) { mRef = (mRef & (BaseMask & ~(0x1U << (i + NBIdx + NBSrc)))) | (((0x1U << i) & FlgMask) << (NBIdx + NBSrc)); }
80 GPUdi() void resetBit(int i) { mRef = (mRef & (BaseMask & ~(0x1U << (i + NBIdx + NBSrc)))); }
81 GPUdi() void set(Idx_t idx, Src_t src) { mRef = (mRef & ((Base_t)FlgMask << (NBIdx + NBSrc))) | ((SrcMask & Src_t(src)) << NBIdx) | (IdxMask & Idx_t(idx)); }
82
83 GPUdi() Base_t getRaw() const { return mRef; }
84 GPUdi() void setRaw(Base_t v) { mRef = v; }
85 GPUdi() Base_t getRawWOFlags() const { return mRef & (IdxMask | (SrcMask << NBIdx)); }
86 GPUdi() bool isIndexSet() const { return getIndex() != IdxMask; }
87 GPUdi() bool isSourceSet() const { return getSource() != SrcMask; }
88
89 GPUdi() bool operator==(const AbstractRef& o) const { return getRawWOFlags() == o.getRawWOFlags(); }
90 GPUdi() bool operator!=(const AbstractRef& o) const { return !operator==(o); }
91 GPUdi() void clear() { setRaw((Base_t(SrcMask & ((0x1 << NBSrc) - 1)) << NBIdx) | Base_t(IdxMask & ((0x1 << NBIdx) - 1))); }
92
93 protected:
94 Base_t mRef = IdxMask | (SrcMask << NBIdx); // packed reference, dummy by default
95
97};
98
99} // namespace o2::dataformats
100
101#endif
int32_t i
bool o
GPUdi() void set(Idx_t idx
GPUdi() bool testBit(int i) const
Definition AbstractRef.h:78
GPUdi() void setFlags(Flg_t f)
Definition AbstractRef.h:77
GPUdDefault() AbstractRef()=default
static constexpr Flg_t FlgMask
Definition AbstractRef.h:57
GPUdi() Base_t getRawWOFlags() const
Definition AbstractRef.h:85
GPUdi() Idx_t getIndex() const
Definition AbstractRef.h:68
GPUdi() Flg_t getFlags() const
Definition AbstractRef.h:76
static constexpr int NBitsIndex()
Definition AbstractRef.h:58
static constexpr int NBitsSource()
Definition AbstractRef.h:59
GPUdi() void setRaw(Base_t v)
Definition AbstractRef.h:84
static constexpr Base_t BaseMask
Definition AbstractRef.h:54
GPUdi() void setIndex(Idx_t idx)
Definition AbstractRef.h:69
GPUdi() Src_t getSource() const
Definition AbstractRef.h:72
static constexpr Idx_t IdxMask
Definition AbstractRef.h:55
GPUdi() Base_t getRaw() const
Definition AbstractRef.h:83
GPUdi() void setSource(Src_t src)
Definition AbstractRef.h:73
decltype(AbstractRef::MVAR< NBFlg >()) Flg_t
Definition AbstractRef.h:52
decltype(AbstractRef::MVAR< NBSrc >()) Src_t
Definition AbstractRef.h:51
GPUdi() AbstractRef(Base_t raw)
Definition AbstractRef.h:65
GPUdi() void setBit(int i)
Definition AbstractRef.h:79
decltype(AbstractRef::MVAR< NBIdx+NBSrc+NBFlg >()) Base_t
Definition AbstractRef.h:49
GPUdi() bool isSourceSet() const
Definition AbstractRef.h:87
GPUdi() void resetBit(int i)
Definition AbstractRef.h:80
decltype(AbstractRef::MVAR< NBIdx >()) Idx_t
Definition AbstractRef.h:50
GPUdi() bool isIndexSet() const
Definition AbstractRef.h:86
static constexpr Src_t SrcMask
Definition AbstractRef.h:56
static constexpr int NBitsFlags()
Definition AbstractRef.h:60
GPUdi() AbstractRef(Idx_t idx
GLenum src
Definition glcorearb.h:1767
const GLdouble * v
Definition glcorearb.h:832
GLdouble f
Definition glcorearb.h:310
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
Definition of a container to keep/associate and arbitrary number of labels associated to an index wit...
bool operator==(const observer_ptr< W1 > &p1, const observer_ptr< W2 > &p2)
vec clear()