1//----------------------------------------------------------------------
2//  This software is part of the Haiku distribution and is covered
3//  by the MIT License.
4//
5//  Copyright (c) 2003 Tyler Dauwalder, tyler@dauwalder.net
6//---------------------------------------------------------------------
7
8#ifndef _UDF_MEMORY_CHUNK_H
9#define _UDF_MEMORY_CHUNK_H
10
11#include <malloc.h>
12
13#include <util/kernel_cpp.h>
14
15/*! Simple class to encapsulate the boring details of allocating
16	and deallocating a chunk of memory.
17
18	The main use for this class is cleanly and simply allocating
19	arbitrary chunks of data on the stack.
20*/
21class MemoryChunk {
22public:
23	MemoryChunk(uint32 blockSize)
24		: fSize(blockSize)
25		, fData(malloc(blockSize))
26		, fOwnsData(true)
27	{
28	}
29
30	MemoryChunk(uint32 blockSize, void *blockData)
31		: fSize(blockSize)
32		, fData(blockData)
33		, fOwnsData(false)
34	{
35	}
36
37	~MemoryChunk()
38	{
39		if (fOwnsData)
40			free(Data());
41	}
42
43	uint32 Size() { return fSize; }
44	void* Data() { return fData; }
45	status_t InitCheck() { return Data() ? B_OK : B_NO_MEMORY; }
46
47private:
48	MemoryChunk();
49	MemoryChunk(const MemoryChunk&);
50	MemoryChunk& operator=(const MemoryChunk&);
51
52	uint32 fSize;
53	void *fData;
54	bool fOwnsData;
55};
56
57template <uint32 size>
58class StaticMemoryChunk {
59public:
60	uint32 Size() { return size; }
61	void* Data() { return reinterpret_cast<void*>(fData); }
62	status_t InitCheck() { return B_OK; }
63
64private:
65	uint8 fData[size];
66};
67
68#endif	// _UDF_MEMORY_CHUNK_H
69