ATLAS Offline Software
Loading...
Searching...
No Matches
TransformMap.icc
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5#ifndef GEOMODELUTILITIES_TRANSFORMMAP_ICC
6#define GEOMODELUTILITIES_TRANSFORMMAP_ICC
7
8#include "GeoModelKernel/throwExcept.h"
9#include "CxxUtils/inline_hints.h"
10
11template <typename T , typename X> bool TransformMap<T, X>::isLocked() const { return m_locked; }
12template <typename T, typename X> bool TransformMap<T, X>::setTransform(const T* obj, std::shared_ptr<const X> xf) const {
13 if (m_locked) {
14 THROW_EXCEPTION("The transform map is already locked ");
15 }
16 std::unique_lock guard{m_mutex};
17 typename ConCurrentMap_t::iterator itr = m_mutableCont->find(obj);
18 if (itr !=m_mutableCont->end()) {
19 itr->second = std::move(xf);
20 return false;
21 }
22 return m_mutableCont->emplace(obj, xf).second;
23}
24template <typename T, typename X>
25bool TransformMap<T, X>::setTransform(const T* obj, std::shared_ptr<const X> xf) {
26 std::unique_lock guardThis{m_mutex};
27 if (m_locked) {
28 std::shared_ptr<const X>& newObj = m_container[obj];
29 bool good = !newObj;
30 newObj = std::move(xf);
31 return good;
32 }
33 typename ConCurrentMap_t::iterator itr = m_mutableCont->find(obj);
34 if (itr !=m_mutableCont->end()) {
35 itr->second = std::move(xf);
36 return false;
37 }
38 return m_mutableCont->emplace(obj, xf).second;
39}
40
41template <typename T, typename X> bool TransformMap<T, X>::setTransform(const T *obj, const X &xf) const {
42 return setTransform(obj, std::make_shared<const X>(xf));
43}
44template <typename T, typename X> bool TransformMap<T, X>::setTransform(const T *obj, const X &xf) {
45 return setTransform(obj, std::make_shared<const X>(xf));
46}
47
48
49template <typename T, typename X>
50ATH_FLATTEN
51const X *TransformMap<T, X>::getTransform(const T *obj) const {
52 if (m_locked) {
53 auto itr = m_container.find(obj);
54 return itr != m_container.end() ? itr->second.get() : nullptr;
55 }
56 auto itr = m_mutableCont->find(obj);
57 return itr != m_mutableCont->end() ? itr->second.get() : nullptr;
58}
59
60template <typename T, typename X> bool TransformMap<T, X>::append(const TransformMap &other) {
61 if (&other == this) {
62 return true;
63 }
64 bool allGood{true};
65 std::shared_lock guardOther{other.m_mutex};
66 std::unique_lock guardThis{m_mutex};
67 if (other.m_mutableCont) {
68 for (const auto&[key, value]: *other.m_mutableCont){
69 allGood &= setTransform(key, value);
70 }
71 } else {
72 for (const auto &[key, value] : other.m_container) {
73 allGood &= setTransform(key, value);
74 }
75 }
76 return allGood;
77}
78
79template <typename T, typename X> void TransformMap<T, X>::clear() {
80 std::unique_lock guardThis{m_mutex};
81 m_container.clear();
82 m_mutableCont = std::make_unique<ConCurrentMap_t>(typename ConCurrentMap_t::Updater_t());
83 m_locked = false;
84}
85
86template <typename T, typename X> void TransformMap<T, X>::lock() {
87 std::unique_lock guardThis{m_mutex};
88 if (m_locked) {
89 return;
90 }
91 for (auto& [key, value] : *m_mutableCont) {
92 m_container.insert(std::make_pair(key, value));
93 }
94 m_locked = true;
95 m_mutableCont.reset();
96}
97template <typename T, typename X>
98std::vector<const T*> TransformMap<T, X>::getStoredKeys() const {
99 std::vector<const T*> keys{};
100 if (m_mutableCont) {
101 keys.reserve(m_mutableCont->size());
102 for (const auto& key_value: *m_mutableCont) {
103 keys.push_back(key_value.first);
104 }
105 } else {
106 keys.reserve(m_container.size());
107 for (const auto& key_value: m_container) {
108 keys.push_back(key_value.first);
109 }
110 }
111 return keys;
112}
113#endif