77namespace jlcxx
88{
99
10+ // / wrapper for julia jl_array_data for different julia versions
11+ template <typename T>
12+ T* jlcxx_array_data (jl_array_t * arr) {
13+ #if (JULIA_VERSION_MAJOR * 100 + JULIA_VERSION_MINOR) >= 111
14+ return jl_array_data (arr, T);
15+ #else
16+ return static_cast <T*>(jl_array_data (arr));
17+ #endif
18+ }
19+
1020template <typename PointedT, typename CppT>
1121struct ValueExtractor
1222{
@@ -121,9 +131,8 @@ class Array
121131 void push_back (VT&& val)
122132 {
123133 JL_GC_PUSH1 (&m_array);
124- const size_t pos = jl_array_len (m_array);
125- jl_array_grow_end (m_array, 1 );
126- jl_arrayset (m_array, box<ValueT>(val), pos);
134+ jl_value_t * jval = box<ValueT>(val);
135+ jl_array_ptr_1d_push (m_array, jval);
127136 JL_GC_POP ();
128137 }
129138
@@ -165,7 +174,6 @@ template<typename ValueT, int Dim = 1>
165174class ArrayRef
166175{
167176public:
168-
169177 using julia_t = typename detail::ArrayElementType<ValueT>::type;
170178
171179 ArrayRef (jl_array_t * arr) : m_array(arr)
@@ -191,22 +199,22 @@ class ArrayRef
191199
192200 iterator begin ()
193201 {
194- return iterator (static_cast <julia_t *>( jl_array_data ( wrapped () )));
202+ return iterator (jlcxx_array_data <julia_t >( wrapped ()));
195203 }
196204
197205 const_iterator begin () const
198206 {
199- return const_iterator (static_cast <julia_t *>( jl_array_data ( wrapped () )));
207+ return const_iterator (jlcxx_array_data <julia_t >( wrapped ()));
200208 }
201209
202210 iterator end ()
203211 {
204- return iterator (static_cast <julia_t *>( jl_array_data ( wrapped () )) + jl_array_len (wrapped ()));
212+ return iterator (jlcxx_array_data <julia_t >( wrapped ()) + jl_array_len (wrapped ()));
205213 }
206214
207215 const_iterator end () const
208216 {
209- return const_iterator (static_cast <julia_t *>( jl_array_data ( wrapped () )) + jl_array_len (wrapped ()));
217+ return const_iterator (jlcxx_array_data <julia_t >( wrapped ()) + jl_array_len (wrapped ()));
210218 }
211219
212220 void push_back (const ValueT& val)
@@ -217,18 +225,18 @@ class ArrayRef
217225 JL_GC_PUSH1 (&arr_ptr);
218226 const size_t pos = size ();
219227 jl_array_grow_end (arr_ptr, 1 );
220- jl_arrayset (arr_ptr, box<ValueT>(val), pos) ;
228+ data ()[ pos] = val ;
221229 JL_GC_POP ();
222230 }
223231
224232 const julia_t * data () const
225233 {
226- return ( julia_t *) jl_array_data (wrapped ());
234+ return jlcxx_array_data< julia_t > (wrapped ());
227235 }
228236
229237 julia_t * data ()
230238 {
231- return ( julia_t *) jl_array_data (wrapped ());
239+ return jlcxx_array_data< julia_t > (wrapped ());
232240 }
233241
234242 std::size_t size () const
0 commit comments