Skip to content

Commit 7a394d3

Browse files
committed
BUG: fix type cast warnings
BUG: fix test image name type PERF: use vectors to automatically manage buffer memory PERF: use constant name instead of magic number for aim write version
1 parent c256658 commit 7a394d3

File tree

5 files changed

+38
-40
lines changed

5 files changed

+38
-40
lines changed

include/itkAIMHeaderIO.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ class AIMHeaderIO : public ScancoHeaderIO
6161
* \returns -1 on failure, 0 on success.
6262
*/
6363
int
64-
ReadPreHeader(std::ifstream & file, unsigned long offset = 0);
64+
ReadPreHeader(std::ifstream & file, size_t offset = 0);
6565

6666
/** Read the AIM v020 image structure header from a data structure.
6767
* \param headerData pointer to structure containing image structure header
@@ -80,10 +80,10 @@ class AIMHeaderIO : public ScancoHeaderIO
8080
* \param file The input file stream to read the header from.
8181
* \param length The length of the processing log to read.
8282
* \param offset The offset in the file to start reading from.
83-
* \returns -1 on failure, 0 on success.
83+
* \returns size of the processing log read
8484
*/
85-
int
86-
ReadProcessingLog(std::ifstream & infile, unsigned long offset, unsigned long length);
85+
size_t
86+
ReadProcessingLog(std::ifstream & infile, size_t offset, size_t length);
8787

