Skip to content

Commit c6e12dc

Browse files
committed
mex: proximate, relatve: inline code reuse
1 parent 191d4be commit c6e12dc

File tree

3 files changed

+19
-71
lines changed

3 files changed

+19
-71
lines changed

src/mex2string.inl

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
void matlab_2string(matlab::mex::ArgumentList inputs, std::string* target, std::string* link)
1+
void matlab_2string(matlab::mex::ArgumentList inputs, std::string* s1, std::string* s2)
22
{
33
std::shared_ptr<matlab::engine::MATLABEngine> matlabEng = getEngine();
44

@@ -11,21 +11,21 @@ void matlab_2string(matlab::mex::ArgumentList inputs, std::string* target, std::
1111

1212
if ((inputs[0].getType() == matlab::data::ArrayType::MATLAB_STRING && inputs[0].getNumberOfElements() == 1)){
1313
matlab::data::TypedArray<matlab::data::MATLABString> stringArr = inputs[0];
14-
*target = stringArr[0];
14+
*s1 = stringArr[0];
1515
} else if (inputs[0].getType() == matlab::data::ArrayType::CHAR){
1616
matlab::data::CharArray charArr = inputs[0];
17-
*target = std::string(charArr.begin(), charArr.end());
17+
*s1 = std::string(charArr.begin(), charArr.end());
1818
} else {
1919
matlabEng->feval(u"error", 0,
2020
std::vector<matlab::data::Array>({ factory.createScalar("Mex: First input must be a scalar string or char vector") }));
2121
}
2222

2323
if ((inputs[1].getType() == matlab::data::ArrayType::MATLAB_STRING && inputs[1].getNumberOfElements() == 1)){
2424
matlab::data::TypedArray<matlab::data::MATLABString> stringArr = inputs[1];
25-
*link = stringArr[0];
25+
*s2 = stringArr[0];
2626
} else if (inputs[1].getType() == matlab::data::ArrayType::CHAR){
2727
matlab::data::CharArray charArr = inputs[1];
28-
*link= std::string(charArr.begin(), charArr.end());
28+
*s2 = std::string(charArr.begin(), charArr.end());
2929
} else {
3030
matlabEng->feval(u"error", 0,
3131
std::vector<matlab::data::Array>({ factory.createScalar("Mex: Second input must be a scalar string or char vector") }));

src/proximate_to.cpp

Lines changed: 7 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -12,49 +12,23 @@
1212
#include "ffilesystem.h"
1313

1414

15-
1615
class MexFunction : public matlab::mex::Function {
16+
private:
17+
#include "mex2string.inl"
18+
1719
public:
1820
void operator()(matlab::mex::ArgumentList outputs, matlab::mex::ArgumentList inputs) {
19-
// boilerplate engine & ArrayFactory setup
21+
2022
std::shared_ptr<matlab::engine::MATLABEngine> matlabEng = getEngine();
2123

2224
matlab::data::ArrayFactory factory;
23-
// wrangle inputs
24-
std::string base, other;
2525

26-
if (inputs.size() != 2) {
27-
matlabEng->feval(u"error", 0,
28-
std::vector<matlab::data::Array>({ factory.createScalar("Mex: Two inputs required") }));
29-
}
30-
31-
if ((inputs[0].getType() == matlab::data::ArrayType::MATLAB_STRING && inputs[0].getNumberOfElements() == 1)){
32-
matlab::data::TypedArray<matlab::data::MATLABString> stringArr = inputs[0];
33-
base = stringArr[0];
34-
} else if (inputs[0].getType() == matlab::data::ArrayType::CHAR){
35-
matlab::data::CharArray charArr = inputs[0];
36-
base.assign(charArr.begin(), charArr.end());
37-
} else {
38-
matlabEng->feval(u"error", 0,
39-
std::vector<matlab::data::Array>({ factory.createScalar("Mex: First input must be a scalar string or char vector") }));
40-
}
26+
std::string base, other;
4127

42-
if ((inputs[1].getType() == matlab::data::ArrayType::MATLAB_STRING && inputs[1].getNumberOfElements() == 1)){
43-
matlab::data::TypedArray<matlab::data::MATLABString> stringArr = inputs[1];
44-
other = stringArr[0];
45-
} else if (inputs[1].getType() == matlab::data::ArrayType::CHAR){
46-
matlab::data::CharArray charArr = inputs[1];
47-
other.assign(charArr.begin(), charArr.end());
48-
} else {
49-
matlabEng->feval(u"error", 0,
50-
std::vector<matlab::data::Array>({ factory.createScalar("Mex: Second input must be a scalar string or char vector") }));
51-
}
28+
matlab_2string(inputs, &base, &other);
5229

53-
// actual function algorithm / computation
5430
std::error_code ec;
55-
std::string out;
56-
57-
out = std::filesystem::proximate(other, base, ec).generic_string();
31+
std::string out = std::filesystem::proximate(other, base, ec).generic_string();
5832

5933
if(ec)
6034
matlabEng->feval(u"error", 0,

src/relative_to.cpp

Lines changed: 7 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -12,49 +12,23 @@
1212
#include "ffilesystem.h"
1313

1414

15-
1615
class MexFunction : public matlab::mex::Function {
16+
private:
17+
#include "mex2string.inl"
18+
1719
public:
1820
void operator()(matlab::mex::ArgumentList outputs, matlab::mex::ArgumentList inputs) {
19-
// boilerplate engine & ArrayFactory setup
21+
2022
std::shared_ptr<matlab::engine::MATLABEngine> matlabEng = getEngine();
2123

2224
matlab::data::ArrayFactory factory;
23-
// wrangle inputs
24-
std::string base, other;
2525

26-
if (inputs.size() != 2) {
27-
matlabEng->feval(u"error", 0,
28-
std::vector<matlab::data::Array>({ factory.createScalar("Mex: Two inputs required") }));
29-
}
30-
31-
if ((inputs[0].getType() == matlab::data::ArrayType::MATLAB_STRING && inputs[0].getNumberOfElements() == 1)){
32-
matlab::data::TypedArray<matlab::data::MATLABString> stringArr = inputs[0];
33-
base = stringArr[0];
34-
} else if (inputs[0].getType() == matlab::data::ArrayType::CHAR){
35-
matlab::data::CharArray charArr = inputs[0];
36-
base.assign(charArr.begin(), charArr.end());
37-
} else {
38-
matlabEng->feval(u"error", 0,
39-
std::vector<matlab::data::Array>({ factory.createScalar("Mex: First input must be a scalar string or char vector") }));
40-
}
26+
std::string base, other;
4127

42-
if ((inputs[1].getType() == matlab::data::ArrayType::MATLAB_STRING && inputs[1].getNumberOfElements() == 1)){
43-
matlab::data::TypedArray<matlab::data::MATLABString> stringArr = inputs[1];
44-
other = stringArr[0];
45-
} else if (inputs[1].getType() == matlab::data::ArrayType::CHAR){
46-
matlab::data::CharArray charArr = inputs[1];
47-
other.assign(charArr.begin(), charArr.end());
48-
} else {
49-
matlabEng->feval(u"error", 0,
50-
std::vector<matlab::data::Array>({ factory.createScalar("Mex: Second input must be a scalar string or char vector") }));
51-
}
28+
matlab_2string(inputs, &base, &other);
5229

53-
// actual function algorithm / computation
5430
std::error_code ec;
55-
std::string out;
56-
57-
out = std::filesystem::relative(other, base, ec).generic_string();
31+
std::string out = std::filesystem::relative(other, base, ec).generic_string();
5832

5933
if(ec)
6034
matlabEng->feval(u"error", 0,

0 commit comments

Comments
 (0)