Project
Loading...
Searching...
No Matches
LayerMask.h
Go to the documentation of this file.
1// Copyright 2019-2026 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
12#ifndef TRACKINGITSU_INCLUDE_LAYERMASK_H_
13#define TRACKINGITSU_INCLUDE_LAYERMASK_H_
14
15#include <cstdint>
16#include <type_traits>
17
18#ifndef GPUCA_GPUCODE
19#include <fmt/format.h>
20#include <string>
21#endif
22
23#include "GPUCommonDef.h"
24#include "GPUCommonMath.h"
26
27namespace o2::its
28{
29
30struct LayerMask {
31 GPUhdDefault() constexpr LayerMask() noexcept = default;
32 GPUhdDefault() constexpr LayerMask(uint16_t mask) noexcept : mBits{mask} {}
33 GPUhdDefault() constexpr LayerMask(int layer0, int layer1, int layer2) noexcept
34 : mBits{static_cast<uint16_t>((uint16_t(1) << layer0) | (uint16_t(1) << layer1) | (uint16_t(1) << layer2))}
35 {
36 }
37 GPUhdi() constexpr operator uint16_t() const noexcept { return mBits; }
38 GPUhdi() constexpr uint16_t value() const noexcept { return mBits; }
39 GPUhdi() constexpr void set(int layer) noexcept { mBits |= (uint16_t(1) << layer); }
40
41 GPUhdi() LayerMask operator~() const noexcept { return LayerMask{static_cast<uint16_t>(~mBits)}; }
42 GPUhdi() LayerMask operator&(LayerMask other) const noexcept { return LayerMask{static_cast<uint16_t>(mBits & other.mBits)}; }
43 GPUhdi() LayerMask operator|(LayerMask other) const noexcept { return LayerMask{static_cast<uint16_t>(mBits | other.mBits)}; }
45 {
46 mBits &= other.mBits;
47 return *this;
48 }
50 {
51 mBits |= other.mBits;
52 return *this;
53 }
54
55 GPUhdi() bool empty() const noexcept { return mBits == 0; }
56 GPUhdi() bool has(int layer) const noexcept { return mBits & (uint16_t(1) << layer); }
57 GPUhdi() bool isSubsetOf(LayerMask allowed) const noexcept { return (*this & ~allowed).empty(); }
58 GPUhdi() bool isAllowedHoleMask(int maxHoles, LayerMask allowedHoleMask) const noexcept
59 {
60 const int allowedHoles = maxHoles > 0 ? maxHoles : 0;
61 return count() <= allowedHoles && isSubsetOf(allowedHoleMask);
62 }
63 GPUhdi() bool isAllowed(int maxHoles, LayerMask allowedHoleMask) const noexcept
64 {
65 return holeMask().isAllowedHoleMask(maxHoles, allowedHoleMask);
66 }
67 GPUhdi() int length() const noexcept { return empty() ? 0 : last() - first() + 1; }
68 GPUhdi() int count() const noexcept { return static_cast<int>(o2::gpu::GPUCommonMath::Popcount(mBits)); }
69 GPUhdi() int first() const noexcept { return mBits ? static_cast<int>(o2::gpu::GPUCommonMath::Ctz(mBits)) : constants::UnusedIndex; }
70 GPUhdi() int last() const noexcept { return mBits ? 31 - static_cast<int>(o2::gpu::GPUCommonMath::Clz(mBits)) : constants::UnusedIndex; }
71 GPUhdi() LayerMask holeMask() const noexcept
72 {
73 return empty() ? LayerMask{0} : (span(first(), last()) & ~(*this));
74 }
75
76 GPUhdi() int slot(int layer) const noexcept
77 {
78 if (!has(layer)) {
80 }
81 const uint32_t lowerLayers = (uint32_t(1) << layer) - 1;
82 return static_cast<int>(o2::gpu::GPUCommonMath::Popcount(static_cast<uint32_t>(mBits) & lowerLayers));
83 }
84
85 static GPUhdi() LayerMask span(int fromLayer, int toLayer) noexcept
86 {
87 if (fromLayer > toLayer) {
88 return 0;
89 }
90 const uint32_t upper = (uint32_t(1) << (toLayer + 1)) - 1;
91 const uint32_t lower = (uint32_t(1) << fromLayer) - 1;
92 return static_cast<uint16_t>(upper & ~lower);
93 }
94
95 static GPUhdi() LayerMask skipped(int fromLayer, int toLayer) noexcept
96 {
97 return (toLayer - fromLayer <= 1) ? LayerMask{0} : span(fromLayer + 1, toLayer - 1);
98 }
99
100#ifndef GPUCA_GPUCODE
101 std::string asString() const { return fmt::format("{:016b}", mBits); }
102#endif
103
104 private:
105 uint16_t mBits{0};
106};
107
108static_assert(std::is_standard_layout_v<LayerMask>);
109static_assert(std::is_trivially_copyable_v<LayerMask>);
110static_assert(sizeof(LayerMask) == sizeof(uint16_t));
111static_assert(alignof(LayerMask) == alignof(uint16_t));
112
113} // namespace o2::its
114
115#endif
std::string asString(TDataMember const &dm, char *pointer)
GLint GLsizei count
Definition glcorearb.h:399
GLint first
Definition glcorearb.h:399
GLsizei const GLfloat * value
Definition glcorearb.h:819
GLuint GLsizei GLsizei * length
Definition glcorearb.h:790
GLenum GLuint GLint GLint layer
Definition glcorearb.h:1310
GLint GLuint mask
Definition glcorearb.h:291
constexpr int UnusedIndex
Definition Constants.h:32
void empty(int)
GPUhdi() const expr void set(int layer) noexcept
Definition LayerMask.h:39
GPUhdi() const expr uint16_t value() const noexcept
Definition LayerMask.h:38
GPUhdi() LayerMask &operator&
GPUhdi() LayerMask operator~() const noexcept
Definition LayerMask.h:41
GPUhdDefault() const expr LayerMask() noexcept=default
GPUhdi() LayerMask operator&(LayerMask other) const noexcept
Definition LayerMask.h:42
GPUhdDefault() const expr LayerMask(int layer0
GPUhdi() LayerMask operator|(LayerMask other) const noexcept
Definition LayerMask.h:43
int int layer2 noexcept
Definition LayerMask.h:37
VectorOfTObjectPtrs other