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