Skip to content

Commit 9bd8afb

Browse files
committed
Merge pull request #693 from izaid/type
Made assign_kernel templated on types
2 parents 661e867 + 6d49c8c commit 9bd8afb

3 files changed

Lines changed: 115 additions & 113 deletions

File tree

dynd/include/callables/assign_from_pyobject_callable.hpp

Lines changed: 55 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,24 @@ using namespace dynd;
88
namespace pydynd {
99
namespace nd {
1010

11-
template <type_id_t ResID>
11+
template <typename ReturnType>
1212
class assign_from_pyobject_callable
13-
: public dynd::nd::default_instantiable_callable<assign_from_pyobject_kernel<ResID>> {
13+
: public dynd::nd::default_instantiable_callable<assign_from_pyobject_kernel<ReturnType>> {
1414
public:
1515
assign_from_pyobject_callable()
16-
: dynd::nd::default_instantiable_callable<assign_from_pyobject_kernel<ResID>>(
17-
dynd::ndt::make_type<dynd::ndt::callable_type>(ResID, {dynd::ndt::make_type<pyobject_type>()}))
16+
: dynd::nd::default_instantiable_callable<assign_from_pyobject_kernel<ReturnType>>(
17+
dynd::ndt::make_type<dynd::ndt::callable_type>(ndt::make_type<ReturnType>(),
18+
{dynd::ndt::make_type<pyobject_type>()}))
1819
{
1920
}
2021
};
2122

2223
template <>
23-
class assign_from_pyobject_callable<bytes_id> : public dynd::nd::base_callable {
24+
class assign_from_pyobject_callable<bytes> : public dynd::nd::base_callable {
2425
public:
2526
assign_from_pyobject_callable()
26-
: dynd::nd::base_callable(
27-
dynd::ndt::make_type<dynd::ndt::callable_type>(bytes_id, {dynd::ndt::make_type<pyobject_type>()}))
27+
: dynd::nd::base_callable(dynd::ndt::make_type<dynd::ndt::callable_type>(
28+
ndt::make_type<bytes>(), {dynd::ndt::make_type<pyobject_type>()}))
2829
{
2930
}
3031

@@ -50,11 +51,11 @@ namespace nd {
5051
};
5152

5253
template <>
53-
class assign_from_pyobject_callable<fixed_bytes_id> : public dynd::nd::base_callable {
54+
class assign_from_pyobject_callable<ndt::fixed_bytes_type> : public dynd::nd::base_callable {
5455
public:
5556
assign_from_pyobject_callable()
56-
: dynd::nd::base_callable(
57-
dynd::ndt::make_type<dynd::ndt::callable_type>(fixed_bytes_id, {dynd::ndt::make_type<pyobject_type>()}))
57+
: dynd::nd::base_callable(dynd::ndt::make_type<dynd::ndt::callable_type>(
58+
ndt::make_type<ndt::fixed_bytes_kind_type>(), {dynd::ndt::make_type<pyobject_type>()}))
5859
{
5960
}
6061

@@ -66,19 +67,19 @@ namespace nd {
6667
{
6768
cg.emplace_back([dst_tp](dynd::nd::kernel_builder &kb, dynd::kernel_request_t kernreq, char *DYND_UNUSED(data),
6869
const char *dst_arrmeta, size_t nsrc, const char *const *src_arrmeta) {
69-
kb.emplace_back<assign_from_pyobject_kernel<fixed_bytes_id>>(kernreq, dst_tp, dst_arrmeta);
70+
kb.emplace_back<assign_from_pyobject_kernel<ndt::fixed_bytes_type>>(kernreq, dst_tp, dst_arrmeta);
7071
});
7172

7273
return dst_tp;
7374
}
7475
};
7576

7677
template <>
77-
class assign_from_pyobject_callable<string_id> : public dynd::nd::base_callable {
78+
class assign_from_pyobject_callable<string> : public dynd::nd::base_callable {
7879
public:
7980
assign_from_pyobject_callable()
80-
: dynd::nd::base_callable(
81-
dynd::ndt::make_type<dynd::ndt::callable_type>(string_id, {dynd::ndt::make_type<pyobject_type>()}))
81+
: dynd::nd::base_callable(dynd::ndt::make_type<dynd::ndt::callable_type>(
82+
ndt::make_type<string>(), {dynd::ndt::make_type<pyobject_type>()}))
8283
{
8384
}
8485

@@ -90,19 +91,19 @@ namespace nd {
9091
{
9192
cg.emplace_back([dst_tp](dynd::nd::kernel_builder &kb, dynd::kernel_request_t kernreq, char *DYND_UNUSED(data),
9293
const char *dst_arrmeta, size_t nsrc, const char *const *src_arrmeta) {
93-
kb.emplace_back<assign_from_pyobject_kernel<string_id>>(kernreq, dst_tp, dst_arrmeta);
94+
kb.emplace_back<assign_from_pyobject_kernel<dynd::string>>(kernreq, dst_tp, dst_arrmeta);
9495
});
9596

9697
return dst_tp;
9798
}
9899
};
99100

100101
template <>
101-
class assign_from_pyobject_callable<fixed_string_id> : public dynd::nd::base_callable {
102+
class assign_from_pyobject_callable<ndt::fixed_string_type> : public dynd::nd::base_callable {
102103
public:
103104
assign_from_pyobject_callable()
104-
: dynd::nd::base_callable(
105-
dynd::ndt::make_type<dynd::ndt::callable_type>(fixed_string_id, {dynd::ndt::make_type<pyobject_type>()}))
105+
: dynd::nd::base_callable(dynd::ndt::make_type<dynd::ndt::callable_type>(
106+
ndt::make_type<ndt::fixed_string_kind_type>(), {dynd::ndt::make_type<pyobject_type>()}))
106107
{
107108
}
108109

@@ -115,19 +116,20 @@ namespace nd {
115116
cg.emplace_back([dst_tp](dynd::nd::kernel_builder &kb, dynd::kernel_request_t kernreq, char *DYND_UNUSED(data),
116117
const char *dst_arrmeta, size_t DYND_UNUSED(nsrc),
117118
const char *const *DYND_UNUSED(src_arrmeta)) {
118-
kb.emplace_back<assign_from_pyobject_kernel<fixed_string_id>>(kernreq, dst_tp, dst_arrmeta);
119+
kb.emplace_back<assign_from_pyobject_kernel<dynd::ndt::fixed_string_type>>(kernreq, dst_tp, dst_arrmeta);
119120
});
120121

121122
return dst_tp;
122123
}
123124
};
124125

125126
template <>
126-
class assign_from_pyobject_callable<option_id> : public dynd::nd::base_callable {
127+
class assign_from_pyobject_callable<ndt::option_type> : public dynd::nd::base_callable {
127128
public:
128129
assign_from_pyobject_callable()
129-
: dynd::nd::base_callable(
130-
dynd::ndt::make_type<dynd::ndt::callable_type>(option_id, {dynd::ndt::make_type<pyobject_type>()}))
130+
: dynd::nd::base_callable(dynd::ndt::make_type<dynd::ndt::callable_type>(
131+
ndt::make_type<ndt::option_type>(ndt::make_type<ndt::any_kind_type>()),
132+
{dynd::ndt::make_type<pyobject_type>()}))
131133
{
132134
}
133135

@@ -138,12 +140,12 @@ namespace nd {
138140
cg.emplace_back([dst_tp](dynd::nd::kernel_builder &kb, dynd::kernel_request_t kernreq, char *DYND_UNUSED(data),
139141
const char *dst_arrmeta, size_t nsrc, const char *const *src_arrmeta) {
140142
intptr_t root_ckb_offset = kb.size();
141-
kb.emplace_back<assign_from_pyobject_kernel<option_id>>(kernreq, dst_tp, dst_arrmeta);
143+
kb.emplace_back<assign_from_pyobject_kernel<dynd::ndt::option_type>>(kernreq, dst_tp, dst_arrmeta);
142144
intptr_t ckb_offset = kb.size();
143145
kb(dynd::kernel_request_single, nullptr, dst_arrmeta, nsrc, nullptr);
144146

145147
ckb_offset = kb.size();
146-
kb.get_at<assign_from_pyobject_kernel<option_id>>(root_ckb_offset)->copy_value_offset =
148+
kb.get_at<assign_from_pyobject_kernel<ndt::option_type>>(root_ckb_offset)->copy_value_offset =
147149
ckb_offset - root_ckb_offset;
148150
kb(dynd::kernel_request_single, nullptr, dst_arrmeta, nsrc, src_arrmeta);
149151

@@ -181,11 +183,11 @@ namespace nd {
181183
};
182184

183185
template <>
184-
class assign_from_pyobject_callable<tuple_id> : public dynd::nd::base_callable {
186+
class assign_from_pyobject_callable<ndt::tuple_type> : public dynd::nd::base_callable {
185187
public:
186188
assign_from_pyobject_callable()
187-
: dynd::nd::base_callable(
188-
dynd::ndt::make_type<dynd::ndt::callable_type>(tuple_id, {dynd::ndt::make_type<pyobject_type>()}))
189+
: dynd::nd::base_callable(dynd::ndt::make_type<dynd::ndt::callable_type>(
190+
ndt::make_type<ndt::tuple_type>(), {dynd::ndt::make_type<pyobject_type>()}))
189191
{
190192
}
191193

@@ -203,16 +205,17 @@ namespace nd {
203205
const char *dst_arrmeta, size_t nsrc, const char *const *src_arrmeta) {
204206
intptr_t ckb_offset = kb.size();
205207
intptr_t root_ckb_offset = ckb_offset;
206-
kb.emplace_back<assign_from_pyobject_kernel<tuple_id>>(kernreq);
207-
assign_from_pyobject_kernel<tuple_id> *self = kb.get_at<assign_from_pyobject_kernel<tuple_id>>(root_ckb_offset);
208+
kb.emplace_back<assign_from_pyobject_kernel<ndt::tuple_type>>(kernreq);
209+
assign_from_pyobject_kernel<ndt::tuple_type> *self =
210+
kb.get_at<assign_from_pyobject_kernel<ndt::tuple_type>>(root_ckb_offset);
208211
ckb_offset = kb.size();
209212
self->m_dst_tp = dst_tp;
210213
self->m_dst_arrmeta = dst_arrmeta;
211214
self->m_dim_broadcast = false;
212215
self->m_copy_el_offsets.resize(field_count);
213216
for (intptr_t i = 0; i < field_count; ++i) {
214217
kb.reserve(ckb_offset);
215-
self = kb.get_at<assign_from_pyobject_kernel<tuple_id>>(root_ckb_offset);
218+
self = kb.get_at<assign_from_pyobject_kernel<ndt::tuple_type>>(root_ckb_offset);
216219
self->m_copy_el_offsets[i] = ckb_offset - root_ckb_offset;
217220
const char *field_arrmeta = dst_arrmeta + arrmeta_offsets[i];
218221
kb(dynd::kernel_request_single, nullptr, field_arrmeta, nsrc, src_arrmeta);
@@ -263,11 +266,11 @@ namespace nd {
263266
};
264267

265268
template <>
266-
class assign_from_pyobject_callable<struct_id> : public dynd::nd::base_callable {
269+
class assign_from_pyobject_callable<ndt::struct_type> : public dynd::nd::base_callable {
267270
public:
268271
assign_from_pyobject_callable()
269-
: dynd::nd::base_callable(
270-
dynd::ndt::make_type<dynd::ndt::callable_type>(struct_id, {dynd::ndt::make_type<pyobject_type>()}))
272+
: dynd::nd::base_callable(dynd::ndt::make_type<dynd::ndt::callable_type>(
273+
ndt::make_type<ndt::struct_type>(), {dynd::ndt::make_type<pyobject_type>()}))
271274
{
272275
}
273276

@@ -286,10 +289,10 @@ namespace nd {
286289
intptr_t ckb_offset = kb.size();
287290
intptr_t root_ckb_offset = ckb_offset;
288291

289-
kb.emplace_back<assign_from_pyobject_kernel<struct_id>>(kernreq);
292+
kb.emplace_back<assign_from_pyobject_kernel<ndt::struct_type>>(kernreq);
290293

291-
assign_from_pyobject_kernel<struct_id> *self =
292-
kb.get_at<assign_from_pyobject_kernel<struct_id>>(root_ckb_offset);
294+
assign_from_pyobject_kernel<ndt::struct_type> *self =
295+
kb.get_at<assign_from_pyobject_kernel<ndt::struct_type>>(root_ckb_offset);
293296
ckb_offset = kb.size();
294297

295298
self->m_dst_tp = dst_tp;
@@ -299,7 +302,7 @@ namespace nd {
299302

300303
for (intptr_t i = 0; i < field_count; ++i) {
301304
kb.reserve(ckb_offset);
302-
self = kb.get_at<assign_from_pyobject_kernel<struct_id>>(root_ckb_offset);
305+
self = kb.get_at<assign_from_pyobject_kernel<ndt::struct_type>>(root_ckb_offset);
303306
self->m_copy_el_offsets[i] = ckb_offset - root_ckb_offset;
304307
const char *field_arrmeta = dst_arrmeta + arrmeta_offsets[i];
305308
kb(dynd::kernel_request_single, nullptr, field_arrmeta, nsrc, src_arrmeta);
@@ -350,11 +353,11 @@ namespace nd {
350353
};
351354

352355
template <>
353-
class assign_from_pyobject_callable<fixed_dim_id> : public dynd::nd::base_callable {
356+
class assign_from_pyobject_callable<ndt::fixed_dim_type> : public dynd::nd::base_callable {
354357
public:
355358
assign_from_pyobject_callable()
356-
: dynd::nd::base_callable(
357-
dynd::ndt::make_type<dynd::ndt::callable_type>(fixed_dim_id, {dynd::ndt::make_type<pyobject_type>()}))
359+
: dynd::nd::base_callable(dynd::ndt::make_type<dynd::ndt::callable_type>(
360+
ndt::type("Fixed * Any"), {dynd::ndt::make_type<pyobject_type>()}))
358361
{
359362
}
360363

@@ -372,10 +375,10 @@ namespace nd {
372375

373376
intptr_t ckb_offset = kb.size();
374377
intptr_t root_ckb_offset = ckb_offset;
375-
kb.emplace_back<assign_from_pyobject_kernel<fixed_dim_id>>(kernreq);
378+
kb.emplace_back<assign_from_pyobject_kernel<ndt::fixed_dim_type>>(kernreq);
376379

377-
assign_from_pyobject_kernel<fixed_dim_id> *self =
378-
kb.get_at<assign_from_pyobject_kernel<fixed_dim_id>>(root_ckb_offset);
380+
assign_from_pyobject_kernel<ndt::fixed_dim_type> *self =
381+
kb.get_at<assign_from_pyobject_kernel<ndt::fixed_dim_type>>(root_ckb_offset);
379382
ckb_offset = kb.size();
380383
self->m_dim_size = dim_size;
381384
self->m_stride = stride;
@@ -385,7 +388,7 @@ namespace nd {
385388
kb(dynd::kernel_request_strided, nullptr, el_arrmeta, nsrc, src_arrmeta);
386389

387390
ckb_offset = kb.size();
388-
self = kb.get_at<assign_from_pyobject_kernel<fixed_dim_id>>(root_ckb_offset);
391+
self = kb.get_at<assign_from_pyobject_kernel<ndt::fixed_dim_type>>(root_ckb_offset);
389392
self->m_copy_dst_offset = ckb_offset - root_ckb_offset;
390393
// dst to dst ckernel, for broadcasting case
391394
// dynd::nd::array error_mode = assign_error_fractional;
@@ -405,11 +408,12 @@ namespace nd {
405408
};
406409

407410
template <>
408-
class assign_from_pyobject_callable<var_dim_id> : public dynd::nd::base_callable {
411+
class assign_from_pyobject_callable<ndt::var_dim_type> : public dynd::nd::base_callable {
409412
public:
410413
assign_from_pyobject_callable()
411-
: dynd::nd::base_callable(
412-
dynd::ndt::make_type<dynd::ndt::callable_type>(var_dim_id, {dynd::ndt::make_type<pyobject_type>()}))
414+
: dynd::nd::base_callable(dynd::ndt::make_type<dynd::ndt::callable_type>(
415+
ndt::make_type<ndt::var_dim_type>(ndt::make_type<ndt::any_kind_type>()),
416+
{dynd::ndt::make_type<pyobject_type>()}))
413417
{
414418
}
415419

@@ -427,9 +431,9 @@ namespace nd {
427431
intptr_t ckb_offset = kb.size();
428432

429433
intptr_t root_ckb_offset = ckb_offset;
430-
kb.emplace_back<assign_from_pyobject_kernel<var_dim_id>>(kernreq);
431-
assign_from_pyobject_kernel<var_dim_id> *self =
432-
kb.get_at<assign_from_pyobject_kernel<var_dim_id>>(root_ckb_offset);
434+
kb.emplace_back<assign_from_pyobject_kernel<ndt::var_dim_type>>(kernreq);
435+
assign_from_pyobject_kernel<ndt::var_dim_type> *self =
436+
kb.get_at<assign_from_pyobject_kernel<ndt::var_dim_type>>(root_ckb_offset);
433437
ckb_offset = kb.size();
434438
self->m_offset = reinterpret_cast<const dynd::ndt::var_dim_type::metadata_type *>(dst_arrmeta)->offset;
435439
self->m_stride = reinterpret_cast<const dynd::ndt::var_dim_type::metadata_type *>(dst_arrmeta)->stride;
@@ -438,7 +442,7 @@ namespace nd {
438442
const char *el_arrmeta = dst_arrmeta + sizeof(dynd::ndt::var_dim_type::metadata_type);
439443
kb(dynd::kernel_request_strided, nullptr, el_arrmeta, nsrc, src_arrmeta);
440444
ckb_offset = kb.size();
441-
self = kb.get_at<assign_from_pyobject_kernel<var_dim_id>>(root_ckb_offset);
445+
self = kb.get_at<assign_from_pyobject_kernel<ndt::var_dim_type>>(root_ckb_offset);
442446
self->m_copy_dst_offset = ckb_offset - root_ckb_offset;
443447
// dst to dst ckernel, for broadcasting case
444448
// dynd::nd::array error_mode = assign_error_fractional;

0 commit comments

Comments
 (0)