You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by ke...@apache.org on 2023/07/12 20:18:31 UTC
[arrow] branch main updated: GH-36614: [MATLAB] Subclass arrow::Buffer to keep MATLAB data backing arrow::Arrays alive (#36615)
This is an automated email from the ASF dual-hosted git repository.
kevingurney pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow.git
The following commit(s) were added to refs/heads/main by this push:
new d8a3360685 GH-36614: [MATLAB] Subclass arrow::Buffer to keep MATLAB data backing arrow::Arrays alive (#36615)
d8a3360685 is described below
commit d8a336068540389196102b4e5366b82bad92987b
Author: sgilmore10 <74...@users.noreply.github.com>
AuthorDate: Wed Jul 12 16:18:25 2023 -0400
GH-36614: [MATLAB] Subclass arrow::Buffer to keep MATLAB data backing arrow::Arrays alive (#36615)
### Rationale for this change
When building `arrow.array.<Numeric>Arrays` from native MATLAB arrays, we avoid copying by
1. Wrapping the MATLAB data inside a non-owning `arrow::Buffer`
2. Constructing an `arrow::ArrayData` object from the `arrow::Buffer`
3. Constructing the `arrow::Array` from the `arrow::Data` object.
Because the `Array`'s underlying `Buffer` does not have ownership of its backing data, we have been storing the original MATLAB array as a property called `MatlabArray` on the MATLAB `arrow.array.NumericArray` class.
This solution is not ideal because the backing MATLAB array is kept separate from the actual `std::shared_ptr<arrow::Array>`, which is stored within the C++ proxy objects (e.g. `arrow::matlab::array::proxy::NumericArray<float64>`). A better solution would be to create a new subclass of `arrow::Buffer` called `MatlabBuffer`, which will keep the original MATLAB array alive by taking it in as an input parameter and storing it as a member variable.
### What changes are included in this PR?
1. Removed the `MatlabArray` property from the MATLAB class `matlab.io.NumericArray`
2. Added a private member variable called `mda_array` to `arrow::matlab::array::proxy::NumericArray<CType>` and `arrow::matlab::array::proxy::TimestampArray`. `mda_array` is a `matlab::data::Array` object. This member variable stores the MATLAB array that owns the memory the `arrow::Array` objects are backed by.
### Are these changes tested?
Existing tests used.
### Are there any user-facing changes?
No.
* Closes: #36614
Authored-by: Sarah Gilmore <sg...@mathworks.com>
Signed-off-by: Kevin Gurney <kg...@mathworks.com>
---
matlab/src/cpp/arrow/matlab/array/proxy/array.cc | 2 +-
matlab/src/cpp/arrow/matlab/array/proxy/array.h | 2 +-
.../cpp/arrow/matlab/array/proxy/boolean_array.cc | 6 ++-
.../cpp/arrow/matlab/array/proxy/boolean_array.h | 6 +--
.../cpp/arrow/matlab/array/proxy/numeric_array.h | 26 ++++++------
.../cpp/arrow/matlab/array/proxy/string_array.cc | 7 +++-
.../cpp/arrow/matlab/array/proxy/string_array.h | 9 ++---
.../arrow/matlab/array/proxy/timestamp_array.cc | 45 ++++++++++-----------
.../cpp/arrow/matlab/array/proxy/timestamp_array.h | 8 ++--
.../proxy/array.h => buffer/matlab_buffer.h} | 47 +++++++++++-----------
matlab/src/matlab/+arrow/+array/NumericArray.m | 8 ----
matlab/test/arrow/array/hNumericArray.m | 8 ----
matlab/tools/cmake/BuildMatlabArrowInterface.cmake | 4 +-
13 files changed, 80 insertions(+), 98 deletions(-)
diff --git a/matlab/src/cpp/arrow/matlab/array/proxy/array.cc b/matlab/src/cpp/arrow/matlab/array/proxy/array.cc
index 35dc496bdd..7f4d789c10 100644
--- a/matlab/src/cpp/arrow/matlab/array/proxy/array.cc
+++ b/matlab/src/cpp/arrow/matlab/array/proxy/array.cc
@@ -23,7 +23,7 @@
namespace arrow::matlab::array::proxy {
- Array::Array() {
+ Array::Array(std::shared_ptr<arrow::Array> array) : array{std::move(array)} {
// Register Proxy methods.
REGISTER_METHOD(Array, toString);
diff --git a/matlab/src/cpp/arrow/matlab/array/proxy/array.h b/matlab/src/cpp/arrow/matlab/array/proxy/array.h
index 94fad75975..c36f190071 100644
--- a/matlab/src/cpp/arrow/matlab/array/proxy/array.h
+++ b/matlab/src/cpp/arrow/matlab/array/proxy/array.h
@@ -25,7 +25,7 @@ namespace arrow::matlab::array::proxy {
class Array : public libmexclass::proxy::Proxy {
public:
- Array();
+ Array(std::shared_ptr<arrow::Array> array);
virtual ~Array() {}
diff --git a/matlab/src/cpp/arrow/matlab/array/proxy/boolean_array.cc b/matlab/src/cpp/arrow/matlab/array/proxy/boolean_array.cc
index 9a3b7ed4e2..bcbe49f04b 100644
--- a/matlab/src/cpp/arrow/matlab/array/proxy/boolean_array.cc
+++ b/matlab/src/cpp/arrow/matlab/array/proxy/boolean_array.cc
@@ -23,6 +23,9 @@
namespace arrow::matlab::array::proxy {
+ BooleanArray::BooleanArray(std::shared_ptr<arrow::BooleanArray> array)
+ : arrow::matlab::array::proxy::Array{std::move(array)} {}
+
libmexclass::proxy::MakeResult BooleanArray::make(const libmexclass::proxy::FunctionArguments& constructor_arguments) {
::matlab::data::StructArray opts = constructor_arguments[0];
@@ -40,7 +43,8 @@ namespace arrow::matlab::array::proxy {
const auto array_length = logical_mda.getNumberOfElements();
auto array_data = arrow::ArrayData::Make(data_type, array_length, {validity_bitmap_buffer, data_buffer});
- return std::make_shared<arrow::matlab::array::proxy::BooleanArray>(arrow::MakeArray(array_data));
+ auto arrow_array = std::static_pointer_cast<arrow::BooleanArray>(arrow::MakeArray(array_data));
+ return std::make_shared<arrow::matlab::array::proxy::BooleanArray>(std::move(arrow_array));
}
void BooleanArray::toMATLAB(libmexclass::proxy::method::Context& context) {
diff --git a/matlab/src/cpp/arrow/matlab/array/proxy/boolean_array.h b/matlab/src/cpp/arrow/matlab/array/proxy/boolean_array.h
index 6966d1090e..b3117d852a 100644
--- a/matlab/src/cpp/arrow/matlab/array/proxy/boolean_array.h
+++ b/matlab/src/cpp/arrow/matlab/array/proxy/boolean_array.h
@@ -20,15 +20,13 @@
#include "arrow/matlab/array/proxy/array.h"
#include "libmexclass/proxy/Proxy.h"
+#include "arrow/type_fwd.h"
namespace arrow::matlab::array::proxy {
class BooleanArray : public arrow::matlab::array::proxy::Array {
public:
- BooleanArray(const std::shared_ptr<arrow::Array> logical_array)
- : arrow::matlab::array::proxy::Array() {
- array = logical_array;
- }
+ BooleanArray(std::shared_ptr<arrow::BooleanArray> array);
static libmexclass::proxy::MakeResult make(const libmexclass::proxy::FunctionArguments& constructor_arguments);
diff --git a/matlab/src/cpp/arrow/matlab/array/proxy/numeric_array.h b/matlab/src/cpp/arrow/matlab/array/proxy/numeric_array.h
index 24d2565f30..d3930c77ca 100644
--- a/matlab/src/cpp/arrow/matlab/array/proxy/numeric_array.h
+++ b/matlab/src/cpp/arrow/matlab/array/proxy/numeric_array.h
@@ -27,6 +27,7 @@
#include "arrow/matlab/error/error.h"
#include "arrow/matlab/bit/pack.h"
#include "arrow/matlab/bit/unpack.h"
+#include "arrow/matlab/buffer/matlab_buffer.h"
#include "libmexclass/proxy/Proxy.h"
@@ -35,14 +36,15 @@ namespace arrow::matlab::array::proxy {
template<typename CType>
class NumericArray : public arrow::matlab::array::proxy::Array {
public:
- NumericArray(const std::shared_ptr<arrow::Array> numeric_array)
- : arrow::matlab::array::proxy::Array() {
- array = numeric_array;
- }
+ using ArrowType = typename arrow::CTypeTraits<CType>::ArrowType;
- static libmexclass::proxy::MakeResult make(const libmexclass::proxy::FunctionArguments& constructor_arguments) {
- using ArrowType = typename arrow::CTypeTraits<CType>::ArrowType;
- using BuilderType = typename arrow::CTypeTraits<CType>::BuilderType;
+ NumericArray(const std::shared_ptr<arrow::NumericArray<ArrowType>> numeric_array)
+ : arrow::matlab::array::proxy::Array{std::move(numeric_array)} {}
+
+ static libmexclass::proxy::MakeResult make(const libmexclass::proxy::FunctionArguments& constructor_arguments) {
+ using MatlabBuffer = arrow::matlab::buffer::MatlabBuffer;
+ using NumericArray = arrow::NumericArray<ArrowType>;
+ using NumericArrayProxy = typename arrow::matlab::array::proxy::NumericArray<CType>;
::matlab::data::StructArray opts = constructor_arguments[0];
@@ -50,20 +52,16 @@ class NumericArray : public arrow::matlab::array::proxy::Array {
const ::matlab::data::TypedArray<CType> numeric_mda = opts[0]["MatlabArray"];
const ::matlab::data::TypedArray<bool> valid_mda = opts[0]["Valid"];
- // Get raw pointer of mxArray
- auto it(numeric_mda.cbegin());
- auto dt = it.operator->();
+ auto data_buffer = std::make_shared<MatlabBuffer>(numeric_mda);
const auto data_type = arrow::CTypeTraits<CType>::type_singleton();
const auto length = static_cast<int64_t>(numeric_mda.getNumberOfElements()); // cast size_t to int64_t
- // Do not make a copy when creating arrow::Buffer
- auto data_buffer = std::make_shared<arrow::Buffer>(reinterpret_cast<const uint8_t*>(dt),
- sizeof(CType) * numeric_mda.getNumberOfElements());
// Pack the validity bitmap values.
MATLAB_ASSIGN_OR_ERROR(auto packed_validity_bitmap, bit::packValid(valid_mda), error::BITPACK_VALIDITY_BITMAP_ERROR_ID);
auto array_data = arrow::ArrayData::Make(data_type, length, {packed_validity_bitmap, data_buffer});
- return std::make_shared<arrow::matlab::array::proxy::NumericArray<CType>>(arrow::MakeArray(array_data));
+ auto numeric_array = std::static_pointer_cast<NumericArray>(arrow::MakeArray(array_data));
+ return std::make_shared<NumericArrayProxy>(std::move(numeric_array));
}
protected:
diff --git a/matlab/src/cpp/arrow/matlab/array/proxy/string_array.cc b/matlab/src/cpp/arrow/matlab/array/proxy/string_array.cc
index 51f39d72fc..2a11323a21 100644
--- a/matlab/src/cpp/arrow/matlab/array/proxy/string_array.cc
+++ b/matlab/src/cpp/arrow/matlab/array/proxy/string_array.cc
@@ -26,6 +26,9 @@
namespace arrow::matlab::array::proxy {
+ StringArray::StringArray(const std::shared_ptr<arrow::StringArray> string_array)
+ : arrow::matlab::array::proxy::Array(std::move(string_array)) {}
+
libmexclass::proxy::MakeResult StringArray::make(const libmexclass::proxy::FunctionArguments& constructor_arguments) {
namespace mda = ::matlab::data;
@@ -53,8 +56,8 @@ namespace arrow::matlab::array::proxy {
arrow::StringBuilder builder;
MATLAB_ERROR_IF_NOT_OK(builder.AppendValues(strings, unpacked_validity_bitmap_ptr), error::STRING_BUILDER_APPEND_FAILED);
MATLAB_ASSIGN_OR_ERROR(auto array, builder.Finish(), error::STRING_BUILDER_FINISH_FAILED);
-
- return std::make_shared<arrow::matlab::array::proxy::StringArray>(array);
+ auto typed_array = std::static_pointer_cast<arrow::StringArray>(array);
+ return std::make_shared<arrow::matlab::array::proxy::StringArray>(std::move(typed_array));
}
void StringArray::toMATLAB(libmexclass::proxy::method::Context& context) {
diff --git a/matlab/src/cpp/arrow/matlab/array/proxy/string_array.h b/matlab/src/cpp/arrow/matlab/array/proxy/string_array.h
index de0c462592..bdcfedd7cd 100644
--- a/matlab/src/cpp/arrow/matlab/array/proxy/string_array.h
+++ b/matlab/src/cpp/arrow/matlab/array/proxy/string_array.h
@@ -21,15 +21,14 @@
#include "libmexclass/proxy/Proxy.h"
+#include "arrow/type_fwd.h"
+
namespace arrow::matlab::array::proxy {
class StringArray : public arrow::matlab::array::proxy::Array {
public:
- StringArray(const std::shared_ptr<arrow::Array> string_array)
- : arrow::matlab::array::proxy::Array() {
- array = string_array;
- }
-
+ StringArray(const std::shared_ptr<arrow::StringArray> string_array);
+
static libmexclass::proxy::MakeResult make(const libmexclass::proxy::FunctionArguments& constructor_arguments);
protected:
diff --git a/matlab/src/cpp/arrow/matlab/array/proxy/timestamp_array.cc b/matlab/src/cpp/arrow/matlab/array/proxy/timestamp_array.cc
index 3b19daec58..17a86e848a 100644
--- a/matlab/src/cpp/arrow/matlab/array/proxy/timestamp_array.cc
+++ b/matlab/src/cpp/arrow/matlab/array/proxy/timestamp_array.cc
@@ -20,24 +20,22 @@
#include "arrow/matlab/error/error.h"
#include "arrow/matlab/bit/pack.h"
#include "arrow/matlab/bit/unpack.h"
+#include "arrow/matlab/buffer/matlab_buffer.h"
#include "arrow/matlab/type/time_unit.h"
#include "arrow/util/utf8.h"
#include "arrow/type.h"
-#include "arrow/builder.h"
-
namespace arrow::matlab::array::proxy {
- namespace {
- const uint8_t* getUnpackedValidityBitmap(const ::matlab::data::TypedArray<bool>& valid_elements) {
- const auto valid_elements_iterator(valid_elements.cbegin());
- return reinterpret_cast<const uint8_t*>(valid_elements_iterator.operator->());
- }
- } // anonymous namespace
+ TimestampArray::TimestampArray(std::shared_ptr<arrow::TimestampArray> array)
+ : arrow::matlab::array::proxy::Array{std::move(array)} {}
libmexclass::proxy::MakeResult TimestampArray::make(const libmexclass::proxy::FunctionArguments& constructor_arguments) {
namespace mda = ::matlab::data;
+ using MatlabBuffer = arrow::matlab::buffer::MatlabBuffer;
+ using TimestampArray = arrow::TimestampArray;
+ using TimestampArrayProxy = arrow::matlab::array::proxy::TimestampArray;
mda::StructArray opts = constructor_arguments[0];
@@ -49,32 +47,31 @@ namespace arrow::matlab::array::proxy {
const mda::TypedArray<mda::MATLABString> units_mda = opts[0]["TimeUnit"];
// extract the time zone string
- const std::u16string& utf16_timezone = timezone_mda[0];
- MATLAB_ASSIGN_OR_ERROR(const auto timezone, arrow::util::UTF16StringToUTF8(utf16_timezone),
+ const std::u16string& u16_timezone = timezone_mda[0];
+ MATLAB_ASSIGN_OR_ERROR(const auto timezone,
+ arrow::util::UTF16StringToUTF8(u16_timezone),
error::UNICODE_CONVERSION_ERROR_ID);
// extract the time unit
- const std::u16string& utf16_unit = units_mda[0];
- MATLAB_ASSIGN_OR_ERROR(const auto time_unit, arrow::matlab::type::timeUnitFromString(utf16_unit),
- error::UKNOWN_TIME_UNIT_ERROR_ID);
+ const std::u16string& u16_timeunit = units_mda[0];
+ MATLAB_ASSIGN_OR_ERROR(const auto time_unit,
+ arrow::matlab::type::timeUnitFromString(u16_timeunit),
+ error::UKNOWN_TIME_UNIT_ERROR_ID)
// create the timestamp_type
auto data_type = arrow::timestamp(time_unit, timezone);
- arrow::TimestampBuilder builder(data_type, arrow::default_memory_pool());
+ auto array_length = static_cast<int64_t>(timestamp_mda.getNumberOfElements()); // cast size_t to int64_t
- // Get raw pointer of mxArray
- auto it(timestamp_mda.cbegin());
- auto dt = it.operator->();
+ auto data_buffer = std::make_shared<MatlabBuffer>(timestamp_mda);
// Pack the validity bitmap values.
- const uint8_t* valid_mask = getUnpackedValidityBitmap(validity_bitmap_mda);
- const auto num_elements = timestamp_mda.getNumberOfElements();
-
- // Append values
- MATLAB_ERROR_IF_NOT_OK(builder.AppendValues(dt, num_elements, valid_mask), error::APPEND_VALUES_ERROR_ID);
- MATLAB_ASSIGN_OR_ERROR(auto timestamp_array, builder.Finish(), error::BUILD_ARRAY_ERROR_ID);
+ MATLAB_ASSIGN_OR_ERROR(auto packed_validity_bitmap,
+ bit::packValid(validity_bitmap_mda),
+ error::BITPACK_VALIDITY_BITMAP_ERROR_ID);
- return std::make_shared<arrow::matlab::array::proxy::TimestampArray>(timestamp_array);
+ auto array_data = arrow::ArrayData::Make(data_type, array_length, {packed_validity_bitmap, data_buffer});
+ auto timestamp_array = std::static_pointer_cast<TimestampArray>(arrow::MakeArray(array_data));
+ return std::make_shared<TimestampArrayProxy>(std::move(timestamp_array));
}
void TimestampArray::toMATLAB(libmexclass::proxy::method::Context& context) {
diff --git a/matlab/src/cpp/arrow/matlab/array/proxy/timestamp_array.h b/matlab/src/cpp/arrow/matlab/array/proxy/timestamp_array.h
index ec67245564..8f28d6165e 100644
--- a/matlab/src/cpp/arrow/matlab/array/proxy/timestamp_array.h
+++ b/matlab/src/cpp/arrow/matlab/array/proxy/timestamp_array.h
@@ -23,19 +23,17 @@
#include "libmexclass/proxy/Proxy.h"
+#include "arrow/type_fwd.h"
+
namespace arrow::matlab::array::proxy {
class TimestampArray : public arrow::matlab::array::proxy::Array {
public:
- TimestampArray(const std::shared_ptr<arrow::Array> timestamp_array)
- : arrow::matlab::array::proxy::Array() {
- array = timestamp_array;
- }
+ TimestampArray(std::shared_ptr<arrow::TimestampArray> array);
static libmexclass::proxy::MakeResult make(const libmexclass::proxy::FunctionArguments& constructor_arguments);
protected:
-
void toMATLAB(libmexclass::proxy::method::Context& context) override;
};
diff --git a/matlab/src/cpp/arrow/matlab/array/proxy/array.h b/matlab/src/cpp/arrow/matlab/buffer/matlab_buffer.h
similarity index 50%
copy from matlab/src/cpp/arrow/matlab/array/proxy/array.h
copy to matlab/src/cpp/arrow/matlab/buffer/matlab_buffer.h
index 94fad75975..80b237544d 100644
--- a/matlab/src/cpp/arrow/matlab/array/proxy/array.h
+++ b/matlab/src/cpp/arrow/matlab/buffer/matlab_buffer.h
@@ -17,31 +17,32 @@
#pragma once
-#include "arrow/array.h"
+#include "arrow/buffer.h"
-#include "libmexclass/proxy/Proxy.h"
+#include "MatlabDataArray.hpp"
-namespace arrow::matlab::array::proxy {
+namespace arrow::matlab::buffer {
-class Array : public libmexclass::proxy::Proxy {
+ namespace mda = ::matlab::data;
+
+ class MatlabBuffer : public arrow::Buffer {
public:
- Array();
- virtual ~Array() {}
-
- std::shared_ptr<arrow::Array> getArray();
-
- protected:
-
- void toString(libmexclass::proxy::method::Context& context);
-
- void length(libmexclass::proxy::method::Context& context);
-
- void valid(libmexclass::proxy::method::Context& context);
-
- virtual void toMATLAB(libmexclass::proxy::method::Context& context) = 0;
-
- std::shared_ptr<arrow::Array> array;
-};
-
-}
+ template<typename CType>
+ MatlabBuffer(const mda::TypedArray<CType> typed_array)
+ : arrow::Buffer{nullptr, 0}
+ , array{typed_array} {
+
+ // Get raw pointer of mxArray
+ auto it(typed_array.cbegin());
+ auto dt = it.operator->();
+
+ data_ = reinterpret_cast<const uint8_t*>(dt);
+ size_ = sizeof(CType) * static_cast<int64_t>(typed_array.getNumberOfElements());
+ capacity_ = size_;
+ is_mutable_ = false;
+ }
+ private:
+ const mda::Array array;
+ };
+}
\ No newline at end of file
diff --git a/matlab/src/matlab/+arrow/+array/NumericArray.m b/matlab/src/matlab/+arrow/+array/NumericArray.m
index fa692724c6..fb2fc1d333 100644
--- a/matlab/src/matlab/+arrow/+array/NumericArray.m
+++ b/matlab/src/matlab/+arrow/+array/NumericArray.m
@@ -15,11 +15,6 @@
classdef NumericArray < arrow.array.Array
% arrow.array.NumericArray
-
-
- properties (Hidden, SetAccess=protected)
- MatlabArray = []
- end
properties(Abstract, Access=protected)
NullSubstitutionValue;
@@ -38,9 +33,6 @@ classdef NumericArray < arrow.array.Array
validElements = arrow.args.parseValidElements(data, opts);
opts = struct(MatlabArray=data, Valid=validElements);
obj@arrow.array.Array("Name", proxyName, "ConstructorArguments", {opts});
- obj.MatlabArray = cast(obj.MatlabArray, type);
- % Store a reference to the array
- obj.MatlabArray = data;
end
function matlabArray = toMATLAB(obj)
diff --git a/matlab/test/arrow/array/hNumericArray.m b/matlab/test/arrow/array/hNumericArray.m
index 69d77c5394..f9f5f1d9e4 100644
--- a/matlab/test/arrow/array/hNumericArray.m
+++ b/matlab/test/arrow/array/hNumericArray.m
@@ -43,14 +43,6 @@ classdef hNumericArray < matlab.unittest.TestCase
tc.verifyEqual(className, tc.ArrowArrayClassName);
end
- function ShallowCopyTest(tc)
- % NumericArrays stores a shallow copy of the array keep the
- % memory alive.
- A = tc.ArrowArrayConstructor(tc.MatlabArrayFcn([1, 2, 3]));
- tc.verifyEqual(A.MatlabArray, tc.MatlabArrayFcn([1, 2, 3]));
- tc.verifyEqual(toMATLAB(A), tc.MatlabArrayFcn([1 2 3]'));
- end
-
function ToMATLAB(tc)
% Create array from a scalar
A1 = tc.ArrowArrayConstructor(tc.MatlabArrayFcn(100));
diff --git a/matlab/tools/cmake/BuildMatlabArrowInterface.cmake b/matlab/tools/cmake/BuildMatlabArrowInterface.cmake
index 1a049f47d1..41d2ee4a70 100644
--- a/matlab/tools/cmake/BuildMatlabArrowInterface.cmake
+++ b/matlab/tools/cmake/BuildMatlabArrowInterface.cmake
@@ -38,8 +38,8 @@ set(MATLAB_ARROW_LIBMEXCLASS_CLIENT_PROXY_INCLUDE_DIR "${CMAKE_SOURCE_DIR}/src/c
"${CMAKE_SOURCE_DIR}/src/cpp/arrow/matlab/bit"
"${CMAKE_SOURCE_DIR}/src/cpp/arrow/matlab/error"
"${CMAKE_SOURCE_DIR}/src/cpp/arrow/matlab/type"
- "${CMAKE_SOURCE_DIR}/src/cpp/arrow/matlab/type/proxy")
-
+ "${CMAKE_SOURCE_DIR}/src/cpp/arrow/matlab/type/proxy"
+ "${CMAKE_SOURCE_DIR}/src/cpp/arrow/matlab/buffer")
set(MATLAB_ARROW_LIBMEXCLASS_CLIENT_PROXY_SOURCES "${CMAKE_SOURCE_DIR}/src/cpp/arrow/matlab/array/proxy/array.cc"
"${CMAKE_SOURCE_DIR}/src/cpp/arrow/matlab/array/proxy/boolean_array.cc"