2 template <typename HANDLE> template <typename OWNER>
3 SysHandleArray<HANDLE>::SysHandleArray(
4 const std::vector<std::string> &values, OWNER *owner)
5 : asg::AsgMessagingForward(owner), m_decorNames(values),
6 m_makeHandle([owner](const std::string &name) { return HANDLE(name, owner); })
10 template <typename HANDLE> template <typename OWNER>
11 SysHandleArray<HANDLE>::SysHandleArray(
13 const std::string &propertyName,
14 const std::vector<std::string> &propertyValue,
15 const std::string &propertyDescription)
16 : asg::AsgMessagingForward(owner), m_decorNames(propertyValue),
17 m_makeHandle([owner](const std::string &name) { return HANDLE(name, owner); })
19 owner->declareProperty(propertyName, m_decorNames, propertyDescription);
22 template <typename HANDLE> template <typename... Args>
23 StatusCode SysHandleArray<HANDLE>::initialize(Args &&...args)
25 // Build the list of handles separate to the data member so that it isn't
26 // partially initialized if there's a failure
27 std::vector<HANDLE> handles;
28 handles.reserve(m_decorNames.size());
31 ATH_MSG_ERROR("SysHandleArray: No handle maker function defined!");
32 return StatusCode::FAILURE;
34 for (const std::string &decor : m_decorNames)
36 // NB: This will fail if the templated class doesn't have the right
38 handles.emplace_back(m_makeHandle(decor));
39 ATH_CHECK(handles.back().initialize(std::forward<Args>(args)...));
41 // If we get here then it all worked OK
42 m_handles = std::move(handles);
43 return StatusCode::SUCCESS;
46 template <typename HANDLE>
47 std::size_t SysHandleArray<HANDLE>::size() const noexcept { return m_decorNames.size(); }
49 template <typename HANDLE>
50 bool SysHandleArray<HANDLE>::empty() const noexcept { return size() == 0; }
52 template <typename HANDLE>
53 HANDLE &SysHandleArray<HANDLE>::at(std::size_t idx)
56 return m_handles.at(idx);
59 template <typename HANDLE>
60 const HANDLE &SysHandleArray<HANDLE>::at(std::size_t idx) const
63 return m_handles.at(idx);
66 template <typename HANDLE>
67 typename SysHandleArray<HANDLE>::iterator SysHandleArray<HANDLE>::begin()
70 return m_handles.begin();
73 template <typename HANDLE>
74 typename SysHandleArray<HANDLE>::iterator SysHandleArray<HANDLE>::end()
77 return m_handles.end();
80 template <typename HANDLE>
81 typename SysHandleArray<HANDLE>::const_iterator SysHandleArray<HANDLE>::begin() const
84 return m_handles.begin();
87 template <typename HANDLE>
88 typename SysHandleArray<HANDLE>::const_iterator SysHandleArray<HANDLE>::end() const
91 return m_handles.end();
94 template <typename HANDLE>
95 typename SysHandleArray<HANDLE>::const_iterator SysHandleArray<HANDLE>::cbegin() const
98 return m_handles.cbegin();
101 template <typename HANDLE>
102 typename SysHandleArray<HANDLE>::const_iterator SysHandleArray<HANDLE>::cend() const
104 requireInitialized();
105 return m_handles.cend();
108 template <typename HANDLE>
109 typename SysHandleArray<HANDLE>::reverse_iterator SysHandleArray<HANDLE>::rbegin()
111 requireInitialized();
112 return m_handles.rbegin();
115 template <typename HANDLE>
116 typename SysHandleArray<HANDLE>::reverse_iterator SysHandleArray<HANDLE>::rend()
118 requireInitialized();
119 return m_handles.rend();
122 template <typename HANDLE>
123 typename SysHandleArray<HANDLE>::const_reverse_iterator SysHandleArray<HANDLE>::rbegin() const
125 requireInitialized();
126 return m_handles.rbegin();
129 template <typename HANDLE>
130 typename SysHandleArray<HANDLE>::const_reverse_iterator SysHandleArray<HANDLE>::rend() const
132 requireInitialized();
133 return m_handles.rend();
136 template <typename HANDLE>
137 typename SysHandleArray<HANDLE>::const_reverse_iterator SysHandleArray<HANDLE>::crbegin() const
139 requireInitialized();
140 return m_handles.crbegin();
143 template <typename HANDLE>
144 typename SysHandleArray<HANDLE>::const_reverse_iterator SysHandleArray<HANDLE>::crend() const
146 requireInitialized();
147 return m_handles.crend();
150 template <typename HANDLE>
151 void SysHandleArray<HANDLE>::requireInitialized() const
153 if (m_handles.size() != m_decorNames.size())
154 throw std::logic_error("SysHandleArray not initialized!");
157 } //> end namespace CP