Back to home page

EIC code displayed by LXR

 
 

    


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

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 <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 }