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