kopia lustrzana https://github.com/Jean-MarcHarvengt/MCUME
181 wiersze
3.9 KiB
C
181 wiersze
3.9 KiB
C
|
// Simple smart pointer class -- Copyright (C) Michael Schwendt
|
||
|
//
|
||
|
// This program is free software; you can redistribute it and/or modify
|
||
|
// it under the terms of the GNU General Public License as published by
|
||
|
// the Free Software Foundation; either version 2 of the License, or
|
||
|
// (at your option) any later version.
|
||
|
|
||
|
#ifndef SMARTPTR_H
|
||
|
#define SMARTPTR_H
|
||
|
|
||
|
typedef unsigned long int ulong;
|
||
|
|
||
|
template <class T> class smartPtrBase {
|
||
|
public:
|
||
|
smartPtrBase(T* buffer, ulong bufferLen, bool bufOwner = false) : dummy(0) {
|
||
|
doFree = bufOwner;
|
||
|
if ( bufferLen >= 1 ) {
|
||
|
pBufCurrent = ( bufBegin = buffer );
|
||
|
bufEnd = bufBegin + bufferLen;
|
||
|
bufLen = bufferLen;
|
||
|
status = true;
|
||
|
}
|
||
|
else {
|
||
|
pBufCurrent = ( bufBegin = ( bufEnd = 0 ));
|
||
|
bufLen = 0;
|
||
|
status = false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
virtual ~smartPtrBase() {
|
||
|
if ( doFree && (bufBegin != 0) ) {
|
||
|
#if defined(_MSC_VER)
|
||
|
delete[] (void*)bufBegin;
|
||
|
#else
|
||
|
delete[] bufBegin;
|
||
|
#endif
|
||
|
}
|
||
|
}
|
||
|
|
||
|
virtual T* tellBegin() { return bufBegin; }
|
||
|
virtual ulong tellLength() { return bufLen; }
|
||
|
virtual ulong tellPos() { return (ulong)(pBufCurrent-bufBegin); }
|
||
|
|
||
|
virtual bool checkIndex(ulong index) {
|
||
|
return ((pBufCurrent+index)<bufEnd);
|
||
|
}
|
||
|
|
||
|
virtual bool reset() {
|
||
|
if ( bufLen >= 1 ) {
|
||
|
pBufCurrent = bufBegin;
|
||
|
return (status = true);
|
||
|
}
|
||
|
else {
|
||
|
return (status = false);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
virtual bool good() {
|
||
|
return (pBufCurrent<bufEnd);
|
||
|
}
|
||
|
|
||
|
virtual bool fail() {
|
||
|
return (pBufCurrent==bufEnd);
|
||
|
}
|
||
|
|
||
|
virtual void operator++() {
|
||
|
if ( good() ) {
|
||
|
pBufCurrent++;
|
||
|
}
|
||
|
else {
|
||
|
status = false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
virtual void operator++(int) {
|
||
|
if ( good() ) {
|
||
|
pBufCurrent++;
|
||
|
}
|
||
|
else {
|
||
|
status = false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
virtual void operator--() {
|
||
|
if ( !fail() ) {
|
||
|
pBufCurrent--;
|
||
|
}
|
||
|
else {
|
||
|
status = false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
virtual void operator--(int) {
|
||
|
if ( !fail() ) {
|
||
|
pBufCurrent--;
|
||
|
}
|
||
|
else {
|
||
|
status = false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
virtual void operator+=(ulong offset) {
|
||
|
if (checkIndex(offset)) {
|
||
|
pBufCurrent += offset;
|
||
|
}
|
||
|
else {
|
||
|
status = false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
virtual void operator-=(ulong offset) {
|
||
|
if ((pBufCurrent-offset) >= bufBegin) {
|
||
|
pBufCurrent -= offset;
|
||
|
}
|
||
|
else {
|
||
|
status = false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
T operator*() {
|
||
|
if ( good() ) {
|
||
|
return *pBufCurrent;
|
||
|
}
|
||
|
else {
|
||
|
status = false;
|
||
|
return dummy;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
T& operator[](ulong index) {
|
||
|
if (checkIndex(index)) {
|
||
|
return pBufCurrent[index];
|
||
|
}
|
||
|
else {
|
||
|
status = false;
|
||
|
return dummy;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
virtual operator bool() { return status; }
|
||
|
|
||
|
protected:
|
||
|
T* bufBegin;
|
||
|
T* bufEnd;
|
||
|
T* pBufCurrent;
|
||
|
ulong bufLen;
|
||
|
bool status;
|
||
|
bool doFree;
|
||
|
T dummy;
|
||
|
};
|
||
|
|
||
|
|
||
|
template <class T> class smartPtr : public smartPtrBase<T> {
|
||
|
public:
|
||
|
smartPtr(T* buffer, ulong bufferLen, bool bufOwner = false)
|
||
|
: smartPtrBase<T>(buffer, bufferLen, bufOwner)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
smartPtr()
|
||
|
: smartPtrBase<T>(0,0)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
void setBuffer(T* buffer, ulong bufferLen) {
|
||
|
if ( bufferLen >= 1 ) {
|
||
|
this->pBufCurrent = ( this->bufBegin = buffer );
|
||
|
this->bufEnd = this->bufBegin + bufferLen;
|
||
|
this->bufLen = bufferLen;
|
||
|
this->status = true;
|
||
|
}
|
||
|
else {
|
||
|
this->pBufCurrent = this->bufBegin = this->bufEnd = 0;
|
||
|
this->bufLen = 0;
|
||
|
this->status = false;
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
#endif // SMARTPTR_H
|