File indexing completed on 2025-09-17 08:54:11
0001
0002
0003
0004
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 }