1 /*
2 * Copyright (c) 2013-2021, The OSKAR Developers.
3 * See the LICENSE file at the top-level directory of this distribution.
4 */
5
6 #include "mem/oskar_mem.h"
7 #include "mem/private_mem.h"
8
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
12
oskar_mem_allocated(const oskar_Mem * mem)13 int oskar_mem_allocated(const oskar_Mem* mem)
14 {
15 return mem->data ? 1 : 0;
16 }
17
oskar_mem_length(const oskar_Mem * mem)18 size_t oskar_mem_length(const oskar_Mem* mem)
19 {
20 return mem->num_elements;
21 }
22
oskar_mem_location(const oskar_Mem * mem)23 int oskar_mem_location(const oskar_Mem* mem)
24 {
25 return mem->location;
26 }
27
oskar_mem_type(const oskar_Mem * mem)28 int oskar_mem_type(const oskar_Mem* mem)
29 {
30 return mem->type;
31 }
32
oskar_mem_precision(const oskar_Mem * mem)33 int oskar_mem_precision(const oskar_Mem* mem)
34 {
35 return oskar_type_precision(mem->type);
36 }
37
oskar_mem_is_double(const oskar_Mem * mem)38 int oskar_mem_is_double(const oskar_Mem* mem)
39 {
40 return oskar_type_is_double(mem->type);
41 }
42
oskar_mem_is_single(const oskar_Mem * mem)43 int oskar_mem_is_single(const oskar_Mem* mem)
44 {
45 return oskar_type_is_single(mem->type);
46 }
47
oskar_mem_is_complex(const oskar_Mem * mem)48 int oskar_mem_is_complex(const oskar_Mem* mem)
49 {
50 return oskar_type_is_complex(mem->type);
51 }
52
oskar_mem_is_real(const oskar_Mem * mem)53 int oskar_mem_is_real(const oskar_Mem* mem)
54 {
55 return oskar_type_is_real(mem->type);
56 }
57
oskar_mem_is_matrix(const oskar_Mem * mem)58 int oskar_mem_is_matrix(const oskar_Mem* mem)
59 {
60 return oskar_type_is_matrix(mem->type);
61 }
62
oskar_mem_is_scalar(const oskar_Mem * mem)63 int oskar_mem_is_scalar(const oskar_Mem* mem)
64 {
65 return oskar_type_is_scalar(mem->type);
66 }
67
68 /* Pointer conversion functions. */
69
oskar_mem_buffer(oskar_Mem * mem)70 void* oskar_mem_buffer(oskar_Mem* mem)
71 {
72 return (void*) &mem->data;
73 }
74
oskar_mem_buffer_const(const oskar_Mem * mem)75 const void* oskar_mem_buffer_const(const oskar_Mem* mem)
76 {
77 return (const void*) &mem->data;
78 }
79
oskar_mem_void(oskar_Mem * mem)80 void* oskar_mem_void(oskar_Mem* mem)
81 {
82 return (void*) mem->data;
83 }
84
oskar_mem_void_const(const oskar_Mem * mem)85 const void* oskar_mem_void_const(const oskar_Mem* mem)
86 {
87 return (const void*) mem->data;
88 }
89
oskar_mem_char(oskar_Mem * mem)90 char* oskar_mem_char(oskar_Mem* mem)
91 {
92 return (char*) mem->data;
93 }
94
oskar_mem_char_const(const oskar_Mem * mem)95 const char* oskar_mem_char_const(const oskar_Mem* mem)
96 {
97 return (const char*) mem->data;
98 }
99
oskar_mem_int(oskar_Mem * mem,int * status)100 int* oskar_mem_int(oskar_Mem* mem, int* status)
101 {
102 /* Check for type mismatch. */
103 if (oskar_type_precision(mem->type) != OSKAR_INT)
104 {
105 *status = OSKAR_ERR_TYPE_MISMATCH;
106 }
107
108 /* Cast the pointer. */
109 return (int*) mem->data;
110 }
111
oskar_mem_int_const(const oskar_Mem * mem,int * status)112 const int* oskar_mem_int_const(const oskar_Mem* mem, int* status)
113 {
114 /* Check for type mismatch. */
115 if (oskar_type_precision(mem->type) != OSKAR_INT)
116 {
117 *status = OSKAR_ERR_TYPE_MISMATCH;
118 }
119
120 /* Cast the pointer. */
121 return (const int*) mem->data;
122 }
123
oskar_mem_float(oskar_Mem * mem,int * status)124 float* oskar_mem_float(oskar_Mem* mem, int* status)
125 {
126 /* Check for type mismatch. */
127 if (oskar_type_precision(mem->type) != OSKAR_SINGLE)
128 {
129 *status = OSKAR_ERR_TYPE_MISMATCH;
130 }
131
132 /* Cast the pointer. */
133 return (float*) mem->data;
134 }
135
oskar_mem_float_const(const oskar_Mem * mem,int * status)136 const float* oskar_mem_float_const(const oskar_Mem* mem, int* status)
137 {
138 /* Check for type mismatch. */
139 if (oskar_type_precision(mem->type) != OSKAR_SINGLE)
140 {
141 *status = OSKAR_ERR_TYPE_MISMATCH;
142 }
143
144 /* Cast the pointer. */
145 return (const float*) mem->data;
146 }
147
oskar_mem_float2(oskar_Mem * mem,int * status)148 float2* oskar_mem_float2(oskar_Mem* mem, int* status)
149 {
150 /* Check for type mismatch. */
151 if (oskar_type_precision(mem->type) != OSKAR_SINGLE ||
152 !oskar_type_is_complex(mem->type))
153 {
154 *status = OSKAR_ERR_TYPE_MISMATCH;
155 }
156
157 /* Cast the pointer. */
158 return (float2*) mem->data;
159 }
160
oskar_mem_float2_const(const oskar_Mem * mem,int * status)161 const float2* oskar_mem_float2_const(const oskar_Mem* mem, int* status)
162 {
163 /* Check for type mismatch. */
164 if (oskar_type_precision(mem->type) != OSKAR_SINGLE ||
165 !oskar_type_is_complex(mem->type))
166 {
167 *status = OSKAR_ERR_TYPE_MISMATCH;
168 }
169
170 /* Cast the pointer. */
171 return (const float2*) mem->data;
172 }
173
oskar_mem_float4c(oskar_Mem * mem,int * status)174 float4c* oskar_mem_float4c(oskar_Mem* mem, int* status)
175 {
176 /* Check for type mismatch. */
177 if (oskar_type_precision(mem->type) != OSKAR_SINGLE ||
178 !oskar_type_is_complex(mem->type) ||
179 !oskar_type_is_matrix(mem->type))
180 {
181 *status = OSKAR_ERR_TYPE_MISMATCH;
182 }
183
184 /* Cast the pointer. */
185 return (float4c*) mem->data;
186 }
187
oskar_mem_float4c_const(const oskar_Mem * mem,int * status)188 const float4c* oskar_mem_float4c_const(const oskar_Mem* mem, int* status)
189 {
190 /* Check for type mismatch. */
191 if (oskar_type_precision(mem->type) != OSKAR_SINGLE ||
192 !oskar_type_is_complex(mem->type) ||
193 !oskar_type_is_matrix(mem->type))
194 {
195 *status = OSKAR_ERR_TYPE_MISMATCH;
196 }
197
198 /* Cast the pointer. */
199 return (const float4c*) mem->data;
200 }
201
oskar_mem_double(oskar_Mem * mem,int * status)202 double* oskar_mem_double(oskar_Mem* mem, int* status)
203 {
204 /* Check for type mismatch. */
205 if (oskar_type_precision(mem->type) != OSKAR_DOUBLE)
206 {
207 *status = OSKAR_ERR_TYPE_MISMATCH;
208 }
209
210 /* Cast the pointer. */
211 return (double*) mem->data;
212 }
213
oskar_mem_double_const(const oskar_Mem * mem,int * status)214 const double* oskar_mem_double_const(const oskar_Mem* mem, int* status)
215 {
216 /* Check for type mismatch. */
217 if (oskar_type_precision(mem->type) != OSKAR_DOUBLE)
218 {
219 *status = OSKAR_ERR_TYPE_MISMATCH;
220 }
221
222 /* Cast the pointer. */
223 return (const double*) mem->data;
224 }
225
oskar_mem_double2(oskar_Mem * mem,int * status)226 double2* oskar_mem_double2(oskar_Mem* mem, int* status)
227 {
228 /* Check for type mismatch. */
229 if (oskar_type_precision(mem->type) != OSKAR_DOUBLE ||
230 !oskar_type_is_complex(mem->type))
231 {
232 *status = OSKAR_ERR_TYPE_MISMATCH;
233 }
234
235 /* Cast the pointer. */
236 return (double2*) mem->data;
237 }
238
oskar_mem_double2_const(const oskar_Mem * mem,int * status)239 const double2* oskar_mem_double2_const(const oskar_Mem* mem, int* status)
240 {
241 /* Check for type mismatch. */
242 if (oskar_type_precision(mem->type) != OSKAR_DOUBLE ||
243 !oskar_type_is_complex(mem->type))
244 {
245 *status = OSKAR_ERR_TYPE_MISMATCH;
246 }
247
248 /* Cast the pointer. */
249 return (const double2*) mem->data;
250 }
251
oskar_mem_double4c(oskar_Mem * mem,int * status)252 double4c* oskar_mem_double4c(oskar_Mem* mem, int* status)
253 {
254 /* Check for type mismatch. */
255 if (oskar_type_precision(mem->type) != OSKAR_DOUBLE ||
256 !oskar_type_is_complex(mem->type) ||
257 !oskar_type_is_matrix(mem->type))
258 {
259 *status = OSKAR_ERR_TYPE_MISMATCH;
260 }
261
262 /* Cast the pointer. */
263 return (double4c*) mem->data;
264 }
265
oskar_mem_double4c_const(const oskar_Mem * mem,int * status)266 const double4c* oskar_mem_double4c_const(const oskar_Mem* mem, int* status)
267 {
268 /* Check for type mismatch. */
269 if (oskar_type_precision(mem->type) != OSKAR_DOUBLE ||
270 !oskar_type_is_complex(mem->type) ||
271 !oskar_type_is_matrix(mem->type))
272 {
273 *status = OSKAR_ERR_TYPE_MISMATCH;
274 }
275
276 /* Cast the pointer. */
277 return (const double4c*) mem->data;
278 }
279
280
281 #ifdef __cplusplus
282 }
283 #endif
284