
| Current Path : /usr/include/gdcm-3.0/ |
Linux ift1.ift-informatik.de 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64 |
| Current File : //usr/include/gdcm-3.0/gdcmByteBuffer.h |
/*=========================================================================
Program: GDCM (Grassroots DICOM). A DICOM library
Copyright (c) 2006-2011 Mathieu Malaterre
All rights reserved.
See Copyright.txt or http://gdcm.sourceforge.net/Copyright.html for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
#ifndef GDCMBYTEBUFFER_H
#define GDCMBYTEBUFFER_H
#include "gdcmTypes.h"
#include <vector>
#include <assert.h>
#include <string.h> // memmove
#error should not be used
namespace gdcm
{
/**
* \brief ByteBuffer
*
* \details Detailled description here
* \note
* looks like a std::streambuf or std::filebuf class with the get and
* peek pointer
*/
class ByteBuffer
{
static const int InitBufferSize = 1024;
public:
ByteBuffer() : Start(0), End(0),Limit(0) {}
char *Get(int len)
{
char *buffer = &Internal[0];
if (len > Limit - End)
{
// FIXME avoid integer overflow
int neededSize = len + (End - Start);
if (neededSize <= Limit - buffer)
{
memmove(buffer, Start, End - Start);
End = buffer + (End - Start);
Start = buffer;
}
else
{
char *newBuf;
int bufferSize = Limit - Start;
if ( bufferSize == 0 )
{
bufferSize = InitBufferSize;
}
do
{
bufferSize *= 2;
} while (bufferSize < neededSize);
//newBuf = malloc(bufferSize);
try
{
Internal.reserve(bufferSize);
newBuf = &Internal[0];
}
catch(...)
{
//errorCode = NoMemoryError;
return 0;
}
Limit = newBuf + bufferSize;
if (Start)
{
memcpy(newBuf, Start, End - Start);
}
End = newBuf + (End - Start);
Start = /*buffer =*/ newBuf;
}
}
assert( (int)Internal.capacity() >= len );
return End;
}
void UpdatePosition() {}
void ShiftEnd(int len) {
End += len;
}
const char *GetStart() const {
return Start;
}
private:
typedef std::vector<char> CharVector;
const char *Start;
char *End;
const char *Limit;
CharVector Internal;
};
} // end namespace gdcm
#endif //GDCMBYTEBUFFER_H