1
-
2
1
#include " alglib_array_converters.h"
3
2
4
- // Convert Ruby Array to real_1d_array
5
3
alglib::real_1d_array ruby_array_to_real_1d_array (Array ruby_array)
6
4
{
7
5
alglib::real_1d_array real_array;
8
6
real_array.setlength (ruby_array.size ());
9
- std::transform (ruby_array.begin (), ruby_array.end (), real_array.getcontent (), [](const Object &o)
10
- { return detail::From_Ruby<double >().convert (o.value ()); });
7
+ for (size_t i = 0 ; i < ruby_array.size (); i++)
8
+ {
9
+ real_array[i] = detail::From_Ruby<double >().convert (ruby_array[i].value ());
10
+ }
11
11
return real_array;
12
12
}
13
13
14
+ alglib::integer_1d_array ruby_array_to_integer_1d_array (Array ruby_array)
15
+ {
16
+ alglib::integer_1d_array integer_array;
17
+ integer_array.setlength (ruby_array.size ());
18
+ for (size_t i = 0 ; i < ruby_array.size (); i++)
19
+ {
20
+ integer_array[i] = detail::From_Ruby<int >().convert (ruby_array[i].value ());
21
+ }
22
+ return integer_array;
23
+ }
24
+
14
25
Array real_1d_array_to_ruby_array (const alglib::real_1d_array &arr)
15
26
{
16
27
Array ruby_array;
@@ -31,61 +42,35 @@ Array integer_1d_array_to_ruby_array(const alglib::integer_1d_array &arr)
31
42
return ruby_array;
32
43
}
33
44
34
- // Convert Ruby Array to integer_1d_array
35
- alglib::integer_1d_array ruby_array_to_integer_1d_array (Array ruby_array)
45
+ alglib::real_2d_array ruby_array_to_real_2d_array (Array ruby_array)
36
46
{
37
- alglib::integer_1d_array integer_array;
38
- integer_array.setlength (ruby_array.size ());
39
- std::transform (ruby_array.begin (), ruby_array.end (), integer_array.getcontent (), [](const Object &o)
40
- { return detail::From_Ruby<int >().convert (o.value ()); });
41
- return integer_array;
42
- }
47
+ if (ruby_array.size () == 0 )
48
+ {
49
+ throw std::invalid_argument (" Input array is empty" );
50
+ }
43
51
44
- /*
45
- Below functions are experimental implementations.
46
- Do not expect this to work!
47
- */
52
+ int rows = ruby_array.size ();
53
+ int cols = detail::From_Ruby<Array>().convert (ruby_array.call (" first" )).size ();
48
54
49
- // Convert Ruby 2d Array to real_2d_array
50
- alglib::real_2d_array ruby_array_to_real_2d_array (Array ruby_array, int &rows, int &cols)
51
- {
52
55
alglib::real_2d_array real_array;
53
- rows = ruby_array.size ();
54
- cols = detail::From_Ruby<Array>().convert (ruby_array.call (" first" )).size ();
55
- // debug
56
56
real_array.setlength (rows, cols);
57
57
58
- Array::iterator it = ruby_array.begin ();
59
- Array::iterator end = ruby_array.end ();
60
-
61
- for (int i = 0 ; it != end; ++it, ++i)
58
+ for (int i = 0 ; i < rows; ++i)
62
59
{
63
- Array row = detail::From_Ruby<Array>().convert (it->value ());
64
- // check if all rows have the same size
60
+ Array row = detail::From_Ruby<Array>().convert (ruby_array[i].value ());
65
61
if (row.size () != cols)
66
62
{
67
63
throw std::invalid_argument (" All rows must have the same size" );
68
64
}
69
-
70
- std::transform (row.begin (), row.end (), real_array[i], [](const Object &o)
71
- { return detail::From_Ruby<double >().convert (o.value ()); });
65
+ for (int j = 0 ; j < cols; ++j)
66
+ {
67
+ real_array[i][j] = detail::From_Ruby<double >().convert (row[j].value ());
68
+ }
72
69
}
73
70
return real_array;
74
71
}
75
72
76
- // Convert real_1d_array to Ruby Array
77
- Array real_1d_array_to_ruby_array (alglib::real_1d_array real_array)
78
- {
79
- Array result;
80
- for (int i = 0 ; i < real_array.length (); i++)
81
- {
82
- result.push (real_array[i]);
83
- }
84
- return result;
85
- }
86
-
87
- // Convert real_2d_array to Ruby Array
88
- Array real_2d_array_to_ruby_array (alglib::real_2d_array real_array)
73
+ Array real_2d_array_to_ruby_array (const alglib::real_2d_array &real_array)
89
74
{
90
75
Array result;
91
76
for (int i = 0 ; i < real_array.rows (); i++)
0 commit comments