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