16#ifndef ALICEO2_ABSTRACT_REF_H
17#define ALICEO2_ABSTRACT_REF_H
21#ifndef GPUCA_GPUCODE_DEVICE
28template <
int NBIdx,
int NBSrc,
int NBFlg>
32 static constexpr auto MVAR()
34 static_assert(NBIT <= 64,
"> 64 bits not supported");
35 if constexpr (NBIT > 32) {
38 }
else if constexpr (NBIT > 16) {
41 }
else if constexpr (NBIT > 8) {
51 using Base_t =
decltype(AbstractRef::MVAR<NBIdx + NBSrc + NBFlg>());
52 using Idx_t =
decltype(AbstractRef::MVAR<NBIdx>());
53 using Src_t =
decltype(AbstractRef::MVAR<NBSrc>());
54 using Flg_t =
decltype(AbstractRef::MVAR<NBFlg>());
71 GPUdi()
void setIndex(
Idx_t idx) { mRef = (mRef & (BaseMask & ~IdxMask)) | (IdxMask & idx); }
74 GPUdi()
Src_t getSource()
const {
return static_cast<Idx_t>((mRef >> NBIdx) & SrcMask); }
75 GPUdi()
void setSource(
Src_t src) { mRef = (mRef & (BaseMask & ~(SrcMask << NBIdx))) | ((SrcMask &
src) << NBIdx); }
78 GPUdi()
Flg_t getFlags()
const {
return static_cast<Flg_t>((mRef >> (NBIdx + NBSrc)) & FlgMask); }
79 GPUdi()
void setFlags(
Flg_t f) { mRef = (mRef & (BaseMask & ~(FlgMask << (NBIdx + NBSrc)))) | ((FlgMask &
f) << NBIdx); }
80 GPUdi() bool testBit(
int i)
const {
return (mRef >> (NBIdx + NBSrc)) & ((0x1U <<
i) & FlgMask); }
81 GPUdi()
void setBit(
int i) { mRef = (mRef & (BaseMask & ~(0x1U << (
i + NBIdx + NBSrc)))) | (((0x1U <<
i) & FlgMask) << (NBIdx + NBSrc)); }
82 GPUdi()
void resetBit(
int i) { mRef = (mRef & (BaseMask & ~(0x1U << (
i + NBIdx + NBSrc)))); }
87 GPUdi()
Base_t getRawWOFlags()
const {
return mRef & (IdxMask | (SrcMask << NBIdx)); }
88 GPUdi() bool isIndexSet()
const {
return getIndex() != IdxMask; }
89 GPUdi() bool isSourceSet()
const {
return getSource() != SrcMask; }
91 GPUdi() bool operator==(const
AbstractRef& o)
const {
return getRawWOFlags() == o.getRawWOFlags(); }
96 Base_t mRef = IdxMask | (SrcMask << NBIdx);
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
bool operator==(const observer_ptr< W1 > &p1, const observer_ptr< W2 > &p2)