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_BINDINGS_LIB_FIXED_BUFFER_H_ | |
6 #define MOJO_PUBLIC_BINDINGS_LIB_FIXED_BUFFER_H_ | |
7 | |
8 #include "mojo/public/cpp/bindings/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 virtual ~FixedBuffer(); | |
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 virtual void* Allocate(size_t num_bytes, Destructor func = NULL) | |
47 MOJO_OVERRIDE; | |
48 | |
49 size_t size() const { return size_; } | |
50 | |
51 // Returns the internal memory owned by the Buffer to the caller. The Buffer | |
52 // relinquishes its pointer, effectively resetting the state of the Buffer | |
53 // and leaving the caller responsible for freeing the returned memory address | |
54 // when no longer needed. | |
55 void* Leak(); | |
56 | |
57 private: | |
58 char* ptr_; | |
59 size_t cursor_; | |
60 size_t size_; | |
61 | |
62 MOJO_DISALLOW_COPY_AND_ASSIGN(FixedBuffer); | |
63 }; | |
64 | |
65 } // namespace internal | |
66 } // namespace mojo | |
67 | |
68 #endif // MOJO_PUBLIC_BINDINGS_LIB_FIXED_BUFFER_H_ | |
OLD | NEW |