xref: /haiku/src/system/runtime_loader/utility.h (revision 21258e2674226d6aa732321b6f8494841895af5f)
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 
23 extern "C" void dprintf(const char *format, ...);
24 
25 
26 namespace utility {
27 
28 
29 template<typename T>
30 class vector {
31 public:
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 
45 private:
46 			void	_Grow();
47 
48 			size_t	fMaxSize;
49 			size_t	fSize;
50 			T*		fData;
51 };
52 
53 
54 template<typename T>
55 vector<T>::vector()
56 	:
57 	fMaxSize(0),
58 	fSize(0),
59 	fData(NULL)
60 {
61 }
62 
63 
64 template<typename T>
65 void
66 vector<T>::push_back(const T& value)
67 {
68 	if (fSize + 1 > fMaxSize)
69 		_Grow();
70 	fData[fSize++] = value;
71 }
72 
73 
74 template<typename T>
75 void
76 vector<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