Skip to content

Commit 4b63bf3

Browse files
committed
ENH: Support H5::PredType::NATIVE_SCHAR for signed char
Mapped `H5::PredType::NATIVE_CHAR` to either `IOComponentEnum::CHAR` or `IOComponentEnum::UCHAR`, depending on the signedness of `char`.
1 parent 7ed48ec commit 4b63bf3

File tree

1 file changed

+28
-11
lines changed

1 file changed

+28
-11
lines changed

Modules/IO/HDF5/src/itkHDF5ImageIO.cxx

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "itkMakeUniqueForOverwrite.h"
2525

2626
#include <algorithm>
27+
#include <type_traits> // For is_signed_v.
2728

2829
namespace itk
2930
{
@@ -83,19 +84,20 @@ GetType()
8384
}
8485

8586
GetH5TypeSpecialize(float, H5::PredType::NATIVE_FLOAT) GetH5TypeSpecialize(double, H5::PredType::NATIVE_DOUBLE)
87+
GetH5TypeSpecialize(signed char, H5::PredType::NATIVE_SCHAR) GetH5TypeSpecialize(char, H5::PredType::NATIVE_CHAR)
88+
GetH5TypeSpecialize(unsigned char, H5::PredType::NATIVE_UCHAR)
8689

87-
GetH5TypeSpecialize(char, H5::PredType::NATIVE_CHAR) GetH5TypeSpecialize(unsigned char, H5::PredType::NATIVE_UCHAR)
90+
GetH5TypeSpecialize(short, H5::PredType::NATIVE_SHORT)
91+
GetH5TypeSpecialize(short unsigned int, H5::PredType::NATIVE_USHORT)
8892

89-
GetH5TypeSpecialize(short, H5::PredType::NATIVE_SHORT)
90-
GetH5TypeSpecialize(short unsigned int, H5::PredType::NATIVE_USHORT)
93+
GetH5TypeSpecialize(int, H5::PredType::NATIVE_INT)
94+
GetH5TypeSpecialize(unsigned int, H5::PredType::NATIVE_UINT)
9195

92-
GetH5TypeSpecialize(int, H5::PredType::NATIVE_INT) GetH5TypeSpecialize(unsigned int, H5::PredType::NATIVE_UINT)
96+
GetH5TypeSpecialize(long, H5::PredType::NATIVE_LONG)
97+
GetH5TypeSpecialize(long unsigned int, H5::PredType::NATIVE_ULONG)
9398

94-
GetH5TypeSpecialize(long, H5::PredType::NATIVE_LONG)
95-
GetH5TypeSpecialize(long unsigned int, H5::PredType::NATIVE_ULONG)
96-
97-
GetH5TypeSpecialize(long long, H5::PredType::NATIVE_LLONG)
98-
GetH5TypeSpecialize(unsigned long long, H5::PredType::NATIVE_ULLONG)
99+
GetH5TypeSpecialize(long long, H5::PredType::NATIVE_LLONG)
100+
GetH5TypeSpecialize(unsigned long long, H5::PredType::NATIVE_ULLONG)
99101

100102
/* The following types are not implemented. This comment serves
101103
* to indicate that the full complement of possible H5::PredType
@@ -105,13 +107,24 @@ GetH5TypeSpecialize(float, H5::PredType::NATIVE_FLOAT) GetH5TypeSpecialize(doubl
105107

106108
#undef GetH5TypeSpecialize
107109

108-
inline IOComponentEnum PredTypeToComponentType(H5::DataType & type)
110+
inline IOComponentEnum PredTypeToComponentType(H5::DataType & type)
109111
{
110112
if (type == H5::PredType::NATIVE_UCHAR)
111113
{
112114
return IOComponentEnum::UCHAR;
113115
}
114116
if (type == H5::PredType::NATIVE_CHAR)
117+
{
118+
if constexpr (std::is_signed_v<char>)
119+
{
120+
return IOComponentEnum::CHAR;
121+
}
122+
else
123+
{
124+
return IOComponentEnum::UCHAR;
125+
}
126+
}
127+
else if (type == H5::PredType::NATIVE_SCHAR)
115128
{
116129
return IOComponentEnum::CHAR;
117130
}
@@ -166,7 +179,7 @@ ComponentToPredType(IOComponentEnum cType)
166179
case IOComponentEnum::UCHAR:
167180
return H5::PredType::NATIVE_UCHAR;
168181
case IOComponentEnum::CHAR:
169-
return H5::PredType::NATIVE_CHAR;
182+
return H5::PredType::NATIVE_SCHAR;
170183
case IOComponentEnum::USHORT:
171184
return H5::PredType::NATIVE_USHORT;
172185
case IOComponentEnum::SHORT:
@@ -784,6 +797,10 @@ HDF5ImageIO::ReadImageInformation()
784797
{
785798
this->StoreMetaData<char>(&metaDict, localMetaDataName, name, metaDataDims[0]);
786799
}
800+
else if (metaDataType == H5::PredType::NATIVE_SCHAR)
801+
{
802+
this->StoreMetaData<signed char>(&metaDict, localMetaDataName, name, metaDataDims[0]);
803+
}
787804
else if (metaDataType == H5::PredType::NATIVE_UCHAR)
788805
{
789806
if (doesAttrExist(metaDataSet, "isBool"))

0 commit comments

Comments
 (0)