@@ -143,6 +143,20 @@ extern "C" void f_aero_state_add_aero_dist_sample(
143143 int *n_part_add
144144) noexcept ;
145145
146+
147+ template <typename arr_t , typename arg_t >
148+ auto pointer_vec_magic (arr_t &data_vec, const arg_t &arg) {
149+ std::vector<char *> pointer_vec (data_vec.size ());
150+ if (arg.has_value ())
151+ for (size_t i=0 ; i < arg.value ().size (); ++i)
152+ strcpy (
153+ pointer_vec[i] = data_vec[i].data (),
154+ arg.value ()[i].c_str ()
155+ );
156+ return pointer_vec;
157+ }
158+
159+
146160struct AeroState {
147161 PMCResource ptr;
148162 std::shared_ptr<AeroData> aero_data;
@@ -231,8 +245,8 @@ struct AeroState {
231245
232246 static auto masses (
233247 const AeroState &self,
234- const tl::optional<std::valarray<std::string>>&include,
235- const tl::optional<std::valarray<std::string>>&exclude
248+ const tl::optional<std::valarray<std::string>> &include,
249+ const tl::optional<std::valarray<std::string>> &exclude
236250 ) {
237251 int len;
238252 f_aero_state_len (
@@ -244,27 +258,9 @@ struct AeroState {
244258 const int include_size = (include.has_value ()) ? include.value ().size () : 0 ;
245259 const int exclude_size = (exclude.has_value ()) ? exclude.value ().size () : 0 ;
246260
247- char **include_arr = NULL ;
248- if (include.has_value ()){
249- include_arr = new char *[include_size];
250- int i = 0 ;
251- for (const std::string &x : include.value ()){
252- include_arr[i] = new char [AERO_NAME_LEN];
253- strcpy (include_arr[i], x.c_str ());
254- i = i + 1 ;
255- }
256- }
257-
258- char **exclude_arr = NULL ;
259- if (exclude.has_value ()){
260- exclude_arr = new char *[exclude_size];
261- int i = 0 ;
262- for (const std::string &x : exclude.value ()){
263- exclude_arr[i] = new char [AERO_NAME_LEN];
264- strcpy (exclude_arr[i], x.c_str ());
265- i = i + 1 ;
266- }
267- }
261+ std::vector<std::array<char , AERO_NAME_LEN>>
262+ include_arr (include_size),
263+ exclude_arr (exclude_size);
268264
269265 f_aero_state_masses (
270266 self.ptr .f_arg (),
@@ -273,13 +269,10 @@ struct AeroState {
273269 &len,
274270 &include_size,
275271 &exclude_size,
276- include_arr,
277- exclude_arr
272+ pointer_vec_magic ( include_arr, include). data () ,
273+ pointer_vec_magic ( exclude_arr, exclude). data ()
278274 );
279275
280- delete[] include_arr;
281- delete[] exclude_arr;
282-
283276 return masses;
284277 }
285278
@@ -302,9 +295,9 @@ struct AeroState {
302295 }
303296
304297 static auto diameters (
305- const AeroState &self,
306- const tl::optional<std::valarray<std::string>>&include,
307- const tl::optional<std::valarray<std::string>>&exclude
298+ const AeroState &self,
299+ const tl::optional<std::valarray<std::string>> &include,
300+ const tl::optional<std::valarray<std::string>> &exclude
308301 ) {
309302 int len;
310303 f_aero_state_len (
@@ -316,27 +309,9 @@ struct AeroState {
316309 const int include_size = (include.has_value ()) ? include.value ().size () : 0 ;
317310 const int exclude_size = (exclude.has_value ()) ? exclude.value ().size () : 0 ;
318311
319- char **include_arr = NULL ;
320- if (include.has_value ()){
321- include_arr = new char *[include_size];
322- int i = 0 ;
323- for (const std::string &x : include.value ()){
324- include_arr[i] = new char [AERO_NAME_LEN];
325- strcpy (include_arr[i], x.c_str ());
326- i = i + 1 ;
327- }
328- }
329-
330- char **exclude_arr = NULL ;
331- if (exclude.has_value ()){
332- exclude_arr = new char *[exclude_size];
333- int i = 0 ;
334- for (const std::string &x : exclude.value ()){
335- exclude_arr[i] = new char [AERO_NAME_LEN];
336- strcpy (exclude_arr[i], x.c_str ());
337- i = i + 1 ;
338- }
339- }
312+ std::vector<std::array<char , AERO_NAME_LEN>>
313+ include_arr (include_size),
314+ exclude_arr (exclude_size);
340315
341316 f_aero_state_diameters (
342317 self.ptr .f_arg (),
@@ -345,20 +320,17 @@ struct AeroState {
345320 &len,
346321 &include_size,
347322 &exclude_size,
348- include_arr,
349- exclude_arr
323+ pointer_vec_magic ( include_arr, include). data () ,
324+ pointer_vec_magic ( exclude_arr, exclude). data ()
350325 );
351326
352- delete[] include_arr;
353- delete[] exclude_arr;
354-
355327 return diameters;
356328 }
357329
358330 static auto volumes (
359331 const AeroState &self,
360- const tl::optional<std::valarray<std::string>>&include,
361- const tl::optional<std::valarray<std::string>>&exclude
332+ const tl::optional<std::valarray<std::string>> &include,
333+ const tl::optional<std::valarray<std::string>> &exclude
362334 ) {
363335 int len;
364336 f_aero_state_len (
@@ -370,27 +342,9 @@ struct AeroState {
370342 const int include_size = (include.has_value ()) ? include.value ().size () : 0 ;
371343 const int exclude_size = (exclude.has_value ()) ? exclude.value ().size () : 0 ;
372344
373- char **include_arr = NULL ;
374- if (include.has_value ()){
375- include_arr = new char *[include_size];
376- int i = 0 ;
377- for (const std::string &x : include.value ()){
378- include_arr[i] = new char [AERO_NAME_LEN];
379- strcpy (include_arr[i], x.c_str ());
380- i = i + 1 ;
381- }
382- }
383-
384- char **exclude_arr = NULL ;
385- if (exclude.has_value ()){
386- exclude_arr = new char *[exclude_size];
387- int i = 0 ;
388- for (const std::string &x : exclude.value ()){
389- exclude_arr[i] = new char [AERO_NAME_LEN];
390- strcpy (exclude_arr[i], x.c_str ());
391- i = i + 1 ;
392- }
393- }
345+ std::vector<std::array<char , AERO_NAME_LEN>>
346+ include_arr (include_size),
347+ exclude_arr (exclude_size);
394348
395349 f_aero_state_volumes (
396350 self.ptr .f_arg (),
@@ -399,13 +353,10 @@ struct AeroState {
399353 &len,
400354 &include_size,
401355 &exclude_size,
402- include_arr,
403- exclude_arr
356+ pointer_vec_magic ( include_arr, include). data () ,
357+ pointer_vec_magic ( exclude_arr, exclude). data ()
404358 );
405359
406- delete[] include_arr;
407- delete[] exclude_arr;
408-
409360 return volumes;
410361 }
411362
@@ -433,9 +384,9 @@ struct AeroState {
433384
434385 static auto mixing_state (
435386 const AeroState &self,
436- const tl::optional<std::valarray<std::string>>&include,
437- const tl::optional<std::valarray<std::string>>&exclude,
438- const tl::optional<std::valarray<std::string>>&group
387+ const tl::optional<std::valarray<std::string>> &include,
388+ const tl::optional<std::valarray<std::string>> &exclude,
389+ const tl::optional<std::valarray<std::string>> &group
439390 ) {
440391 int len;
441392 f_aero_state_len (
@@ -450,38 +401,10 @@ struct AeroState {
450401 const int exclude_size = (exclude.has_value ()) ? exclude.value ().size () : 0 ;
451402 const int group_size = (group.has_value ()) ? group.value ().size () : 0 ;
452403
453- char **include_arr = NULL ;
454- if (include.has_value ()){
455- include_arr = new char *[include_size];
456- int i = 0 ;
457- for (const std::string &x : include.value ()){
458- include_arr[i] = new char [AERO_NAME_LEN];
459- strcpy (include_arr[i], x.c_str ());
460- i = i + 1 ;
461- }
462- }
463-
464- char **exclude_arr = NULL ;
465- if (exclude.has_value ()){
466- exclude_arr = new char *[exclude_size];
467- int i = 0 ;
468- for (const std::string &x : exclude.value ()){
469- exclude_arr[i] = new char [AERO_NAME_LEN];
470- strcpy (exclude_arr[i], x.c_str ());
471- i = i + 1 ;
472- }
473- }
474-
475- char **group_arr = NULL ;
476- if (group.has_value ()){
477- group_arr = new char *[group_size];
478- int i = 0 ;
479- for (const std::string &x : group.value ()){
480- group_arr[i] = new char [AERO_NAME_LEN];
481- strcpy (group_arr[i], x.c_str ());
482- i = i + 1 ;
483- }
484- }
404+ std::vector<std::array<char , AERO_NAME_LEN>>
405+ include_arr (include_size),
406+ exclude_arr (exclude_size),
407+ group_arr (group_size);
485408
486409 f_aero_state_mixing_state_metrics (
487410 self.ptr .f_arg (),
@@ -492,15 +415,11 @@ struct AeroState {
492415 &include_size,
493416 &exclude_size,
494417 &group_size,
495- include_arr,
496- exclude_arr,
497- group_arr
418+ pointer_vec_magic ( include_arr, include). data () ,
419+ pointer_vec_magic ( exclude_arr, exclude). data () ,
420+ pointer_vec_magic ( group_arr, group). data ()
498421 );
499422
500- delete[] include_arr;
501- delete[] exclude_arr;
502- delete[] group_arr;
503-
504423 return std::make_tuple (d_alpha, d_gamma, chi);
505424 }
506425
@@ -554,17 +473,16 @@ struct AeroState {
554473 int n_part_add = 0 ;
555474
556475 f_aero_state_add_aero_dist_sample (
557- self.ptr .f_arg (),
558- self.aero_data ->ptr .f_arg (),
559- aero_dist.ptr .f_arg (),
560- &sample_prop,
561- &create_time,
562- &allow_doubling,
563- &allow_halving,
564- &n_part_add
476+ self.ptr .f_arg (),
477+ self.aero_data ->ptr .f_arg (),
478+ aero_dist.ptr .f_arg (),
479+ &sample_prop,
480+ &create_time,
481+ &allow_doubling,
482+ &allow_halving,
483+ &n_part_add
565484 );
566485 return n_part_add;
567-
568486 }
569487
570488};
0 commit comments