23 ColumnarTool<ColumnarModeArray> ::
25 :
m_data (std::make_shared<ColumnarToolDataArray> ())
28 m_data->sharedTools.push_back (
this);
36 ColumnarTool<ColumnarModeArray> ::
37 ColumnarTool (ColumnarTool<ColumnarModeArray>* val_parent)
44 ColumnarTool<ColumnarModeArray> ::
47 if (
m_data->mainTool ==
this)
48 m_data->mainTool =
nullptr;
51 if (iter !=
m_data->sharedTools.end())
52 m_data->sharedTools.erase (iter);
55 void ColumnarTool<ColumnarModeArray> ::
56 addSubtool (ColumnarTool<ColumnarModeArray>& subtool)
61 auto subtoolData = subtool.m_data;
66 if (subtoolData->mainTool != &subtool)
67 throw std::runtime_error (
"subtool already has a different parent tool");
69 for (
auto& containerName : subtoolData->containerNames)
71 auto [iter,success] =
m_data->containerNames.emplace (containerName.first, containerName.second);
72 if (!success && iter->second != containerName.second)
73 throw std::runtime_error (
"container assigned different name in subtool: " + iter->second +
" vs " + containerName.second);
76 for (
auto&
column : subtoolData->columns)
78 auto [iter,success] =
m_data->columns.try_emplace (
column.first, std::move (
column.second));
80 iter->second.mergeData (
column.first, std::move (
column.second));
83 m_data->sharedTools.insert (
m_data->sharedTools.end(), subtoolData->sharedTools.begin(), subtoolData->sharedTools.end());
84 for (
auto&
tool : subtoolData->sharedTools)
91 return StatusCode::SUCCESS;
96 void ColumnarTool<ColumnarModeArray> ::
97 callVoid (
void **
data)
const
100 callEvents (ObjectRange<ContainerId::eventContext,ColumnarModeArray> (
data, eventsOffset[0], eventsOffset[1]));
105 std::vector<ColumnInfo> ColumnarTool<ColumnarModeArray> ::
106 getColumnInfo ()
const
108 std::vector<std::string>
names;
117 std::vector<ColumnInfo>
result;
130 void ColumnarTool<ColumnarModeArray> ::
131 renameColumn (
const std::string& from,
const std::string&
to)
140 auto from_iter =
m_data->columns.find (from);
141 if (from_iter ==
m_data->columns.end())
142 throw std::runtime_error (
"column to rename from not found: " + from);
143 auto to_iter =
m_data->columns.find (
to);
144 if (to_iter !=
m_data->columns.end())
146 to_iter->second.mergeData (
to, std::move (from_iter->second));
147 m_data->columns.erase (from_iter);
150 auto node =
m_data->columns.extract (from_iter);
155 column.second.updateColumnRef (from,
to);
160 void ColumnarTool<ColumnarModeArray> ::
161 setColumnIndex (
const std::string&
name, std::size_t
index)
170 void ColumnarTool<ColumnarModeArray> ::
171 callEvents (ObjectRange<ContainerId::eventContext,ColumnarModeArray> )
const
173 throw std::runtime_error (
"tool didn't implement callEvents");
178 const std::string& ColumnarTool<ColumnarModeArray> ::
182 if (iter ==
m_data->containerNames.end())
183 throw std::runtime_error (
"object type not registered, make sure to register object handle first: " +
std::to_string (
unsigned(
objectType)));
189 void ColumnarTool<ColumnarModeArray> ::
192 auto [iter, success] =
m_data->containerNames.emplace (container,
name);
193 if (!success && iter->second !=
name)
194 throw std::runtime_error (
"container already registered with different name: " +
name +
" vs " + iter->second);
199 void ColumnarTool<ColumnarModeArray> ::
200 addColumn (
const std::string&
name, ColumnAccessorDataArray *accessorData, ColumnInfo&&
info)
202 info.type = accessorData->type;
203 info.accessMode = accessorData->accessMode;
212 : m_info (std::move (
other.m_info))
213 , m_accessors (std::move (
other.m_accessors))
215 for (
auto *
ptr : m_accessors)
225 ~ColumnDataArray () noexcept
227 for (
auto *
ptr : m_accessors)
229 if (
ptr->dataRef ==
this)
230 ptr->dataRef =
nullptr;
236 bool ColumnDataArray ::
237 empty ()
const noexcept
239 return m_accessors.empty();
252 void ColumnDataArray ::
255 if (m_accessors.empty())
265 if (val_info.
type != m_info.type)
266 throw std::runtime_error (
"multiple types for column: " +
name);
272 m_info.isOptional =
false;
274 throw std::runtime_error (
"inconsistent offset map for column: " +
name);
277 if (val_accessorData)
279 m_accessors.push_back (val_accessorData);
280 val_accessorData->
dataRef =
this;
286 void ColumnDataArray ::
289 auto iter =
std::find (m_accessors.begin(), m_accessors.end(), &val_accessorData);
290 if (iter == m_accessors.end())
292 m_accessors.erase (iter);
293 val_accessorData.
dataRef =
nullptr;
298 void ColumnDataArray ::
301 addAccessor (
name,
other.m_info,
nullptr);
302 m_accessors.insert (m_accessors.end(),
other.m_accessors.begin(),
other.m_accessors.end());
305 other.m_accessors.clear();
310 void ColumnDataArray ::
311 updateColumnRef (
const std::string& from,
const std::string&
to)
327 void ColumnDataArray ::
328 setIndex (
unsigned index) noexcept
330 m_info.index =
index;
331 for (
auto *
ptr : m_accessors)