1/*
2 * Copyright 2014, Paweł Dziepak, pdziepak@quarnos.org.
3 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
4 * Distributed under the terms of the MIT License.
5 */
6#ifndef UTILITY_H
7#define UTILITY_H
8
9#include <OS.h>
10
11#include <string.h>
12
13#include <algorithm>
14
15
16#define	PAGE_MASK (B_PAGE_SIZE - 1)
17
18#define	PAGE_OFFSET(x) ((x) & (PAGE_MASK))
19#define	PAGE_BASE(x) ((x) & ~(PAGE_MASK))
20#define TO_PAGE_SIZE(x) ((x + (PAGE_MASK)) & ~(PAGE_MASK))
21
22
23extern "C" void dprintf(const char *format, ...);
24
25
26namespace utility {
27
28
29template<typename T>
30class vector {
31public:
32	inline			vector();
33
34			void	push_back(const T& value);
35			void	pop_back()	{ fSize--; }
36
37			T&		back()	{ return fData[fSize - 1]; }
38
39			T&		operator[](size_t idx)	{ return fData[idx]; }
40			const T&	operator[](size_t idx) const	{ return fData[idx]; }
41
42			size_t	size() const	{ return fSize; }
43			bool	empty() const	{ return size() == 0; }
44
45private:
46			void	_Grow();
47
48			size_t	fMaxSize;
49			size_t	fSize;
50			T*		fData;
51};
52
53
54template<typename T>
55vector<T>::vector()
56	:
57	fMaxSize(0),
58	fSize(0),
59	fData(NULL)
60{
61}
62
63
64template<typename T>
65void
66vector<T>::push_back(const T& value)
67{
68	if (fSize + 1 > fMaxSize)
69		_Grow();
70	fData[fSize++] = value;
71}
72
73
74template<typename T>
75void
76vector<T>::_Grow()
77{
78	size_t newSize = std::max(fMaxSize * 2, size_t(4));
79	T* newBuffer = new T[newSize];
80	if (fSize > 0) {
81		memcpy(newBuffer, fData, fSize * sizeof(T));
82		delete[] fData;
83	}
84	fData = newBuffer;
85	fMaxSize = newSize;
86}
87
88
89}	// namespace utility
90
91
92#endif	// UTILITY_H
93