6#include "GeoModelKernel/throwExcept.h"
10 std::mutex s_ticketMutex{};
19 case Block:
return "Block";
25 const auto s =
size();
27 <<
", size: "<<s<<
", (un)allocated: ("<<(s- f)<<
")"<<f;
42 return std::make_pair(std::move(trfStore), std::move(isSet));
53 m_detType{other.detectorType()} {
54 if (mode() == Mode::Block){
55 for (std::size_t t = 0; t <
size(); ++t) {
56 if (
const Amg::Transform3D* copyMe = other.getTransform(t); copyMe !=
nullptr) {
68 for (std::size_t t = 0; t <
size(); ++t) {
81 using Store_t = std::decay_t<
decltype(store)>;
82 if constexpr(std::is_same_v<Store_t, LazyStorage_t>){
83 return (*store.at(ticketNo).set(std::make_unique<Amg::Transform3D>(std::move(trf))));
84 }
else if constexpr( std::is_same_v<Store_t, BlockStorage_t>) {
85 THROW_EXCEPTION(
"The transform store "<<(*
this)<<
" has been initialized with"
86 <<
" block storage caching. Cannot assign "<<ticketNo<<
".");
95 return std::visit([](
const auto& store){
96 using Store_t = std::decay_t<
decltype(store)>;
97 if constexpr(std::is_same_v<Store_t, LazyStorage_t>) {
100 return store.first.size();
107 using Store_t = std::decay_t<
decltype(store)>;
108 if constexpr(std::is_same_v<Store_t, LazyStorage_t>) {
109 return (*store.at(ticketNo).set(std::make_unique<Amg::Transform3D>(std::move(trf))));
110 }
else if constexpr(std::is_same_v<Store_t, BlockStorage_t>) {
111 store.second.at(ticketNo) =
true;
112 return (store.first.at(ticketNo) = std::move(trf));
121 return std::visit([&](
const auto& store) {
122 using Store_t = std::decay_t<
decltype(store)>;
123 if constexpr(std::is_same_v<Store_t, LazyStorage_t>) {
125 }
else if constexpr(std::is_same_v<Store_t, BlockStorage_t>) {
132 return std::visit([](
const auto& store) {
133 using Store_t = std::decay_t<
decltype(store)>;
134 if constexpr(std::is_same_v<Store_t, LazyStorage_t>) {
135 return std::count_if(store.begin(), store.end(), [](
const auto& trf){
136 return trf.get() != nullptr;
138 }
else if constexpr(std::is_same_v<Store_t, BlockStorage_t>) {
139 return std::count_if(store.second.begin(), store.second.end(), [](
const char filled){
156 std::unique_lock guard{s_ticketMutex};
157 const unsigned idx =
static_cast<unsigned>(
type);
158 std::vector<char>& returnedPool = s_returnedTickets[idx];
159 int& returnedHint = s_returnedHints[idx];
160 if (returnedPool.size() && returnedHint >= 0) {
161 for (
size_t i = returnedHint; i < returnedPool.size(); ++i) {
162 if (returnedPool[i]) {
163 returnedPool[i] =
false;
166 if (
static_cast<size_t>(returnedHint) >= returnedPool.size()) {
173 for (
size_t i = 0; i < static_cast<size_t>(returnedHint); ++i) {
174 if (returnedPool[i]) {
175 returnedPool[i] =
false;
184 return s_clientCounter[idx]++;
187 std::unique_lock guard{s_ticketMutex};
188 return s_clientCounter[
static_cast<unsigned>(
type)];
192 std::unique_lock guard{s_ticketMutex};
193 const unsigned idx =
static_cast<unsigned>(
type);
194 std::vector<char>& returnedPool = s_returnedTickets[idx];
195 int& returnedHint = s_returnedHints[idx];
197 const unsigned distributed = s_clientCounter[idx];
198 if (ticketNo == distributed -1) {
200 if (ticketNo > 0 && ticketNo-1 < returnedPool.size()) {
201 for (; ticketNo > 0 && returnedPool[ticketNo-1]; --ticketNo){}
202 returnedPool.resize (ticketNo);
205 s_clientCounter[idx] = ticketNo;
206 if (returnedHint >=
static_cast<int>(ticketNo)) {
210 if (returnedPool.size() <= ticketNo) {
211 returnedPool.resize (ticketNo+1);
213 returnedPool[ticketNo] =
true;
214 if (returnedHint < 0 ||
static_cast<int>(ticketNo) < returnedHint) {
215 returnedHint = ticketNo;
size_t size() const
Number of registered mappings.
static unsigned int distributedTickets(const DetectorType detType)
Returns the number of all distributed tickets.
std::array< int, s_techs > ReturnedHintArr
static unsigned int drawTicket(const DetectorType detType)
Returns a unique ID to the client under which the client can store its transfomrm inside the containe...
std::array< std::atomic< unsigned >, s_techs > TicketCounterArr
static void giveBackTicket(const DetectorType detType, unsigned int ticketNo)
Return back a ticket for the specified detector type such that its slot can be used by another instan...
std::array< std::vector< char >, s_techs > ReturnedTicketArr
Athena definition of the Eigen plugin.
TrfStoreTicketCounter::TicketCounterArr TicketCounterArr
TrfStoreTicketCounter::ReturnedHintArr ReturnedHintArr
TrfStoreTicketCounter::ReturnedTicketArr ReturnedTicketArr
DetectorType
Simple enum to Identify the Type of the ACTS sub detector.
Eigen::Affine3d Transform3D
#define THROW_EXCEPTION(MESSAGE)