Shamrock 2025.10.0
Astrophysical Code
Loading...
Searching...
No Matches
SerializeHelperMember.hpp
Go to the documentation of this file.
1// -------------------------------------------------------//
2//
3// SHAMROCK code for hydrodynamics
4// Copyright (c) 2021-2026 Timothée David--Cléris <tim.shamrock@proton.me>
5// SPDX-License-Identifier: CeCILL Free Software License Agreement v2.1
6// Shamrock is licensed under the CeCILL 2.1 License, see LICENSE for more information
7//
8// -------------------------------------------------------//
9
10#pragma once
11
19#include "shambase/memory.hpp"
20#include "shambackends/sycl.hpp"
22#include <type_traits>
23#include <memory>
24
25namespace shamalgs::details {
26
27 template<class T>
29 public:
30 static constexpr u64 szrepr = sizeof(T);
31 inline static void store(u8 *ptr_store, T val) {
32 T *ptr = (T *) ptr_store;
33 *ptr = val;
34 }
35 inline static T load(const u8 *ptr_load) {
36 T *ptr = (T *) ptr_load;
37 return *ptr;
38 }
39 };
40
41 template<class T>
42 class SerializeHelperMember<sycl::vec<T, 2>> {
43 public:
44 static constexpr i32 n = 2;
45 static constexpr u64 szrepr = sizeof(T) * n;
46
47 inline static void store(u8 *ptr_store, sycl::vec<T, n> val) {
48 T *ptr = (T *) ptr_store;
49 ptr[0] = val.x();
50 ptr[1] = val.y();
51 }
52 inline static sycl::vec<T, n> load(const u8 *ptr_load) {
53 T *ptr = (T *) ptr_load;
54 return sycl::vec<T, n>{ptr[0], ptr[1]};
55 }
56 };
57
58 template<class T>
59 class SerializeHelperMember<sycl::vec<T, 3>> {
60 public:
61 static constexpr i32 n = 3;
62 static constexpr u64 szrepr = sizeof(T) * n;
63
64 inline static void store(u8 *ptr_store, sycl::vec<T, n> val) {
65 T *ptr = (T *) ptr_store;
66 ptr[0] = val.x();
67 ptr[1] = val.y();
68 ptr[2] = val.z();
69 }
70 inline static sycl::vec<T, n> load(const u8 *ptr_load) {
71 T *ptr = (T *) ptr_load;
72 return sycl::vec<T, n>{ptr[0], ptr[1], ptr[2]};
73 }
74 };
75
76 template<class T>
77 class SerializeHelperMember<sycl::vec<T, 4>> {
78 public:
79 static constexpr i32 n = 4;
80 static constexpr u64 szrepr = sizeof(T) * n;
81
82 inline static void store(u8 *ptr_store, sycl::vec<T, n> val) {
83 T *ptr = (T *) ptr_store;
84 ptr[0] = val.x();
85 ptr[1] = val.y();
86 ptr[2] = val.z();
87 ptr[3] = val.w();
88 }
89 inline static sycl::vec<T, n> load(const u8 *ptr_load) {
90 T *ptr = (T *) ptr_load;
91 return sycl::vec<T, n>{ptr[0], ptr[1], ptr[2], ptr[3]};
92 }
93 };
94
95 template<class T>
96 class SerializeHelperMember<sycl::vec<T, 8>> {
97 public:
98 static constexpr i32 n = 8;
99 static constexpr u64 szrepr = sizeof(T) * n;
100
101 inline static void store(u8 *ptr_store, sycl::vec<T, n> val) {
102 T *ptr = (T *) ptr_store;
103 ptr[0] = val.s0();
104 ptr[1] = val.s1();
105 ptr[2] = val.s2();
106 ptr[3] = val.s3();
107 ptr[4] = val.s4();
108 ptr[5] = val.s5();
109 ptr[6] = val.s6();
110 ptr[7] = val.s7();
111 }
112 inline static sycl::vec<T, n> load(const u8 *ptr_load) {
113 T *ptr = (T *) ptr_load;
114 return sycl::vec<T, n>{ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5], ptr[6], ptr[7]};
115 }
116 };
117
118 template<class T>
119 class SerializeHelperMember<sycl::vec<T, 16>> {
120 public:
121 static constexpr i32 n = 16;
122 static constexpr u64 szrepr = sizeof(T) * n;
123
124 inline static void store(u8 *ptr_store, sycl::vec<T, n> val) {
125 T *ptr = (T *) ptr_store;
126 ptr[0] = val.s0();
127 ptr[1] = val.s1();
128 ptr[2] = val.s2();
129 ptr[3] = val.s3();
130 ptr[4] = val.s4();
131 ptr[5] = val.s5();
132 ptr[6] = val.s6();
133 ptr[7] = val.s7();
134 ptr[8] = val.s8();
135 ptr[9] = val.s9();
136 ptr[10] = val.sA();
137 ptr[11] = val.sB();
138 ptr[12] = val.sC();
139 ptr[13] = val.sD();
140 ptr[14] = val.sE();
141 ptr[15] = val.sF();
142 }
143 inline static sycl::vec<T, n> load(const u8 *ptr_load) {
144 T *ptr = (T *) ptr_load;
145 return sycl::vec<T, n>{
146 ptr[0],
147 ptr[1],
148 ptr[2],
149 ptr[3],
150 ptr[4],
151 ptr[5],
152 ptr[6],
153 ptr[7],
154 ptr[8],
155 ptr[9],
156 ptr[10],
157 ptr[11],
158 ptr[12],
159 ptr[13],
160 ptr[14],
161 ptr[15]};
162 }
163 };
164
165} // namespace shamalgs::details
std::uint8_t u8
8 bit unsigned integer
std::uint64_t u64
64 bit unsigned integer
std::int32_t i32
32 bit integer