// -------------------------------------------------------------------------- // // File // Name: Guards.h // Purpose: Classes which ensure things are closed/deleted properly when // going out of scope. Easy exception proof code, etc // Created: 2003/07/12 // // -------------------------------------------------------------------------- #ifndef GUARDS__H #define GUARDS__H #ifdef HAVE_UNISTD_H #include #endif #include #include #include #include #include #include #include "CommonException.h" #include "Logging.h" #include "MemLeakFindOn.h" template class FileHandleGuard { public: FileHandleGuard(const std::string& rFilename) : mOSFileHandle(::open(rFilename.c_str(), flags, mode)) { if(mOSFileHandle < 0) { THROW_SYS_FILE_ERROR("Failed to open file", rFilename, CommonException, OSFileOpenError); } } ~FileHandleGuard() { if(mOSFileHandle >= 0) { Close(); } } void Close() { if(mOSFileHandle < 0) { THROW_EXCEPTION(CommonException, FileAlreadyClosed) } if(::close(mOSFileHandle) != 0) { THROW_EXCEPTION(CommonException, OSFileCloseError) } mOSFileHandle = -1; } operator int() const { return mOSFileHandle; } private: int mOSFileHandle; }; template class MemoryBlockGuard { public: MemoryBlockGuard(int BlockSize) : mpBlock(::malloc(BlockSize)), mBlockSize(BlockSize) { if(mpBlock == 0) { throw std::bad_alloc(); } } MemoryBlockGuard(void *pBlock) : mpBlock(pBlock) { if(mpBlock == 0) { throw std::bad_alloc(); } } ~MemoryBlockGuard() { free(mpBlock); } operator type() const { return (type)mpBlock; } type GetPtr() const { return (type)mpBlock; } int GetSize() const { return mBlockSize; } void Resize(int NewSize) { void *ptrn = ::realloc(mpBlock, NewSize); if(ptrn == 0) { throw std::bad_alloc(); } mpBlock = ptrn; } void* Release() { void* pBlock = mpBlock; mpBlock = ::malloc(mBlockSize); if(mpBlock == 0) { throw std::bad_alloc(); } return pBlock; } private: void *mpBlock; int mBlockSize; }; #include "MemLeakFindOff.h" #endif // GUARDS__H