ATLAS Offline Software
SysHandleArray.icc
Go to the documentation of this file.
1 namespace 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