Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-09-17 08:54:11

0001 /*
0002  * SPDX-PackageName: "covfie, a part of the ACTS project"
0003  * SPDX-FileCopyrightText: 2022 CERN
0004  * SPDX-License-Identifier: MPL-2.0
0005  */
0006 
0007 #pragma once
0008 
0009 #include <cassert>
0010 #include <cstddef>
0011 #include <utility>
0012 
0013 #include <covfie/core/qualifiers.hpp>
0014 
0015 namespace covfie::array {
0016 template <typename _scalar_t, std::size_t _size>
0017 requires(_size > 0) struct array {
0018     using scalar_t = _scalar_t;
0019     using value_type = _scalar_t;
0020     static constexpr std::size_t dimensions = _size;
0021 
0022     array() = default;
0023 
0024     COVFIE_HOST_DEVICE array(const scalar_t (&arr)[dimensions])
0025         requires(dimensions > 1)
0026         : array(arr, std::make_index_sequence<dimensions>())
0027     {
0028     }
0029 
0030     COVFIE_HOST_DEVICE array(const scalar_t & val)
0031         : array(val, std::make_index_sequence<dimensions>())
0032     {
0033     }
0034 
0035     template <typename... Ts>
0036     requires(sizeof...(Ts) == dimensions) COVFIE_HOST_DEVICE array(Ts... args)
0037         : m_data{std::forward<Ts>(args)...}
0038     {
0039     }
0040 
0041     COVFIE_HOST_DEVICE constexpr scalar_t & at(const std::size_t & n)
0042     {
0043         assert(n < dimensions);
0044 
0045         return m_data[n];
0046     }
0047 
0048     COVFIE_HOST_DEVICE constexpr const scalar_t & at(const std::size_t & n
0049     ) const
0050     {
0051         assert(n < dimensions);
0052 
0053         return m_data[n];
0054     }
0055 
0056     COVFIE_HOST_DEVICE constexpr scalar_t & operator[](const std::size_t & n)
0057     {
0058         assert(n < dimensions);
0059 
0060         return m_data[n];
0061     }
0062 
0063     COVFIE_HOST_DEVICE constexpr const scalar_t &
0064     operator[](const std::size_t & n) const
0065     {
0066         assert(n < dimensions);
0067 
0068         return m_data[n];
0069     }
0070 
0071     COVFIE_HOST_DEVICE constexpr std::size_t size() const
0072     {
0073         return dimensions;
0074     }
0075 
0076     COVFIE_HOST_DEVICE constexpr scalar_t * begin()
0077     {
0078         return m_data + 0;
0079     }
0080 
0081     COVFIE_HOST_DEVICE constexpr const scalar_t * begin() const
0082     {
0083         return m_data + 0;
0084     }
0085 
0086     COVFIE_HOST_DEVICE constexpr const scalar_t * cbegin() const
0087     {
0088         return m_data + 0;
0089     }
0090 
0091     COVFIE_HOST_DEVICE constexpr scalar_t * end()
0092     {
0093         return m_data + dimensions;
0094     }
0095 
0096     COVFIE_HOST_DEVICE constexpr const scalar_t * end() const
0097     {
0098         return m_data + dimensions;
0099     }
0100 
0101     COVFIE_HOST_DEVICE constexpr const scalar_t * cend() const
0102     {
0103         return m_data + dimensions;
0104     }
0105 
0106 private:
0107     template <std::size_t... Is>
0108     COVFIE_HOST_DEVICE
0109     array(const scalar_t (&arr)[dimensions], std::index_sequence<Is...>)
0110         : m_data{arr[Is]...}
0111     {
0112     }
0113 
0114     template <std::size_t... Is>
0115     COVFIE_HOST_DEVICE array(const scalar_t & val, std::index_sequence<Is...>)
0116         : m_data{((void)Is, val)...}
0117     {
0118     }
0119 
0120     scalar_t m_data[dimensions];
0121 };
0122 }