Skip to content

Commit 2f5b505

Browse files
committed
Remove redundant parameters and improve array conversion functions
1 parent a239001 commit 2f5b505

File tree

4 files changed

+46
-64
lines changed

4 files changed

+46
-64
lines changed

Diff for: ext/alglib/alglib.cpp

+7-8
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,7 @@ using namespace Rice;
1515
Hash rb_pcabuildbasis(Array x)
1616
{
1717
Hash result;
18-
int rows, cols;
19-
auto a = ruby_array_to_real_2d_array(x, rows, cols);
18+
auto a = ruby_array_to_real_2d_array(x);
2019
alglib::real_1d_array s2;
2120
alglib::real_2d_array v;
2221
alglib::pcabuildbasis(a, s2, v, alglib::xdefault);
@@ -457,18 +456,18 @@ extern "C" void Init_alglib()
457456

458457
Data_Type<alglib::real_1d_array> rb_cReal1DArray =
459458
define_class_under<alglib::real_1d_array>(rb_mAlglib, "Real1DArray")
460-
.define_constructor(Constructor<alglib::real_1d_array>())
461-
.define_method("getcontent", static_cast<double* (alglib::real_1d_array::*)()>(&alglib::real_1d_array::getcontent));
459+
.define_constructor(Constructor<alglib::real_1d_array>())
460+
.define_method("getcontent", static_cast<double *(alglib::real_1d_array::*)()>(&alglib::real_1d_array::getcontent));
462461

463462
Data_Type<alglib::integer_1d_array> rb_cInteger1DArray =
464463
define_class_under<alglib::integer_1d_array>(rb_mAlglib, "Integer1DArray")
465-
.define_constructor(Constructor<alglib::integer_1d_array>())
466-
.define_method("getcontent", static_cast<alglib::ae_int_t* (alglib::integer_1d_array::*)()>(&alglib::integer_1d_array::getcontent));
464+
.define_constructor(Constructor<alglib::integer_1d_array>())
465+
.define_method("getcontent", static_cast<alglib::ae_int_t *(alglib::integer_1d_array::*)()>(&alglib::integer_1d_array::getcontent));
467466

468467
Data_Type<alglib::real_2d_array> rb_cReal2DArray =
469468
define_class_under<alglib::real_2d_array>(rb_mAlglib, "Real2DArray")
470-
.define_constructor(Constructor<alglib::real_2d_array>())
471-
.define_method("getcontent", static_cast<double* (alglib::real_2d_array::*)(alglib::ae_int_t)>(&alglib::real_2d_array::operator[]));
469+
.define_constructor(Constructor<alglib::real_2d_array>())
470+
.define_method("getcontent", static_cast<double *(alglib::real_2d_array::*)(alglib::ae_int_t)>(&alglib::real_2d_array::operator[]));
472471

473472
rb_mAlglib
474473
.define_module_function("ruby_array_to_real_1d_array", &ruby_array_to_real_1d_array)

Diff for: ext/alglib/alglib_array_converters.cpp

+29-44
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,27 @@
1-
21
#include "alglib_array_converters.h"
32

4-
// Convert Ruby Array to real_1d_array
53
alglib::real_1d_array ruby_array_to_real_1d_array(Array ruby_array)
64
{
75
alglib::real_1d_array real_array;
86
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+
}
1111
return real_array;
1212
}
1313

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+
1425
Array real_1d_array_to_ruby_array(const alglib::real_1d_array &arr)
1526
{
1627
Array ruby_array;
@@ -31,61 +42,35 @@ Array integer_1d_array_to_ruby_array(const alglib::integer_1d_array &arr)
3142
return ruby_array;
3243
}
3344

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)
3646
{
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+
}
4351

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();
4854

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-
{
5255
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
5656
real_array.setlength(rows, cols);
5757

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)
6259
{
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());
6561
if (row.size() != cols)
6662
{
6763
throw std::invalid_argument("All rows must have the same size");
6864
}
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+
}
7269
}
7370
return real_array;
7471
}
7572

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)
8974
{
9075
Array result;
9176
for (int i = 0; i < real_array.rows(); i++)

Diff for: ext/alglib/alglib_array_converters.h

+9-9
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44

55
using namespace Rice;
66

7-
alglib::real_1d_array ruby_array_to_real_1d_array(Array ruby_array);
8-
9-
// Experimental implementations - do not expect this to work!
10-
11-
alglib::integer_1d_array ruby_array_to_integer_1d_array(Array ruby_array);
12-
alglib::real_2d_array ruby_array_to_real_2d_array(Array ruby_array, int &rows, int &cols);
13-
Array real_1d_array_to_ruby_array(alglib::real_1d_array real_array);
14-
Array real_2d_array_to_ruby_array(alglib::real_2d_array real_array);
15-
Array integer_1d_array_to_ruby_array(const alglib::integer_1d_array &arr);
7+
extern "C"
8+
{
9+
alglib::real_1d_array ruby_array_to_real_1d_array(Array ruby_array);
10+
alglib::integer_1d_array ruby_array_to_integer_1d_array(Array ruby_array);
11+
alglib::real_2d_array ruby_array_to_real_2d_array(Array ruby_array);
12+
Array real_1d_array_to_ruby_array(const alglib::real_1d_array &arr);
13+
Array real_2d_array_to_ruby_array(const alglib::real_2d_array &real_array);
14+
Array integer_1d_array_to_ruby_array(const alglib::integer_1d_array &arr);
15+
}

Diff for: test/alglib_array_converters_test.rb

+1-3
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,7 @@ def test_ruby_array_to_integer_1d_array
1818

1919
def test_ruby_array_to_real_2d_array
2020
ruby_array = [[1.0, 2.0], [3.0, 4.0]]
21-
rows = ruby_array.size
22-
cols = ruby_array.first.size
23-
alglib_array = Alglib.ruby_array_to_real_2d_array(ruby_array, rows, cols)
21+
alglib_array = Alglib.ruby_array_to_real_2d_array(ruby_array)
2422
assert_equal(ruby_array, Alglib.real_2d_array_to_ruby_array(alglib_array))
2523
end
2624

0 commit comments

Comments
 (0)