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 <iostream>
0010 #include <variant>
0011 
0012 #include <covfie/core/concepts.hpp>
0013 #include <covfie/core/definitions.hpp>
0014 #include <covfie/core/parameter_pack.hpp>
0015 #include <covfie/core/qualifiers.hpp>
0016 #include <covfie/core/utility/binary_io.hpp>
0017 
0018 namespace covfie::backend {
0019 template <concepts::field_backend _backend_t, typename _shuffle>
0020 struct shuffle {
0021     using this_t = shuffle<_backend_t, _shuffle>;
0022     static constexpr bool is_initial = false;
0023 
0024     using backend_t = _backend_t;
0025 
0026     using contravariant_input_t = typename backend_t::contravariant_input_t;
0027     using covariant_output_t = typename backend_t::covariant_output_t;
0028 
0029     using configuration_t = std::monostate;
0030     using indices = _shuffle;
0031 
0032     static constexpr uint32_t IO_MAGIC_HEADER = 0xAB020009;
0033 
0034     struct owning_data_t {
0035         using parent_t = this_t;
0036 
0037         owning_data_t() = default;
0038 
0039         template <typename... Args>
0040         explicit owning_data_t(configuration_t, Args... args)
0041             : m_backend(std::forward<Args>(args)...)
0042         {
0043         }
0044 
0045         explicit owning_data_t(
0046             const configuration_t &, typename backend_t::owning_data_t && b
0047         )
0048             : m_backend(std::forward<typename backend_t::owning_data_t>(b))
0049         {
0050         }
0051 
0052         template <typename... Args>
0053         explicit owning_data_t(parameter_pack<configuration_t, Args...> && args)
0054             : m_backend(std::move(args.xs))
0055         {
0056         }
0057 
0058         explicit owning_data_t(parameter_pack<owning_data_t> && conf)
0059             : owning_data_t(std::move(conf.x))
0060         {
0061         }
0062 
0063         typename backend_t::owning_data_t & get_backend(void)
0064         {
0065             return m_backend;
0066         }
0067 
0068         const typename backend_t::owning_data_t & get_backend(void) const
0069         {
0070             return m_backend;
0071         }
0072 
0073         configuration_t get_configuration(void) const
0074         {
0075             return {};
0076         }
0077 
0078         static owning_data_t read_binary(std::istream & fs)
0079         {
0080             auto be = backend_t::owning_data_t::read_binary(fs);
0081 
0082             return owning_data_t(configuration_t{}, std::move(be));
0083         }
0084 
0085         static void write_binary(std::ostream & fs, const owning_data_t & o)
0086         {
0087             backend_t::owning_data_t::write_binary(fs, o.m_backend);
0088         }
0089 
0090         typename backend_t::owning_data_t m_backend;
0091     };
0092 
0093     struct non_owning_data_t {
0094         using parent_t = this_t;
0095 
0096         non_owning_data_t(const owning_data_t & src)
0097             : m_backend(src.m_backend)
0098         {
0099         }
0100 
0101         template <std::size_t... Is>
0102         COVFIE_HOST_DEVICE typename contravariant_input_t::vector_t
0103         shuffle(typename contravariant_input_t::vector_t c, std::index_sequence<Is...>)
0104             const
0105         {
0106             return {c.at(Is)...};
0107         }
0108 
0109         COVFIE_HOST_DEVICE typename covariant_output_t::vector_t
0110         at(typename contravariant_input_t::vector_t c) const
0111         {
0112             return m_backend.at(shuffle(c, indices{}));
0113         }
0114 
0115         typename backend_t::non_owning_data_t & get_backend(void)
0116         {
0117             return m_backend;
0118         }
0119 
0120         const typename backend_t::non_owning_data_t & get_backend(void) const
0121         {
0122             return m_backend;
0123         }
0124 
0125         typename backend_t::non_owning_data_t m_backend;
0126     };
0127 };
0128 }