2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
5 template <typename HANDLE> template <typename OWNER>
6 SysHandleArray<HANDLE>::SysHandleArray(
7 const std::vector<std::string> &values, OWNER *owner)
8 : asg::AsgMessagingForward(owner), m_decorNames(values),
9 m_makeHandle([owner](const std::string &name) { return HANDLE(name, owner); })
13 template <typename HANDLE> template <typename OWNER>
14 SysHandleArray<HANDLE>::SysHandleArray(
16 const std::string &propertyName,
17 const std::vector<std::string> &propertyValue,
18 const std::string &propertyDescription)
19 : asg::AsgMessagingForward(owner), m_decorNames(propertyValue),
20 m_makeHandle([owner](const std::string &name) { return HANDLE(name, owner); })
22 owner->declareProperty(propertyName, m_decorNames, propertyDescription);
25 template <typename HANDLE> template <typename... Args>
26 StatusCode SysHandleArray<HANDLE>::initialize(Args &&...args)
28 // Build the list of handles separate to the data member so that it isn't
29 // partially initialized if there's a failure
30 std::vector<HANDLE> handles;
31 handles.reserve(m_decorNames.size());
34 ATH_MSG_ERROR("SysHandleArray: No handle maker function defined!");
35 return StatusCode::FAILURE;
37 for (const std::string &decor : m_decorNames)
39 // NB: This will fail if the templated class doesn't have the right
41 handles.emplace_back(m_makeHandle(decor));
42 ATH_CHECK(handles.back().initialize(args...));
44 // If we get here then it all worked OK
45 m_handles = std::move(handles);
46 return StatusCode::SUCCESS;
49 template <typename HANDLE>
50 std::size_t SysHandleArray<HANDLE>::size() const noexcept { return m_decorNames.size(); }
52 template <typename HANDLE>
53 bool SysHandleArray<HANDLE>::empty() const noexcept { return size() == 0; }
55 template <typename HANDLE>
56 HANDLE &SysHandleArray<HANDLE>::at(std::size_t idx)
59 return m_handles.at(idx);
62 template <typename HANDLE>
63 const HANDLE &SysHandleArray<HANDLE>::at(std::size_t idx) const
66 return m_handles.at(idx);
69 template <typename HANDLE>
70 typename SysHandleArray<HANDLE>::iterator SysHandleArray<HANDLE>::begin()
73 return m_handles.begin();
76 template <typename HANDLE>
77 typename SysHandleArray<HANDLE>::iterator SysHandleArray<HANDLE>::end()
80 return m_handles.end();
83 template <typename HANDLE>
84 typename SysHandleArray<HANDLE>::const_iterator SysHandleArray<HANDLE>::begin() const
87 return m_handles.begin();
90 template <typename HANDLE>
91 typename SysHandleArray<HANDLE>::const_iterator SysHandleArray<HANDLE>::end() const
94 return m_handles.end();
97 template <typename HANDLE>
98 typename SysHandleArray<HANDLE>::const_iterator SysHandleArray<HANDLE>::cbegin() const
100 requireInitialized();
101 return m_handles.cbegin();
104 template <typename HANDLE>
105 typename SysHandleArray<HANDLE>::const_iterator SysHandleArray<HANDLE>::cend() const
107 requireInitialized();
108 return m_handles.cend();
111 template <typename HANDLE>
112 typename SysHandleArray<HANDLE>::reverse_iterator SysHandleArray<HANDLE>::rbegin()
114 requireInitialized();
115 return m_handles.rbegin();
118 template <typename HANDLE>
119 typename SysHandleArray<HANDLE>::reverse_iterator SysHandleArray<HANDLE>::rend()
121 requireInitialized();
122 return m_handles.rend();
125 template <typename HANDLE>
126 typename SysHandleArray<HANDLE>::const_reverse_iterator SysHandleArray<HANDLE>::rbegin() const
128 requireInitialized();
129 return m_handles.rbegin();
132 template <typename HANDLE>
133 typename SysHandleArray<HANDLE>::const_reverse_iterator SysHandleArray<HANDLE>::rend() const
135 requireInitialized();
136 return m_handles.rend();
139 template <typename HANDLE>
140 typename SysHandleArray<HANDLE>::const_reverse_iterator SysHandleArray<HANDLE>::crbegin() const
142 requireInitialized();
143 return m_handles.crbegin();
146 template <typename HANDLE>
147 typename SysHandleArray<HANDLE>::const_reverse_iterator SysHandleArray<HANDLE>::crend() const
149 requireInitialized();
150 return m_handles.crend();
153 template <typename HANDLE>
154 void SysHandleArray<HANDLE>::requireInitialized() const
156 if (m_handles.size() != m_decorNames.size())
157 throw std::logic_error("SysHandleArray not initialized!");
160} //> end namespace CP