ATLAS Offline Software
Loading...
Searching...
No Matches
SysHandleArray.icc
Go to the documentation of this file.
1namespace CP {
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); })
7 {
8 }
9
10 template <typename HANDLE> template <typename OWNER>
11 SysHandleArray<HANDLE>::SysHandleArray(
12 OWNER *owner,
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); })
18 {
19 owner->declareProperty(propertyName, m_decorNames, propertyDescription);
20 }
21
22 template <typename HANDLE> template <typename... Args>
23 StatusCode SysHandleArray<HANDLE>::initialize(Args &&...args)
24 {
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());
29 if (!m_makeHandle)
30 {
31 ATH_MSG_ERROR("SysHandleArray: No handle maker function defined!");
32 return StatusCode::FAILURE;
33 }
34 for (const std::string &decor : m_decorNames)
35 {
36 // NB: This will fail if the templated class doesn't have the right
37 // constructor
38 handles.emplace_back(m_makeHandle(decor));
39 ATH_CHECK(handles.back().initialize(std::forward<Args>(args)...));
40 }
41 // If we get here then it all worked OK
42 m_handles = std::move(handles);
43 return StatusCode::SUCCESS;
44 }
45
46 template <typename HANDLE>
47 std::size_t SysHandleArray<HANDLE>::size() const noexcept { return m_decorNames.size(); }
48
49 template <typename HANDLE>
50 bool SysHandleArray<HANDLE>::empty() const noexcept { return size() == 0; }
51
52 template <typename HANDLE>
53 HANDLE &SysHandleArray<HANDLE>::at(std::size_t idx)
54 {
55 requireInitialized();
56 return m_handles.at(idx);
57 }
58
59 template <typename HANDLE>
60 const HANDLE &SysHandleArray<HANDLE>::at(std::size_t idx) const
61 {
62 requireInitialized();
63 return m_handles.at(idx);
64 }
65
66 template <typename HANDLE>
67 typename SysHandleArray<HANDLE>::iterator SysHandleArray<HANDLE>::begin()
68 {
69 requireInitialized();
70 return m_handles.begin();
71 }
72
73 template <typename HANDLE>
74 typename SysHandleArray<HANDLE>::iterator SysHandleArray<HANDLE>::end()
75 {
76 requireInitialized();
77 return m_handles.end();
78 }
79
80 template <typename HANDLE>
81 typename SysHandleArray<HANDLE>::const_iterator SysHandleArray<HANDLE>::begin() const
82 {
83 requireInitialized();
84 return m_handles.begin();
85 }
86
87 template <typename HANDLE>
88 typename SysHandleArray<HANDLE>::const_iterator SysHandleArray<HANDLE>::end() const
89 {
90 requireInitialized();
91 return m_handles.end();
92 }
93
94 template <typename HANDLE>
95 typename SysHandleArray<HANDLE>::const_iterator SysHandleArray<HANDLE>::cbegin() const
96 {
97 requireInitialized();
98 return m_handles.cbegin();
99 }
100
101 template <typename HANDLE>
102 typename SysHandleArray<HANDLE>::const_iterator SysHandleArray<HANDLE>::cend() const
103 {
104 requireInitialized();
105 return m_handles.cend();
106 }
107
108 template <typename HANDLE>
109 typename SysHandleArray<HANDLE>::reverse_iterator SysHandleArray<HANDLE>::rbegin()
110 {
111 requireInitialized();
112 return m_handles.rbegin();
113 }
114
115 template <typename HANDLE>
116 typename SysHandleArray<HANDLE>::reverse_iterator SysHandleArray<HANDLE>::rend()
117 {
118 requireInitialized();
119 return m_handles.rend();
120 }
121
122 template <typename HANDLE>
123 typename SysHandleArray<HANDLE>::const_reverse_iterator SysHandleArray<HANDLE>::rbegin() const
124 {
125 requireInitialized();
126 return m_handles.rbegin();
127 }
128
129 template <typename HANDLE>
130 typename SysHandleArray<HANDLE>::const_reverse_iterator SysHandleArray<HANDLE>::rend() const
131 {
132 requireInitialized();
133 return m_handles.rend();
134 }
135
136 template <typename HANDLE>
137 typename SysHandleArray<HANDLE>::const_reverse_iterator SysHandleArray<HANDLE>::crbegin() const
138 {
139 requireInitialized();
140 return m_handles.crbegin();
141 }
142
143 template <typename HANDLE>
144 typename SysHandleArray<HANDLE>::const_reverse_iterator SysHandleArray<HANDLE>::crend() const
145 {
146 requireInitialized();
147 return m_handles.crend();
148 }
149
150 template <typename HANDLE>
151 void SysHandleArray<HANDLE>::requireInitialized() const
152 {
153 if (m_handles.size() != m_decorNames.size())
154 throw std::logic_error("SysHandleArray not initialized!");
155 }
156
157} //> end namespace CP