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<ContainerIdConcept CI,typename CT,ColumnAccessMode CAM>
 
   14     requires (CI::regularColumnAccessorArray && ColumnTypeTraits<CT,ColumnarModeArray>::isNativeType)
 
   15   class AccessorTemplate<CI,CT,CAM,ColumnarModeArray> final
 
   17     /// Common Public Members
 
   18     /// =====================
 
   21     static_assert (!std::is_const_v<CT>, "CT must not be const");
 
   23     using CM = ColumnarModeArray;
 
   24     using ColumnType = typename ColumnAccessModeTraits<CAM>::template ColumnType<typename ColumnTypeTraits<CT,ColumnarModeArray>::ColumnType>;
 
   26     AccessorTemplate () noexcept = default;
 
   28     AccessorTemplate (ColumnarTool<CM>& columnBase,
 
   29                   const std::string& name, ColumnInfo&& info = {})
 
   31       ColumnTypeTraits<CT,ColumnarModeArray>::updateColumnInfo (columnBase, info);
 
   32       info.offsetName = CI::idName;
 
   33       m_accessorData = std::make_unique<ColumnAccessorDataArray> (&m_dataIndex, &m_accessorData, &typeid (typename ColumnTypeTraits<CT,CM>::ColumnType), CAM);
 
   34       columnBase.addColumn (std::string(CI::idName) + "." + name, m_accessorData.get(), std::move (info));
 
   37     AccessorTemplate (AccessorTemplate&& that)
 
   39       moveAccessor (m_dataIndex, m_accessorData, that.m_dataIndex, that.m_accessorData);
 
   42     AccessorTemplate& operator = (AccessorTemplate&& that)
 
   45         moveAccessor (m_dataIndex, m_accessorData, that.m_dataIndex, that.m_accessorData);
 
   49     AccessorTemplate (const AccessorTemplate&) = delete;
 
   50     AccessorTemplate& operator = (const AccessorTemplate&) = delete;
 
   52     void reset (ColumnarTool<CM>& columnBase, const std::string& name, ColumnInfo&& info = {})
 
   54       *this = AccessorTemplate (columnBase, name, std::move (info));
 
   57     [[nodiscard]] ColumnType& operator () (ObjectId<CI,CM> id) const noexcept
 
   59       auto *data = static_cast<ColumnType*>(id.getData()[m_dataIndex]);
 
   60       return data[id.getIndex()];
 
   63     [[nodiscard]] std::span<ColumnType> operator () (ObjectRange<CI,CM> range) const noexcept
 
   65       auto *data = static_cast<ColumnType*>(range.getData()[m_dataIndex]);
 
   66       return std::span<ColumnType> (data+range.beginIndex(), range.endIndex()-range.beginIndex());
 
   69     [[nodiscard]] bool isAvailable (ObjectId<CI,CM> id) const noexcept
 
   71       auto *data = static_cast<ColumnType*>(id.getData()[m_dataIndex]);
 
   72       return data != nullptr;
 
   75     [[nodiscard]] bool isAvailable (const ObjectRange<CI,CM>& range) const noexcept
 
   77       auto *data = static_cast<ColumnType*>(range.getData()[m_dataIndex]);
 
   78       return data != nullptr;
 
   81     [[nodiscard]] std::optional<ColumnType> getOptional (ObjectId<CI,CM> id) const
 
   83       auto *data = static_cast<ColumnType*>(id.getData()[m_dataIndex]);
 
   85         return data[id.getIndex()];
 
   94     unsigned m_dataIndex = 0u;
 
   95     std::unique_ptr<ColumnAccessorDataArray> m_accessorData;