OLD | NEW |
| (Empty) |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_FIXED_BUFFER_H_ | |
6 #define MOJO_PUBLIC_CPP_BINDINGS_LIB_FIXED_BUFFER_H_ | |
7 | |
8 #include "mojo/public/cpp/bindings/lib/buffer.h" | |
9 #include "mojo/public/cpp/system/macros.h" | |
10 | |
11 namespace mojo { | |
12 namespace internal { | |
13 | |
14 // FixedBuffer provides a simple way to allocate objects within a fixed chunk | |
15 // of memory. Objects are allocated by calling the |Allocate| method, which | |
16 // extends the buffer accordingly. Objects allocated in this way are not freed | |
17 // explicitly. Instead, they remain valid so long as the FixedBuffer remains | |
18 // valid. The Leak method may be used to steal the underlying memory from the | |
19 // FixedBuffer. | |
20 // | |
21 // Typical usage: | |
22 // | |
23 // { | |
24 // FixedBuffer buf(8 + 8); | |
25 // | |
26 // int* a = static_cast<int*>(buf->Allocate(sizeof(int))); | |
27 // *a = 2; | |
28 // | |
29 // double* b = static_cast<double*>(buf->Allocate(sizeof(double))); | |
30 // *b = 3.14f; | |
31 // | |
32 // void* data = buf.Leak(); | |
33 // Process(data); | |
34 // | |
35 // free(data); | |
36 // } | |
37 // | |
38 class FixedBuffer : public Buffer { | |
39 public: | |
40 explicit FixedBuffer(size_t size); | |
41 ~FixedBuffer() override; | |
42 | |
43 // Grows the buffer by |num_bytes| and returns a pointer to the start of the | |
44 // addition. The resulting address is 8-byte aligned, and the content of the | |
45 // memory is zero-filled. | |
46 void* Allocate(size_t num_bytes) override; | |
47 | |
48 size_t size() const { return size_; } | |
49 | |
50 // Returns the internal memory owned by the Buffer to the caller. The Buffer | |
51 // relinquishes its pointer, effectively resetting the state of the Buffer | |
52 // and leaving the caller responsible for freeing the returned memory address | |
53 // when no longer needed. | |
54 void* Leak(); | |
55 | |
56 private: | |
57 char* ptr_; | |
58 size_t cursor_; | |
59 size_t size_; | |
60 | |
61 MOJO_DISALLOW_COPY_AND_ASSIGN(FixedBuffer); | |
62 }; | |
63 | |
64 } // namespace internal | |
65 } // namespace mojo | |
66 | |
67 #endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_FIXED_BUFFER_H_ | |
OLD | NEW |