1 | #pragma once |
2 | |
3 | #include <cstdlib> |
4 | #include <utility> |
5 | #include <boost/noncopyable.hpp> |
6 | |
7 | |
8 | namespace DB |
9 | { |
10 | |
11 | /** Aligned piece of memory. |
12 | * It can only be allocated and destroyed. |
13 | * MemoryTracker is not used. AlignedBuffer is intended for small pieces of memory. |
14 | */ |
15 | class AlignedBuffer : private boost::noncopyable |
16 | { |
17 | private: |
18 | void * buf = nullptr; |
19 | |
20 | void alloc(size_t size, size_t alignment); |
21 | void dealloc(); |
22 | |
23 | public: |
24 | AlignedBuffer() {} |
25 | AlignedBuffer(size_t size, size_t alignment); |
26 | AlignedBuffer(AlignedBuffer && old) { std::swap(buf, old.buf); } |
27 | ~AlignedBuffer(); |
28 | |
29 | void reset(size_t size, size_t alignment); |
30 | |
31 | char * data() { return static_cast<char *>(buf); } |
32 | const char * data() const { return static_cast<const char *>(buf); } |
33 | }; |
34 | |
35 | } |
36 | |
37 | |