8888
/** Write the image structure header to an AIM v020 data structure
8989
* \returns AIMV020StructHeader structure filled with encoded header data

src/itkAIMHeaderIO.cxx

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,14 @@
2222

2323
constexpr const char * AIM020String = "AIMDATA_V020 ";
2424
constexpr const char * AIM030String = "AIMDATA_V030 ";
25+
constexpr float AIM020WriteVersion = 1.6;
2526

2627
typedef char EncodedByte;
2728
typedef char EncodedInt4Byte[4];
2829
typedef char EncodedInt8Byte[8];
2930
typedef EncodedInt4Byte EncodedTuple4Byte[3];
3031
typedef EncodedInt8Byte EncodedTuple8Byte[3];
3132

32-
3333
struct AIMV020AssociatedData
3434
{
3535
EncodedInt4Byte m_ID;
@@ -106,7 +106,7 @@ namespace itk
106106
unsigned long
107107
AIMHeaderIO::ReadHeader(std::ifstream & infile)
108108
{
109-
unsigned long bytesRead = 0; // Use as offset for reading the header
109+
size_t bytesRead = 0; // Use as offset for reading the header
110110

111111
if (!infile.is_open())
112112
{
@@ -146,9 +146,9 @@ AIMHeaderIO::ReadHeader(std::ifstream & infile)
146146
}
147147
bytesRead += this->m_PreHeaderSize;
148148

149-
unsigned long headerSize = this->m_PreHeaderSize + this->m_ImgStructSize + this->m_ProcessingLogSize;
149+
size_t headerSize = this->m_PreHeaderSize + this->m_ImgStructSize + this->m_ProcessingLogSize;
150150

151-
if (headerSize > ScancoHeaderBlockSize)
151+
if (headerSize > static_cast<size_t>(ScancoHeaderBlockSize))
152152
{
153153
// Allocate more space for the header and read the rest into the raw header
154154
delete[] headerBytes;
@@ -194,7 +194,7 @@ AIMHeaderIO::ReadHeader(std::ifstream & infile)
194194
this->m_HeaderData->m_SliceThickness = this->m_HeaderData->m_PixelData.m_Spacing[2];
195195
this->m_HeaderData->m_SliceIncrement = this->m_HeaderData->m_PixelData.m_Spacing[2];
196196

197-
return bytesRead; // Return the size of the header, including the version string if written
197+
return static_cast<unsigned long>(bytesRead); // Return the size of the header, including the version string if written
198198
}
199199

200200
unsigned long
@@ -236,11 +236,11 @@ AIMHeaderIO::WriteHeader(std::ofstream & outfile, unsigned long imageSize)
236236
throw std::runtime_error("Error: write size mismatch");
237237
}
238238

239-
return bytesWritten + this->m_PreHeaderSize + this->m_ImgStructSize + this->m_ProcessingLogSize;
239+
return static_cast<unsigned long>(bytesWritten + this->m_PreHeaderSize + this->m_ImgStructSize + this->m_ProcessingLogSize);
240240
}
241241

242242
int
243-
AIMHeaderIO::ReadPreHeader(std::ifstream & file, unsigned long offset)
243+
AIMHeaderIO::ReadPreHeader(std::ifstream & file, size_t offset)
244244
{
245245
unsigned long bytesRead = this->m_IntSize; // We assume the pre-header length (int) has already been read
246246

@@ -355,8 +355,8 @@ AIMHeaderIO::ReadImgStructHeader(AIMV030StructHeader * headerData)
355355
}
356356
}
357357

358-
int
359-
AIMHeaderIO::ReadProcessingLog(std::ifstream & infile, unsigned long offset, unsigned long length)
358+
size_t
359+
AIMHeaderIO::ReadProcessingLog(std::ifstream & infile, size_t offset, size_t length)
360360
{
361361
size_t bytesRead = 0;
362362
std::string readString = "";
@@ -534,7 +534,7 @@ AIMHeaderIO::WriteStructHeaderV020()
534534
AIMV020StructHeader structHeader{ 0 };
535535
EncodeInt(this->m_HeaderData->m_PixelData.m_ComponentType, structHeader.m_Type);
536536

537-
EncodeFloat(1.6, structHeader.m_Version);
537+
EncodeFloat(AIM020WriteVersion, structHeader.m_Version);
538538

539539
int i = 0;
540540
for (int & imageDimension : this->m_HeaderData->m_PixelData.m_Dimensions)
@@ -658,10 +658,10 @@ AIMHeaderIO::WritePreHeader(std::ofstream & outfile, size_t imageSize, ScancoFil
658658
if (version == ScancoFileVersions::AIM_020)
659659
{
660660
AIMPreHeaderV020 preHeader{ 0 };
661-
EncodeInt(sizeof(AIMPreHeaderV020), preHeader.m_PreHeaderLength);
662-
EncodeInt(this->m_ImgStructSize, preHeader.m_ImageStructLength);
663-
EncodeInt(this->m_ProcessingLogSize, preHeader.m_ProcessingLogLength);
664-
EncodeInt(imageSize, preHeader.m_ImageDataLength);
661+
EncodeInt((int)sizeof(AIMPreHeaderV020), preHeader.m_PreHeaderLength);
662+
EncodeInt((int)this->m_ImgStructSize, preHeader.m_ImageStructLength);
663+
EncodeInt((int)this->m_ProcessingLogSize, preHeader.m_ProcessingLogLength);
664+
EncodeInt((int)imageSize, preHeader.m_ImageDataLength);
665665
EncodeInt(0, preHeader.m_AssociatedDataLength); // No associated data handling
666666
outfile.write((char *)&preHeader, sizeof(preHeader));
667667
return sizeof(preHeader);

src/itkScancoImageIO.cxx

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -800,9 +800,9 @@ ScancoImageIO::Write(const void * buffer)
800800
{
801801
itkExceptionMacro("ScancoImageIO only supports writing short or float files.");
802802
}
803-
804-
char * tempmemory = new char[numberOfBytes];
805-
memcpy(tempmemory, buffer, numberOfBytes);
803+
804+
std::vector<char> tempmemory(numberOfBytes);
805+
memcpy(tempmemory.data(), buffer, numberOfBytes);
806806

807807
bool bigEndian = ByteSwapper<short>::SystemIsBigEndian();
808808

@@ -811,64 +811,62 @@ ScancoImageIO::Write(const void * buffer)
811811
switch (this->GetComponentType())
812812
{
813813
case IOComponentEnum::CHAR:
814-
RescaleToScanco(reinterpret_cast<char *>(tempmemory), numberOfComponents);
814+
RescaleToScanco(reinterpret_cast<char *>(tempmemory.data()), numberOfComponents);
815815
if (bigEndian)
816816
{
817-
ByteSwapper<char>::SwapRangeFromSystemToBigEndian(reinterpret_cast<char *>(tempmemory), numberOfComponents);
817+
ByteSwapper<char>::SwapRangeFromSystemToBigEndian(reinterpret_cast<char *>(tempmemory.data()), numberOfComponents);
818818
}
819819
break;
820820
case IOComponentEnum::UCHAR:
821-
RescaleToScanco(reinterpret_cast<unsigned char *>(tempmemory), numberOfComponents);
821+
RescaleToScanco(reinterpret_cast<unsigned char *>(tempmemory.data()), numberOfComponents);
822822
if (bigEndian)
823823
{
824-
ByteSwapper<unsigned char>::SwapRangeFromSystemToBigEndian(reinterpret_cast<unsigned char *>(tempmemory),
824+
ByteSwapper<unsigned char>::SwapRangeFromSystemToBigEndian(reinterpret_cast<unsigned char *>(tempmemory.data()),
825825
numberOfComponents);
826826
}
827827
break;
828828
case IOComponentEnum::SHORT:
829-
RescaleToScanco(reinterpret_cast<short *>(tempmemory), numberOfComponents);
829+
RescaleToScanco(reinterpret_cast<short *>(tempmemory.data()), numberOfComponents);
830830
if (bigEndian)
831831
{
832-
ByteSwapper<short>::SwapRangeFromSystemToBigEndian(reinterpret_cast<short *>(tempmemory), numberOfComponents);
832+
ByteSwapper<short>::SwapRangeFromSystemToBigEndian(reinterpret_cast<short *>(tempmemory.data()), numberOfComponents);
833833
}
834834
break;
835835
case IOComponentEnum::USHORT:
836-
RescaleToScanco(reinterpret_cast<unsigned short *>(tempmemory), numberOfComponents);
836+
RescaleToScanco(reinterpret_cast<unsigned short *>(tempmemory.data()), numberOfComponents);
837837
if (bigEndian)
838838
{
839-
ByteSwapper<unsigned short>::SwapRangeFromSystemToBigEndian(reinterpret_cast<unsigned short *>(tempmemory),
839+
ByteSwapper<unsigned short>::SwapRangeFromSystemToBigEndian(reinterpret_cast<unsigned short *>(tempmemory.data()),
840840
numberOfComponents);
841841
}
842842
break;
843843
case IOComponentEnum::INT:
844-
RescaleToScanco(reinterpret_cast<int *>(tempmemory), numberOfComponents);
844+
RescaleToScanco(reinterpret_cast<int *>(tempmemory.data()), numberOfComponents);
845845
if (bigEndian)
846846
{
847-
ByteSwapper<int>::SwapRangeFromSystemToBigEndian(reinterpret_cast<int *>(tempmemory), numberOfComponents);
847+
ByteSwapper<int>::SwapRangeFromSystemToBigEndian(reinterpret_cast<int *>(tempmemory.data()), numberOfComponents);
848848
}
849849
break;
850850
case IOComponentEnum::UINT:
851-
RescaleToScanco(reinterpret_cast<unsigned int *>(tempmemory), numberOfComponents);
851+
RescaleToScanco(reinterpret_cast<unsigned int *>(tempmemory.data()), numberOfComponents);
852852
if (bigEndian)
853853
{
854-
ByteSwapper<unsigned int>::SwapRangeFromSystemToBigEndian(reinterpret_cast<unsigned int *>(tempmemory),
854+
ByteSwapper<unsigned int>::SwapRangeFromSystemToBigEndian(reinterpret_cast<unsigned int *>(tempmemory.data()),
855855
numberOfComponents);
856856
}
857857
break;
858858
case IOComponentEnum::FLOAT:
859-
RescaleToScanco(reinterpret_cast<float *>(tempmemory), numberOfComponents);
859+
RescaleToScanco(reinterpret_cast<float *>(tempmemory.data()), numberOfComponents);
860860
if (bigEndian)
861861
{
862-
ByteSwapper<float>::SwapRangeFromSystemToBigEndian(reinterpret_cast<float *>(tempmemory), numberOfComponents);
862+
ByteSwapper<float>::SwapRangeFromSystemToBigEndian(reinterpret_cast<float *>(tempmemory.data()), numberOfComponents);
863863
}
864864
break;
865865
default:
866866
itkExceptionMacro("Unrecognized data type in file: " << this->m_ComponentType);
867867
}
868868
}
869-
outFile.write(static_cast<const char *>(tempmemory), numberOfBytes);
870-
871-
delete[] tempmemory;
869+
outFile.write(static_cast<const char *>(tempmemory.data()), numberOfBytes);
872870
outFile.close();
873871
}
874872

test/CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,10 +107,10 @@ set_property(TEST itkScancoImageIOAIMReadWrittenTest APPEND PROPERTY DEPENDS
107107
itk_add_test(NAME itkScancoImageIOAIM030FloatReadHeader
108108
COMMAND IOScancoTestDriver
109109
--compare
110-
DATA{Input/AIMIOTestImageFoatv030.AIM}
110+
DATA{Input/AIMIOTestImageFloatv030.AIM}
111111
${ITK_TEST_OUTPUT_DIR}/AIMIOTestWritev030.aim
112112
itkScancoImageIOTest3
113-
DATA{Input/AIMIOTestImageFoatv030.AIM}
113+
DATA{Input/AIMIOTestImageFloatv030.AIM}
114114
${ITK_TEST_OUTPUT_DIR}/AIMIOTestWritev030.aim
115115
0
116116
"AIMDATA_V030 "
File renamed without changes.

0 commit comments

Comments
 (0)