File indexing completed on 2025-09-17 08:54:12
0001
0002
0003
0004
0005
0006
0007 #pragma once
0008
0009 #include <type_traits>
0010
0011 #include <covfie/core/concepts.hpp>
0012 #include <covfie/core/qualifiers.hpp>
0013
0014 namespace covfie {
0015 template <concepts::field_backend _backend>
0016 class field;
0017
0018 template <concepts::field_backend _backend_tc>
0019 class field_view
0020 {
0021 public:
0022 using backend_t = _backend_tc;
0023 using storage_t = typename backend_t::non_owning_data_t;
0024 using output_t = typename backend_t::covariant_output_t::vector_t;
0025 using coordinate_t = typename backend_t::contravariant_input_t::vector_t;
0026 using field_t = field<_backend_tc>;
0027
0028 static_assert(sizeof(storage_t) <= 256, "Storage type is too large.");
0029
0030 field_view(const field_t & field)
0031 : m_storage(field.m_backend)
0032 {
0033 }
0034
0035 const storage_t & backend(void)
0036 {
0037 return m_storage;
0038 }
0039
0040 template <typename... Args>
0041 requires((std::convertible_to<Args, typename backend_t::contravariant_input_t::scalar_t> && ...) && (sizeof...(Args) == backend_t::contravariant_input_t::dimensions) && !std::is_scalar_v<coordinate_t>)
0042 COVFIE_HOST_DEVICE output_t at(Args... c) const
0043 {
0044 return m_storage.at(coordinate_t{
0045 static_cast<typename backend_t::contravariant_input_t::scalar_t>(c
0046 )...});
0047 }
0048
0049 COVFIE_HOST_DEVICE output_t at(const coordinate_t & c) const
0050 {
0051 return m_storage.at(c);
0052 }
0053
0054 private:
0055 storage_t m_storage;
0056 };
0057 }