gdcmByteBuffer.h
Go to the documentation of this file.
/*=========================================================================
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
{
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
gdcm::ByteBuffer::UpdatePosition
void UpdatePosition()
Definition gdcmByteBuffer.h:89
gdcm::ByteBuffer::GetStart
const char * GetStart() const
Definition gdcmByteBuffer.h:93
gdcm::ByteBuffer::Get
char * Get(int len)
Definition gdcmByteBuffer.h:39
gdcm::ByteBuffer::ShiftEnd
void ShiftEnd(int len)
Definition gdcmByteBuffer.h:90
gdcm::ByteBuffer::ByteBuffer
ByteBuffer()
Definition gdcmByteBuffer.h:38
gdcmTypes.h
gdcm
Definition gdcmASN1.h:21