Support advanced cbuffer layouts

* This includes 8/16/64-bit integers, 16-bit/64-bit floats, and scalar block
  packing
This commit is contained in:
baldurk
2019-02-06 13:18:32 +00:00
parent 134cdfd09b
commit fbb6b23b23
22 changed files with 1075 additions and 117 deletions
@@ -189,6 +189,27 @@ struct TypeConversion<uint8_t, false>
static PyObject *ConvertToPy(const uint8_t &in) { return PyLong_FromUnsignedLong(in); }
};
template <>
struct TypeConversion<int8_t, false>
{
static int ConvertFromPy(PyObject *in, int8_t &out)
{
if(!PyLong_Check(in))
return SWIG_TypeError;
uint32_t longval = PyLong_AsUnsignedLong(in);
if(PyErr_Occurred() || longval > 0xff)
return SWIG_OverflowError;
out = int8_t(longval & 0xff);
return SWIG_OK;
}
static PyObject *ConvertToPy(const int8_t &in) { return PyLong_FromLong(in); }
};
template <>
struct TypeConversion<uint16_t, false>
{
@@ -210,6 +231,27 @@ struct TypeConversion<uint16_t, false>
static PyObject *ConvertToPy(const uint16_t &in) { return PyLong_FromUnsignedLong(in); }
};
template <>
struct TypeConversion<int16_t, false>
{
static int ConvertFromPy(PyObject *in, int16_t &out)
{
if(!PyLong_Check(in))
return SWIG_TypeError;
uint32_t longval = PyLong_AsLong(in);
if(PyErr_Occurred() || longval > 0xffff)
return SWIG_OverflowError;
out = int16_t(longval & 0xff);
return SWIG_OK;
}
static PyObject *ConvertToPy(const int16_t &in) { return PyLong_FromLong(in); }
};
template <>
struct TypeConversion<uint32_t, false>
{
@@ -267,6 +309,25 @@ struct TypeConversion<uint64_t, false>
static PyObject *ConvertToPy(const uint64_t &in) { return PyLong_FromUnsignedLongLong(in); }
};
template <>
struct TypeConversion<int64_t, false>
{
static int ConvertFromPy(PyObject *in, int64_t &out)
{
if(!PyLong_Check(in))
return SWIG_TypeError;
out = PyLong_AsLongLong(in);
if(PyErr_Occurred())
return SWIG_OverflowError;
return SWIG_OK;
}
static PyObject *ConvertToPy(const int64_t &in) { return PyLong_FromLongLong(in); }
};
template <>
struct TypeConversion<float, false>
{
+4
View File
@@ -155,9 +155,13 @@ FIXED_ARRAY_TYPEMAPS(double)
FIXED_ARRAY_TYPEMAPS(float)
FIXED_ARRAY_TYPEMAPS(bool)
FIXED_ARRAY_TYPEMAPS(uint64_t)
FIXED_ARRAY_TYPEMAPS(int64_t)
FIXED_ARRAY_TYPEMAPS(uint32_t)
FIXED_ARRAY_TYPEMAPS(int32_t)
FIXED_ARRAY_TYPEMAPS(uint16_t)
FIXED_ARRAY_TYPEMAPS(int16_t)
FIXED_ARRAY_TYPEMAPS(uint8_t)
FIXED_ARRAY_TYPEMAPS(int8_t)
REFCOUNTED_TYPE(SDChunk);
REFCOUNTED_TYPE(SDObject);