From db86cc4dc393a3bf91567367869604530f8f2c4e Mon Sep 17 00:00:00 2001 From: Lynix Date: Thu, 3 Jan 2013 16:24:59 +0100 Subject: [PATCH] Added BufferMapper class Used to map/unmap a buffer automatically and provide a RAII exception-safe class Former-commit-id: 2a4fd2e19ce3531639a86520876a3615846b27f4 --- include/Nazara/Utility/BufferMapper.hpp | 34 +++++++++++++ include/Nazara/Utility/BufferMapper.inl | 67 +++++++++++++++++++++++++ 2 files changed, 101 insertions(+) create mode 100644 include/Nazara/Utility/BufferMapper.hpp create mode 100644 include/Nazara/Utility/BufferMapper.inl diff --git a/include/Nazara/Utility/BufferMapper.hpp b/include/Nazara/Utility/BufferMapper.hpp new file mode 100644 index 000000000..99c2bcf4a --- /dev/null +++ b/include/Nazara/Utility/BufferMapper.hpp @@ -0,0 +1,34 @@ +// Copyright (C) 2012 Jérôme Leclercq +// This file is part of the "Nazara Engine - Utility module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#pragma once + +#ifndef NAZARA_BUFFERMAPPER_HPP +#define NAZARA_BUFFERMAPPER_HPP + +#include + +template +class NzBufferMapper +{ + public: + NzBufferMapper(T* buffer, nzBufferAccess access, unsigned int offset = 0, unsigned int length = 0); + NzBufferMapper(T& buffer, nzBufferAccess access, unsigned int offset = 0, unsigned int length = 0); + NzBufferMapper(const T* buffer, nzBufferAccess access, unsigned int offset = 0, unsigned int length = 0); + NzBufferMapper(const T& buffer, nzBufferAccess access, unsigned int offset = 0, unsigned int length = 0); + ~NzBufferMapper(); + + const T* GetBuffer() const; + void* GetPointer() const; + + void Unmap(); + + private: + const T* m_buffer; + void* m_ptr; +}; + +#include + +#endif // NAZARA_BUFFERMAPPER_HPP diff --git a/include/Nazara/Utility/BufferMapper.inl b/include/Nazara/Utility/BufferMapper.inl new file mode 100644 index 000000000..5b0b0d77f --- /dev/null +++ b/include/Nazara/Utility/BufferMapper.inl @@ -0,0 +1,67 @@ +// Copyright (C) 2012 Jérôme Leclercq +// This file is part of the "Nazara Engine - Core module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +// http://www.easyrgb.com/index.php?X=MATH + +#include +#include +#include + +template +NzBufferMapper::NzBufferMapper(T* buffer, nzBufferAccess access, unsigned int offset, unsigned int length) : +m_buffer(buffer) +{ + m_ptr = buffer->Map(access, offset, length); + if (!m_ptr) + NazaraError("Failed to map buffer"); ///TODO: Unexpected +} + +template +NzBufferMapper::NzBufferMapper(T& buffer, nzBufferAccess access, unsigned int offset, unsigned int length) : +NzBufferMapper(&buffer, access, offset, length) +{ +} + +template +NzBufferMapper::NzBufferMapper(const T* buffer, nzBufferAccess access, unsigned int offset, unsigned int length) : +m_buffer(buffer) +{ + m_ptr = buffer->Map(access, offset, length); + if (!m_ptr) + NazaraError("Failed to map buffer"); ///TODO: Unexpected +} + +template +NzBufferMapper::NzBufferMapper(const T& buffer, nzBufferAccess access, unsigned int offset, unsigned int length) : +NzBufferMapper(&buffer, access, offset, length) +{ +} + +template +NzBufferMapper::~NzBufferMapper() +{ + if (m_buffer) + m_buffer->Unmap(); +} + +template +const T* NzBufferMapper::GetBuffer() const +{ + return m_buffer; +} + +template +void* NzBufferMapper::GetPointer() const +{ + return m_ptr; +} + +template +void NzBufferMapper::Unmap() +{ + m_buffer->Unmap(); + m_buffer = nullptr; +} + +#include