Skip to content

Commit 9f88d46

Browse files
committed
Add converters and low-level views for fixed width integers
1 parent ba7619b commit 9f88d46

File tree

5 files changed

+105
-1
lines changed

5 files changed

+105
-1
lines changed

bindings/pyroot/cppyy/CPyCppyy/src/CallContext.h

+4
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,11 @@ struct Parameter {
2222
union Value {
2323
bool fBool;
2424
int8_t fInt8;
25+
int16_t fInt16;
26+
int32_t fInt32;
2527
uint8_t fUInt8;
28+
uint16_t fUInt16;
29+
uint32_t fUInt32;
2630
short fShort;
2731
unsigned short fUShort;
2832
int fInt;

bindings/pyroot/cppyy/CPyCppyy/src/Converters.cxx

+40-1
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,9 @@ struct CPyCppyy_tagPyCArgObject { // not public (but stable; note that olde
123123
#define ct_c_fcomplex 21
124124
#define ct_c_complex 22
125125
#define ct_c_pointer 23
126-
#define NTYPES 24
126+
#define ct_c_int16 24
127+
#define ct_c_int32 25
128+
#define NTYPES 26
127129

128130
static std::array<const char*, NTYPES> gCTypesNames = {
129131
"c_bool", "c_char", "c_wchar", "c_byte", "c_ubyte", "c_short", "c_ushort", "c_uint16",
@@ -387,6 +389,10 @@ static inline type CPyCppyy_PyLong_As##name(PyObject* pyobject) \
387389

388390
CPPYY_PYLONG_AS_TYPE(UInt8, uint8_t, 0, UCHAR_MAX)
389391
CPPYY_PYLONG_AS_TYPE(Int8, int8_t, SCHAR_MIN, SCHAR_MAX)
392+
CPPYY_PYLONG_AS_TYPE(UInt16, uint16_t, 0, UINT16_MAX)
393+
CPPYY_PYLONG_AS_TYPE(Int16, int16_t, INT16_MIN, INT16_MAX)
394+
CPPYY_PYLONG_AS_TYPE(UInt32, uint32_t, 0, UINT32_MAX)
395+
CPPYY_PYLONG_AS_TYPE(Int32, int32_t, INT_MIN, INT32_MAX)
390396
CPPYY_PYLONG_AS_TYPE(UShort, unsigned short, 0, USHRT_MAX)
391397
CPPYY_PYLONG_AS_TYPE(Short, short, SHRT_MIN, SHRT_MAX)
392398
CPPYY_PYLONG_AS_TYPE(StrictInt, int, INT_MIN, INT_MAX)
@@ -782,6 +788,10 @@ CPPYY_IMPL_BASIC_CONST_CHAR_REFCONVERTER(UChar, unsigned char, c_uchar, 0
782788
CPPYY_IMPL_BASIC_CONST_REFCONVERTER(Bool, bool, c_bool, CPyCppyy_PyLong_AsBool)
783789
CPPYY_IMPL_BASIC_CONST_REFCONVERTER(Int8, int8_t, c_int8, CPyCppyy_PyLong_AsInt8)
784790
CPPYY_IMPL_BASIC_CONST_REFCONVERTER(UInt8, uint8_t, c_uint8, CPyCppyy_PyLong_AsUInt8)
791+
CPPYY_IMPL_BASIC_CONST_REFCONVERTER(Int16, int16_t, c_int16, CPyCppyy_PyLong_AsInt16)
792+
CPPYY_IMPL_BASIC_CONST_REFCONVERTER(UInt16, uint16_t, c_uint16, CPyCppyy_PyLong_AsUInt16)
793+
CPPYY_IMPL_BASIC_CONST_REFCONVERTER(Int32, int32_t, c_int32, CPyCppyy_PyLong_AsInt32)
794+
CPPYY_IMPL_BASIC_CONST_REFCONVERTER(UInt32, uint32_t, c_uint32, CPyCppyy_PyLong_AsUInt32)
785795
CPPYY_IMPL_BASIC_CONST_REFCONVERTER(Short, short, c_short, CPyCppyy_PyLong_AsShort)
786796
CPPYY_IMPL_BASIC_CONST_REFCONVERTER(UShort, unsigned short, c_ushort, CPyCppyy_PyLong_AsUShort)
787797
CPPYY_IMPL_BASIC_CONST_REFCONVERTER(Int, int, c_int, CPyCppyy_PyLong_AsStrictInt)
@@ -857,6 +867,10 @@ CPPYY_IMPL_REFCONVERTER(SChar, c_byte, signed char, 'b');
857867
CPPYY_IMPL_REFCONVERTER(UChar, c_ubyte, unsigned char, 'B');
858868
CPPYY_IMPL_REFCONVERTER(Int8, c_int8, int8_t, 'b');
859869
CPPYY_IMPL_REFCONVERTER(UInt8, c_uint8, uint8_t, 'B');
870+
CPPYY_IMPL_REFCONVERTER(Int16, c_int16, int16_t, 'h');
871+
CPPYY_IMPL_REFCONVERTER(UInt16, c_uint16, uint16_t, 'H');
872+
CPPYY_IMPL_REFCONVERTER(Int32, c_int32, int32_t, 'i');
873+
CPPYY_IMPL_REFCONVERTER(UInt32, c_uint32, uint32_t, 'I');
860874
CPPYY_IMPL_REFCONVERTER(Short, c_short, short, 'h');
861875
CPPYY_IMPL_REFCONVERTER(UShort, c_ushort, unsigned short, 'H');
862876
CPPYY_IMPL_REFCONVERTER_FROM_MEMORY(Int, c_int);
@@ -1015,6 +1029,14 @@ CPPYY_IMPL_BASIC_CONVERTER_IB(
10151029
Int8, int8_t, long, c_int8, PyInt_FromLong, CPyCppyy_PyLong_AsInt8, 'l')
10161030
CPPYY_IMPL_BASIC_CONVERTER_IB(
10171031
UInt8, uint8_t, long, c_uint8, PyInt_FromLong, CPyCppyy_PyLong_AsUInt8, 'l')
1032+
CPPYY_IMPL_BASIC_CONVERTER_IB(
1033+
Int16, int16_t, long, c_int16, PyInt_FromLong, CPyCppyy_PyLong_AsInt16, 'l')
1034+
CPPYY_IMPL_BASIC_CONVERTER_IB(
1035+
UInt16, uint16_t, long, c_uint16, PyInt_FromLong, CPyCppyy_PyLong_AsUInt16, 'l')
1036+
CPPYY_IMPL_BASIC_CONVERTER_IB(
1037+
Int32, int32_t, long, c_int32, PyInt_FromLong, CPyCppyy_PyLong_AsInt32, 'l')
1038+
CPPYY_IMPL_BASIC_CONVERTER_IB(
1039+
UInt32, uint32_t, long, c_uint32, PyInt_FromLong, CPyCppyy_PyLong_AsUInt32, 'l')
10181040
CPPYY_IMPL_BASIC_CONVERTER_IB(
10191041
Short, short, long, c_short, PyInt_FromLong, CPyCppyy_PyLong_AsShort, 'l')
10201042
CPPYY_IMPL_BASIC_CONVERTER_IB(
@@ -1750,7 +1772,11 @@ CPPYY_IMPL_ARRAY_CONVERTER(UChar, c_ubyte, unsigned char, 'B', )
17501772
CPPYY_IMPL_ARRAY_CONVERTER(Byte, c_ubyte, std::byte, 'B', )
17511773
#endif
17521774
CPPYY_IMPL_ARRAY_CONVERTER(Int8, c_byte, int8_t, 'b', _i8)
1775+
CPPYY_IMPL_ARRAY_CONVERTER(Int16, c_byte, int16_t, 'h', _i16)
1776+
CPPYY_IMPL_ARRAY_CONVERTER(Int32, c_byte, int32_t, 'i', _i32)
17531777
CPPYY_IMPL_ARRAY_CONVERTER(UInt8, c_ubyte, uint8_t, 'B', _i8)
1778+
CPPYY_IMPL_ARRAY_CONVERTER(UInt16, c_byte, int16_t, 'H', _i16)
1779+
CPPYY_IMPL_ARRAY_CONVERTER(UInt32, c_byte, int32_t, 'I', _i32)
17541780
CPPYY_IMPL_ARRAY_CONVERTER(Short, c_short, short, 'h', )
17551781
CPPYY_IMPL_ARRAY_CONVERTER(UShort, c_ushort, unsigned short, 'H', )
17561782
CPPYY_IMPL_ARRAY_CONVERTER(Int, c_int, int, 'i', )
@@ -3464,8 +3490,12 @@ static struct InitConvFactories_t {
34643490
gf["char16_t&"] = (cf_t)+[](cdims_t) { static Char16RefConverter c{}; return &c; };
34653491
gf["char32_t&"] = (cf_t)+[](cdims_t) { static Char32RefConverter c{}; return &c; };
34663492
gf["int8_t"] = (cf_t)+[](cdims_t) { static Int8Converter c{}; return &c; };
3493+
gf["int16_t"] = (cf_t)+[](cdims_t) { static Int16Converter c{}; return &c; };
3494+
gf["int32_t"] = (cf_t)+[](cdims_t) { static Int32Converter c{}; return &c; };
34673495
gf["const int8_t&"] = (cf_t)+[](cdims_t) { static ConstInt8RefConverter c{}; return &c; };
34683496
gf["int8_t&"] = (cf_t)+[](cdims_t) { static Int8RefConverter c{}; return &c; };
3497+
gf["int16_t&"] = (cf_t)+[](cdims_t) { static Int16RefConverter c{}; return &c; };
3498+
gf["int32_t&"] = (cf_t)+[](cdims_t) { static Int32RefConverter c{}; return &c; };
34693499
gf["uint8_t"] = (cf_t)+[](cdims_t) { static UInt8Converter c{}; return &c; };
34703500
gf["const uint8_t&"] = (cf_t)+[](cdims_t) { static ConstUInt8RefConverter c{}; return &c; };
34713501
gf["uint8_t&"] = (cf_t)+[](cdims_t) { static UInt8RefConverter c{}; return &c; };
@@ -3476,7 +3506,11 @@ static struct InitConvFactories_t {
34763506
gf["const unsigned short&"] = (cf_t)+[](cdims_t) { static ConstUShortRefConverter c{}; return &c; };
34773507
gf["unsigned short&"] = (cf_t)+[](cdims_t) { static UShortRefConverter c{}; return &c; };
34783508
gf["int"] = (cf_t)+[](cdims_t) { static IntConverter c{}; return &c; };
3509+
// gf["int16_t"] = gf["short"];
3510+
// gf["int32_t"] = gf["int"];
34793511
gf["int&"] = (cf_t)+[](cdims_t) { static IntRefConverter c{}; return &c; };
3512+
// gf["int16_t&"] = gf["short&"];
3513+
// gf["int32_t&"] = gf["int&"];
34803514
gf["const int&"] = (cf_t)+[](cdims_t) { static ConstIntRefConverter c{}; return &c; };
34813515
gf["unsigned int"] = (cf_t)+[](cdims_t) { static UIntConverter c{}; return &c; };
34823516
gf["const unsigned int&"] = (cf_t)+[](cdims_t) { static ConstUIntRefConverter c{}; return &c; };
@@ -3521,10 +3555,15 @@ static struct InitConvFactories_t {
35213555
gf["std::byte ptr"] = (cf_t)+[](cdims_t d) { return new ByteArrayConverter{d}; };
35223556
#endif
35233557
gf["int8_t ptr"] = (cf_t)+[](cdims_t d) { return new Int8ArrayConverter{d}; };
3558+
gf["int16_t ptr"] = (cf_t)+[](cdims_t d) { return new Int16ArrayConverter{d}; };
3559+
gf["int32_t ptr"] = (cf_t)+[](cdims_t d) { return new Int32ArrayConverter{d}; };
35243560
gf["uint8_t ptr"] = (cf_t)+[](cdims_t d) { return new UInt8ArrayConverter{d}; };
35253561
gf["short ptr"] = (cf_t)+[](cdims_t d) { return new ShortArrayConverter{d}; };
3562+
// Upstream cppyy resolves int16_t to short (TClasssEdit::ResolveTypedef), this is another approach that can fix the issue
3563+
// gf["int16_t ptr"] = gf["short ptr"];
35263564
gf["unsigned short ptr"] = (cf_t)+[](cdims_t d) { return new UShortArrayConverter{d}; };
35273565
gf["int ptr"] = (cf_t)+[](cdims_t d) { return new IntArrayConverter{d}; };
3566+
// gf["int32_t ptr"] = gf["int ptr"];
35283567
gf["unsigned int ptr"] = (cf_t)+[](cdims_t d) { return new UIntArrayConverter{d}; };
35293568
gf["long ptr"] = (cf_t)+[](cdims_t d) { return new LongArrayConverter{d}; };
35303569
gf["unsigned long ptr"] = (cf_t)+[](cdims_t d) { return new ULongArrayConverter{d}; };

bindings/pyroot/cppyy/CPyCppyy/src/DeclareConverters.h

+12
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,11 @@ CPPYY_DECLARE_BASIC_CONVERTER(WChar);
8787
CPPYY_DECLARE_BASIC_CONVERTER(Char16);
8888
CPPYY_DECLARE_BASIC_CONVERTER(Char32);
8989
CPPYY_DECLARE_BASIC_CONVERTER(Int8);
90+
CPPYY_DECLARE_BASIC_CONVERTER(Int16);
91+
CPPYY_DECLARE_BASIC_CONVERTER(Int32);
9092
CPPYY_DECLARE_BASIC_CONVERTER(UInt8);
93+
CPPYY_DECLARE_BASIC_CONVERTER(UInt16);
94+
CPPYY_DECLARE_BASIC_CONVERTER(UInt32);
9195
CPPYY_DECLARE_BASIC_CONVERTER(Short);
9296
CPPYY_DECLARE_BASIC_CONVERTER(UShort);
9397
CPPYY_DECLARE_BASIC_CONVERTER(Int);
@@ -107,7 +111,11 @@ CPPYY_DECLARE_REFCONVERTER(Char32);
107111
CPPYY_DECLARE_REFCONVERTER(SChar);
108112
CPPYY_DECLARE_REFCONVERTER(UChar);
109113
CPPYY_DECLARE_REFCONVERTER(Int8);
114+
CPPYY_DECLARE_REFCONVERTER(Int16);
115+
CPPYY_DECLARE_REFCONVERTER(Int32);
110116
CPPYY_DECLARE_REFCONVERTER(UInt8);
117+
CPPYY_DECLARE_REFCONVERTER(UInt16);
118+
CPPYY_DECLARE_REFCONVERTER(UInt32);
111119
CPPYY_DECLARE_REFCONVERTER(Short);
112120
CPPYY_DECLARE_REFCONVERTER(UShort);
113121
CPPYY_DECLARE_REFCONVERTER(UInt);
@@ -214,7 +222,11 @@ CPPYY_DECLARE_ARRAY_CONVERTER(UChar);
214222
CPPYY_DECLARE_ARRAY_CONVERTER(Byte);
215223
#endif
216224
CPPYY_DECLARE_ARRAY_CONVERTER(Int8);
225+
CPPYY_DECLARE_ARRAY_CONVERTER(Int16);
226+
CPPYY_DECLARE_ARRAY_CONVERTER(Int32);
217227
CPPYY_DECLARE_ARRAY_CONVERTER(UInt8);
228+
CPPYY_DECLARE_ARRAY_CONVERTER(UInt16);
229+
CPPYY_DECLARE_ARRAY_CONVERTER(UInt32);
218230
CPPYY_DECLARE_ARRAY_CONVERTER(Short);
219231
CPPYY_DECLARE_ARRAY_CONVERTER(UShort);
220232
CPPYY_DECLARE_ARRAY_CONVERTER(Int);

bindings/pyroot/cppyy/CPyCppyy/src/LowLevelViews.cxx

+40
Original file line numberDiff line numberDiff line change
@@ -1200,3 +1200,43 @@ PyObject* CPyCppyy::CreateLowLevelView_i8(uint8_t** address, cdims_t shape) {
12001200
LowLevelView* ll = CreateLowLevelViewT<uint8_t>(address, shape, "B", "uint8_t");
12011201
CPPYY_RET_W_CREATOR(uint8_t**, CreateLowLevelView_i8);
12021202
}
1203+
1204+
PyObject* CPyCppyy::CreateLowLevelView_i16(int16_t* address, cdims_t shape) {
1205+
LowLevelView* ll = CreateLowLevelViewT<int16_t>(address, shape, "h", "int16_t");
1206+
CPPYY_RET_W_CREATOR(int16_t*, CreateLowLevelView_i16);
1207+
}
1208+
1209+
PyObject* CPyCppyy::CreateLowLevelView_i16(int16_t** address, cdims_t shape) {
1210+
LowLevelView* ll = CreateLowLevelViewT<int16_t>(address, shape, "h", "int16_t");
1211+
CPPYY_RET_W_CREATOR(int16_t**, CreateLowLevelView_i16);
1212+
}
1213+
1214+
PyObject* CPyCppyy::CreateLowLevelView_i16(uint16_t* address, cdims_t shape) {
1215+
LowLevelView* ll = CreateLowLevelViewT<uint16_t>(address, shape, "H", "uint16_t");
1216+
CPPYY_RET_W_CREATOR(uint16_t*, CreateLowLevelView_i16);
1217+
}
1218+
1219+
PyObject* CPyCppyy::CreateLowLevelView_i16(uint16_t** address, cdims_t shape) {
1220+
LowLevelView* ll = CreateLowLevelViewT<uint16_t>(address, shape, "H", "uint16_t");
1221+
CPPYY_RET_W_CREATOR(uint16_t**, CreateLowLevelView_i16);
1222+
}
1223+
1224+
PyObject* CPyCppyy::CreateLowLevelView_i32(int32_t* address, cdims_t shape) {
1225+
LowLevelView* ll = CreateLowLevelViewT<int32_t>(address, shape, "i", "int32_t");
1226+
CPPYY_RET_W_CREATOR(int32_t*, CreateLowLevelView_i32);
1227+
}
1228+
1229+
PyObject* CPyCppyy::CreateLowLevelView_i32(int32_t** address, cdims_t shape) {
1230+
LowLevelView* ll = CreateLowLevelViewT<int32_t>(address, shape, "i", "int32_t");
1231+
CPPYY_RET_W_CREATOR(int32_t**, CreateLowLevelView_i32);
1232+
}
1233+
1234+
PyObject* CPyCppyy::CreateLowLevelView_i32(uint32_t* address, cdims_t shape) {
1235+
LowLevelView* ll = CreateLowLevelViewT<uint32_t>(address, shape, "I", "uint32_t");
1236+
CPPYY_RET_W_CREATOR(uint32_t*, CreateLowLevelView_i32);
1237+
}
1238+
1239+
PyObject* CPyCppyy::CreateLowLevelView_i32(uint32_t** address, cdims_t shape) {
1240+
LowLevelView* ll = CreateLowLevelViewT<uint32_t>(address, shape, "I", "uint32_t");
1241+
CPPYY_RET_W_CREATOR(uint32_t**, CreateLowLevelView_i32);
1242+
}

bindings/pyroot/cppyy/CPyCppyy/src/LowLevelViews.h

+9
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,15 @@ PyObject* CreateLowLevelView_i8(int8_t*, cdims_t shape);
5656
PyObject* CreateLowLevelView_i8(int8_t**, cdims_t shape);
5757
PyObject* CreateLowLevelView_i8(uint8_t*, cdims_t shape);
5858
PyObject* CreateLowLevelView_i8(uint8_t**, cdims_t shape);
59+
PyObject* CreateLowLevelView_i16(int16_t*, cdims_t shape);
60+
PyObject* CreateLowLevelView_i16(int16_t**, cdims_t shape);
61+
PyObject* CreateLowLevelView_i16(uint16_t*, cdims_t shape);
62+
PyObject* CreateLowLevelView_i16(uint16_t**, cdims_t shape);
63+
PyObject* CreateLowLevelView_i32(int32_t*, cdims_t shape);
64+
PyObject* CreateLowLevelView_i32(int32_t**, cdims_t shape);
65+
PyObject* CreateLowLevelView_i32(uint32_t*, cdims_t shape);
66+
PyObject* CreateLowLevelView_i32(uint32_t**, cdims_t shape);
67+
5968
CPPYY_DECL_VIEW_CREATOR(short);
6069
CPPYY_DECL_VIEW_CREATOR(unsigned short);
6170
CPPYY_DECL_VIEW_CREATOR(int);

0 commit comments

Comments
 (0)