2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
5 /// @author Nils Krumnack
8 #include <ColumnarCore/ColumnAccessorDataArray.h>
12 // the external mode specialization for native types
13 template<ContainerId CI,typename CT,ColumnAccessMode CAM>
14 requires (ColumnTypeTraits<CT,ColumnarModeArray>::isNativeType)
15 class AccessorTemplate<CI,CT,CAM,ColumnarModeArray> final
17 /// Common Public Members
18 /// =====================
21 static_assert (ContainerIdTraits<CI>::isDefined, "ContainerId not defined, include the appropriate header");
22 static_assert (!std::is_const_v<CT>, "CT must not be const");
24 using CM = ColumnarModeArray;
25 using ColumnType = typename ColumnAccessModeTraits<CAM>::template ColumnType<typename ColumnTypeTraits<CT,ColumnarModeArray>::ColumnType>;
27 AccessorTemplate () noexcept = default;
29 AccessorTemplate (ColumnarTool<CM>& columnBase,
30 const std::string& name, ColumnInfo&& info = {})
32 ColumnTypeTraits<CT,ColumnarModeArray>::updateColumnInfo (columnBase, info);
33 info.offsetName = columnBase.objectName (CI);
34 m_accessorData = std::make_unique<ColumnAccessorDataArray> (&m_dataIndex, &m_accessorData, &typeid (typename ColumnTypeTraits<CT,CM>::ColumnType), CAM);
35 columnBase.addColumn (columnBase.objectName(CI) + "." + name, m_accessorData.get(), std::move (info));
38 AccessorTemplate (AccessorTemplate&& that)
40 moveAccessor (m_dataIndex, m_accessorData, that.m_dataIndex, that.m_accessorData);
43 AccessorTemplate& operator = (AccessorTemplate&& that)
46 moveAccessor (m_dataIndex, m_accessorData, that.m_dataIndex, that.m_accessorData);
50 AccessorTemplate (const AccessorTemplate&) = delete;
51 AccessorTemplate& operator = (const AccessorTemplate&) = delete;
53 void reset (ColumnarTool<CM>& columnBase, const std::string& name, ColumnInfo&& info = {})
55 *this = AccessorTemplate (columnBase, name, std::move (info));
58 [[nodiscard]] ColumnType& operator () (ObjectId<CI,CM> id) const noexcept
60 auto *data = static_cast<ColumnType*>(id.getData()[m_dataIndex]);
61 return data[id.getIndex()];
64 [[nodiscard]] std::span<ColumnType> operator () (ObjectRange<CI,CM> range) const noexcept
66 auto *data = static_cast<ColumnType*>(range.getData()[m_dataIndex]);
67 return std::span<ColumnType> (data+range.beginIndex(), range.endIndex()-range.beginIndex());
70 [[nodiscard]] bool isAvailable (ObjectId<CI,CM> id) const noexcept
72 auto *data = static_cast<ColumnType*>(id.getData()[m_dataIndex]);
73 return data != nullptr;
76 [[nodiscard]] bool isAvailable (ObjectRange<CI,CM> range) const noexcept
78 auto *data = static_cast<ColumnType*>(range.getData()[m_dataIndex]);
79 return data != nullptr;
82 [[nodiscard]] std::optional<ColumnType> getOptional (ObjectId<CI,CM> id) const
84 auto *data = static_cast<ColumnType*>(id.getData()[m_dataIndex]);
86 return data[id.getIndex()];
95 unsigned m_dataIndex = 0u;
96 std::unique_ptr<ColumnAccessorDataArray> m_accessorData;