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#ifndef GPUCA_GPUCODE_DEVICE
22#include <type_traits>
23#endif
24
25
26namespace o2::dataformats
27{
28
29template <int NBIdx, int NBSrc, int NBFlg>
31{
32 template <int NBIT>
33 static constexpr auto MVAR()
34 {
35 static_assert(NBIT <= 64, "> 64 bits not supported");
36 if constexpr (NBIT > 32) {
37 uint64_t tp = 0;
38 return tp;
39 } else if constexpr (NBIT > 16) {
40 uint32_t tp = 0;
41 return tp;
42 } else if constexpr (NBIT > 8) {
43 uint16_t tp = 0;
44 return tp;
45 } else {
46 uint8_t tp = 0;
47 return tp;
48 }
49 }
50
51 public:
52 using Base_t = decltype(AbstractRef::MVAR<NBIdx + NBSrc + NBFlg>());
53 using Idx_t = decltype(AbstractRef::MVAR<NBIdx>());
54 using Src_t = decltype(AbstractRef::MVAR<NBSrc>());
55 using Flg_t = decltype(AbstractRef::MVAR<NBFlg>());
56
57 static constexpr Base_t BaseMask = Base_t((((0x1U << (NBIdx + NBSrc + NBFlg - 1)) - 1) << 1) + 1);
58 static constexpr Idx_t IdxMask = Idx_t((((0x1U << (NBIdx - 1)) - 1) << 1) + 1);
59 static constexpr Src_t SrcMask = Src_t((((0x1U << (NBSrc - 1)) - 1) << 1) + 1);
60 static constexpr Flg_t FlgMask = Flg_t((((0x1U << (NBFlg - 1)) - 1) << 1) + 1);
61 static constexpr int NBitsIndex() { return NBIdx; }
62 static constexpr int NBitsSource() { return NBSrc; }
63 static constexpr int NBitsFlags() { return NBFlg; }
64
65 GPUdDefault() AbstractRef() = default;
66
67 GPUdi() AbstractRef(Idx_t idx, Src_t src) { set(idx, src); }
68 GPUdi() AbstractRef(Base_t raw) : mRef(raw) {}
69
70 //
71 GPUdi() Idx_t getIndex() const { return static_cast<Idx_t>(mRef & IdxMask); }
72 GPUdi() void setIndex(Idx_t idx) { mRef = (mRef & (BaseMask & ~IdxMask)) | (IdxMask & idx); }
73
74 //
75 GPUdi() Src_t getSource() const { return static_cast<Idx_t>((mRef >> NBIdx) & SrcMask); }
76 GPUdi() void setSource(Src_t src) { mRef = (mRef & (BaseMask & ~(SrcMask << NBIdx))) | ((SrcMask & src) << NBIdx); }
77
78 //
79 GPUdi() Flg_t getFlags() const { return static_cast<Flg_t>((mRef >> (NBIdx + NBSrc)) & FlgMask); }
80 GPUdi() void setFlags(Flg_t f) { mRef = (mRef & (BaseMask & ~(FlgMask << (NBIdx + NBSrc)))) | ((FlgMask & f) << NBIdx); }
81 GPUdi() bool testBit(int i) const { return (mRef >> (NBIdx + NBSrc)) & ((0x1U << i) & FlgMask); }
82 GPUdi() void setBit(int i) { mRef = (mRef & (BaseMask & ~(0x1U << (i + NBIdx + NBSrc)))) | (((0x1U << i) & FlgMask) << (NBIdx + NBSrc)); }
83 GPUdi() void resetBit(int i) { mRef = (mRef & (BaseMask & ~(0x1U << (i + NBIdx + NBSrc)))); }
84 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)); }
85
86 GPUdi() Base_t getRaw() const { return mRef; }
87 GPUdi() void setRaw(Base_t v) { mRef = v; }
88 GPUdi() Base_t getRawWOFlags() const { return mRef & (IdxMask | (SrcMask << NBIdx)); }
89 GPUdi() bool isIndexSet() const { return getIndex() != IdxMask; }
90 GPUdi() bool isSourceSet() const { return getSource() != SrcMask; }
91
92 GPUdi() bool operator==(const AbstractRef& o) const { return getRawWOFlags() == o.getRawWOFlags(); }
93 GPUdi() bool operator!=(const AbstractRef& o) const { return !operator==(o); }
94 GPUdi() void clear() { setRaw((Base_t(SrcMask & ((0x1 << NBSrc) - 1)) << NBIdx) | Base_t(IdxMask & ((0x1 << NBIdx) - 1))); }
95
96 protected:
97 Base_t mRef = IdxMask | (SrcMask << NBIdx); // packed reference, dummy by default
98
100};
101
102} // namespace o2::dataformats
103
104#endif
int32_t i
bool o
GPUdi() void set(Idx_t idx
GPUdi() bool testBit(int i) const
Definition AbstractRef.h:81
GPUdi() void setFlags(Flg_t f)
Definition AbstractRef.h:80
GPUdDefault() AbstractRef()=default
static constexpr Flg_t FlgMask
Definition AbstractRef.h:60
GPUdi() Base_t getRawWOFlags() const
Definition AbstractRef.h:88
GPUdi() Idx_t getIndex() const
Definition AbstractRef.h:71
GPUdi() Flg_t getFlags() const
Definition AbstractRef.h:79
static constexpr int NBitsIndex()
Definition AbstractRef.h:61
static constexpr int NBitsSource()
Definition AbstractRef.h:62
GPUdi() void setRaw(Base_t v)
Definition AbstractRef.h:87
static constexpr Base_t BaseMask
Definition AbstractRef.h:57
GPUdi() void setIndex(Idx_t idx)
Definition AbstractRef.h:72
GPUdi() Src_t getSource() const
Definition AbstractRef.h:75
static constexpr Idx_t IdxMask
Definition AbstractRef.h:58
GPUdi() Base_t getRaw() const
Definition AbstractRef.h:86
GPUdi() void setSource(Src_t src)
Definition AbstractRef.h:76
decltype(AbstractRef::MVAR< NBFlg >()) Flg_t
Definition AbstractRef.h:55
decltype(AbstractRef::MVAR< NBSrc >()) Src_t
Definition AbstractRef.h:54
GPUdi() AbstractRef(Base_t raw)
Definition AbstractRef.h:68
GPUdi() void setBit(int i)
Definition AbstractRef.h:82
decltype(AbstractRef::MVAR< NBIdx+NBSrc+NBFlg >()) Base_t
Definition AbstractRef.h:52
GPUdi() bool isSourceSet() const
Definition AbstractRef.h:90
GPUdi() void resetBit(int i)
Definition AbstractRef.h:83
decltype(AbstractRef::MVAR< NBIdx >()) Idx_t
Definition AbstractRef.h:53
GPUdi() bool isIndexSet() const
Definition AbstractRef.h:89
static constexpr Src_t SrcMask
Definition AbstractRef.h:59
static constexpr int NBitsFlags()
Definition AbstractRef.h:63
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()