/* Copyright 2017 The MathWorks, Inc. */ #ifndef __MEX_IO_ADAPTER_HPP__ #define __MEX_IO_ADAPTER_HPP__ #include "MatlabDataArray.hpp" #include #include "assert.h" namespace matlab { namespace mex { template class MexIORange { iterator_type begin_; iterator_type end_; size_t size_; public: MexIORange(iterator_type b, iterator_type e, size_t size) : begin_(b), end_(e), size_(size) {} size_t size() { return size_; } typename std::iterator_traits::difference_type internal_size() { return std::distance(begin_, end_); } iterator_type begin() { return begin_; } iterator_type end() { return end_; } bool empty() { return size() == 0; } typename std::iterator_traits::reference operator[](size_t i) { if (static_cast(i) + 1 > internal_size()) throw matlab::engine::Exception("ArgumentList index out of range."); return *(begin_ + i); } }; } } matlab::data::Array getArray(void* v) { matlab::data::impl::ArrayImpl* impl = reinterpret_cast(v); if (impl == nullptr) return matlab::data::Array(); return matlab::data::detail::Access::createObj(impl); } void implToArray(int na, void* va[], std::vector& pa) { assert(na == static_cast(pa.capacity())); for(int i = 0; i < na; i++) { matlab::data::impl::ArrayImpl* impl = reinterpret_cast(va[i]); pa.push_back(matlab::data::detail::Access::createObj(impl)); } } void arrayToImpl(int na, void* va[], const std::vector& pa) { for(int i = 0; i < na; i++) { va[i] = matlab::data::detail::Access::getImpl(pa[i]); } } void arrayToImplOutput(int nlhs, std::vector& edi_plhs, void (*callbackOutput)(int, void**)) { assert(nlhs == static_cast(edi_plhs.size())); std::unique_ptr vlhsPtr(new matlab::data::impl::ArrayImpl*[nlhs], [](matlab::data::impl::ArrayImpl** ptr) { delete[] ptr; }); void** vlhs = (void**)vlhsPtr.get(); arrayToImpl(nlhs, vlhs, edi_plhs); callbackOutput(nlhs, vlhs); } #endif