本文整理汇总了C++中ndt::type::get_base_id方法的典型用法代码示例。如果您正苦于以下问题:C++ type::get_base_id方法的具体用法?C++ type::get_base_id怎么用?C++ type::get_base_id使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类ndt::type
的用法示例。
在下文中一共展示了type::get_base_id方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: make_numpy_dtype_for_copy
//.........这里部分代码省略.........
// If this isn't one of the array dimensions, it maps into
// a numpy dtype with a shape
// Build up the shape of the array for NumPy
pyobject_ownref shape(PyList_New(0));
ndt::type element_tp = dt;
while (ndim > 0) {
const fixed_dim_type_arrmeta *am = reinterpret_cast<const fixed_dim_type_arrmeta *>(arrmeta);
intptr_t dim_size = am->dim_size;
element_tp = dt.extended<ndt::base_dim_type>()->get_element_type();
arrmeta += sizeof(fixed_dim_type_arrmeta);
--ndim;
if (PyList_Append(shape.get(), PyLong_FromSize_t(dim_size)) < 0) {
throw runtime_error("propagating python error");
}
}
// Get the numpy dtype of the element
pyobject_ownref child_numpy_dtype;
make_numpy_dtype_for_copy(&child_numpy_dtype, 0, element_tp, arrmeta);
// Create the result numpy dtype
pyobject_ownref tuple_obj(PyTuple_New(2));
PyTuple_SET_ITEM(tuple_obj.get(), 0, child_numpy_dtype.release());
PyTuple_SET_ITEM(tuple_obj.get(), 1, shape.release());
PyArray_Descr *result = NULL;
if (!PyArray_DescrConverter(tuple_obj, &result)) {
throw dynd::type_error("failed to convert dynd type into numpy subarray dtype");
}
// Put the final numpy dtype reference in the output
out_numpy_dtype->reset((PyObject *)result);
return;
}
break;
}
case struct_id: {
const ndt::struct_type *bs = dt.extended<ndt::struct_type>();
size_t field_count = bs->get_field_count();
pyobject_ownref names_obj(PyList_New(field_count));
for (size_t i = 0; i < field_count; ++i) {
const dynd::string &fn = bs->get_field_name(i);
#if PY_VERSION_HEX >= 0x03000000
pyobject_ownref name_str(PyUnicode_FromStringAndSize(fn.begin(), fn.end() - fn.begin()));
#else
pyobject_ownref name_str(PyString_FromStringAndSize(fn.begin(), fn.end() - fn.begin()));
#endif
PyList_SET_ITEM(names_obj.get(), i, name_str.release());
}
pyobject_ownref formats_obj(PyList_New(field_count));
pyobject_ownref offsets_obj(PyList_New(field_count));
size_t standard_offset = 0, standard_alignment = 1;
for (size_t i = 0; i < field_count; ++i) {
// Get the numpy dtype of the element
pyobject_ownref field_numpy_dtype;
make_numpy_dtype_for_copy(&field_numpy_dtype, 0, bs->get_field_type(i), arrmeta);
size_t field_alignment = ((PyArray_Descr *)field_numpy_dtype.get())->alignment;
size_t field_size = ((PyArray_Descr *)field_numpy_dtype.get())->elsize;
standard_offset = inc_to_alignment(standard_offset, field_alignment);
standard_alignment = max(standard_alignment, field_alignment);
PyList_SET_ITEM(formats_obj.get(), i, field_numpy_dtype.release());
PyList_SET_ITEM((PyObject *)offsets_obj, i, PyLong_FromSize_t(standard_offset));
standard_offset += field_size;
}
// Get the full element size
standard_offset = inc_to_alignment(standard_offset, standard_alignment);
pyobject_ownref itemsize_obj(PyLong_FromSize_t(standard_offset));
pyobject_ownref dict_obj(PyDict_New());
PyDict_SetItemString(dict_obj, "names", names_obj);
PyDict_SetItemString(dict_obj, "formats", formats_obj);
PyDict_SetItemString(dict_obj, "offsets", offsets_obj);
PyDict_SetItemString(dict_obj, "itemsize", itemsize_obj);
PyArray_Descr *result = NULL;
if (!PyArray_DescrAlignConverter(dict_obj, &result)) {
stringstream ss;
ss << "failed to convert dynd type " << dt << " into numpy dtype via dict";
throw dynd::type_error(ss.str());
}
out_numpy_dtype->reset((PyObject *)result);
return;
}
default: {
break;
}
}
if (dt.get_base_id() == expr_kind_id) {
// Convert the value type for the copy
make_numpy_dtype_for_copy(out_numpy_dtype, ndim, dt.value_type(), NULL);
return;
}
// Anything which fell through is an error
stringstream ss;
ss << "dynd as_numpy could not convert dynd type ";
ss << dt;
ss << " to a numpy dtype";
throw dynd::type_error(ss.str());
}
示例2: as_numpy_analysis
//.........这里部分代码省略.........
if (*out_requires_copy) {
// If the child required a copy, stop right away
out_numpy_dtype->clear();
return;
}
// Create the result numpy dtype
pyobject_ownref tuple_obj(PyTuple_New(2));
PyTuple_SET_ITEM(tuple_obj.get(), 0, child_numpy_dtype.release());
PyTuple_SET_ITEM(tuple_obj.get(), 1, shape.release());
PyArray_Descr *result = NULL;
if (!PyArray_DescrConverter(tuple_obj, &result)) {
throw dynd::type_error(
"failed to convert dynd type into numpy subarray dtype");
}
// Put the final numpy dtype reference in the output
out_numpy_dtype->reset((PyObject *)result);
return;
}
break;
}
*/
case struct_id: {
if (dt.get_id() == struct_id && arrmeta == NULL) {
// If it's a struct type with no arrmeta, a copy is required
out_numpy_dtype->clear();
*out_requires_copy = true;
return;
}
const ndt::struct_type *bs = dt.extended<ndt::struct_type>();
const uintptr_t *offsets = reinterpret_cast<const uintptr_t *>(arrmeta);
size_t field_count = bs->get_field_count();
pyobject_ownref names_obj(PyList_New(field_count));
for (size_t i = 0; i < field_count; ++i) {
const dynd::string &fn = bs->get_field_name(i);
#if PY_VERSION_HEX >= 0x03000000
pyobject_ownref name_str(PyUnicode_FromStringAndSize(fn.begin(), fn.end() - fn.begin()));
#else
pyobject_ownref name_str(PyString_FromStringAndSize(fn.begin(), fn.end() - fn.begin()));
#endif
PyList_SET_ITEM(names_obj.get(), i, name_str.release());
}
pyobject_ownref formats_obj(PyList_New(field_count));
for (size_t i = 0; i < field_count; ++i) {
// Get the numpy dtype of the element
pyobject_ownref field_numpy_dtype;
as_numpy_analysis(&field_numpy_dtype, out_requires_copy, 0, bs->get_field_type(i), arrmeta);
if (*out_requires_copy) {
// If the field required a copy, stop right away
out_numpy_dtype->clear();
return;
}
PyList_SET_ITEM(formats_obj.get(), i, field_numpy_dtype.release());
}
pyobject_ownref offsets_obj(PyList_New(field_count));
for (size_t i = 0; i < field_count; ++i) {
PyList_SET_ITEM((PyObject *)offsets_obj, i, PyLong_FromSize_t(offsets[i]));
}
pyobject_ownref dict_obj(PyDict_New());
PyDict_SetItemString(dict_obj, "names", names_obj);
PyDict_SetItemString(dict_obj, "formats", formats_obj);
PyDict_SetItemString(dict_obj, "offsets", offsets_obj);
if (dt.get_data_size() > 0) {
pyobject_ownref itemsize_obj(PyLong_FromSize_t(dt.get_data_size()));
PyDict_SetItemString(dict_obj, "itemsize", itemsize_obj);
}
PyArray_Descr *result = NULL;
if (!PyArray_DescrConverter(dict_obj, &result)) {
stringstream ss;
ss << "failed to convert dynd type " << dt << " into numpy dtype via dict";
throw dynd::type_error(ss.str());
}
out_numpy_dtype->reset((PyObject *)result);
return;
}
default: {
break;
}
}
if (dt.get_base_id() == expr_kind_id) {
// If none of the prior checks caught this expression,
// a copy is required.
out_numpy_dtype->clear();
*out_requires_copy = true;
return;
}
// Anything which fell through is an error
stringstream ss;
ss << "dynd as_numpy could not convert dynd type ";
ss << dt;
ss << " to a numpy dtype";
throw dynd::type_error(ss.str());
}