blob: f4ef22db458b639863f09fc5121883515b6eaa4c [file] [log] [blame]
James Kuszmaul8e62b022022-03-22 09:33:25 -07001/*
2 * Copyright 2021 Google Inc. All rights reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef FLATBUFFERS_ALLOCATOR_H_
18#define FLATBUFFERS_ALLOCATOR_H_
19
20#include "flatbuffers/base.h"
21
22namespace flatbuffers {
23
24// Allocator interface. This is flatbuffers-specific and meant only for
25// `vector_downward` usage.
26class Allocator {
27 public:
28 virtual ~Allocator() {}
29
30 // Allocate `size` bytes of memory.
31 virtual uint8_t *allocate(size_t size) = 0;
32
33 // Deallocate `size` bytes of memory at `p` allocated by this allocator.
34 virtual void deallocate(uint8_t *p, size_t size) = 0;
35
36 // Reallocate `new_size` bytes of memory, replacing the old region of size
37 // `old_size` at `p`. In contrast to a normal realloc, this grows downwards,
38 // and is intended specifcally for `vector_downward` use.
39 // `in_use_back` and `in_use_front` indicate how much of `old_size` is
40 // actually in use at each end, and needs to be copied.
41 virtual uint8_t *reallocate_downward(uint8_t *old_p, size_t old_size,
42 size_t new_size, size_t in_use_back,
43 size_t in_use_front) {
44 FLATBUFFERS_ASSERT(new_size > old_size); // vector_downward only grows
45 uint8_t *new_p = allocate(new_size);
46 memcpy_downward(old_p, old_size, new_p, new_size, in_use_back,
47 in_use_front);
48 deallocate(old_p, old_size);
49 return new_p;
50 }
51
52 protected:
53 // Called by `reallocate_downward` to copy memory from `old_p` of `old_size`
54 // to `new_p` of `new_size`. Only memory of size `in_use_front` and
55 // `in_use_back` will be copied from the front and back of the old memory
56 // allocation.
57 void memcpy_downward(uint8_t *old_p, size_t old_size, uint8_t *new_p,
58 size_t new_size, size_t in_use_back,
59 size_t in_use_front) {
60 memcpy(new_p + new_size - in_use_back, old_p + old_size - in_use_back,
61 in_use_back);
62 memcpy(new_p, old_p, in_use_front);
63 }
64};
65
66} // namespace flatbuffers
67
68#endif // FLATBUFFERS_ALLOCATOR_H_