LCOV - code coverage report
Current view: top level - ogr/ogrsf_frmts/flatgeobuf/flatbuffers - allocator.h (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 11 11 100.0 %
Date: 2024-05-15 13:15:52 Functions: 3 4 75.0 %

          Line data    Source code
       1             : /*
       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             : 
      22             : namespace flatbuffers {
      23             : 
      24             : // Allocator interface. This is flatbuffers-specific and meant only for
      25             : // `vector_downward` usage.
      26             : class Allocator {
      27             :  public:
      28        1058 :   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          48 :   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          48 :     FLATBUFFERS_ASSERT(new_size > old_size);  // vector_downward only grows
      45          48 :     uint8_t *new_p = allocate(new_size);
      46          48 :     memcpy_downward(old_p, old_size, new_p, new_size, in_use_back,
      47             :                     in_use_front);
      48          48 :     deallocate(old_p, old_size);
      49          48 :     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          48 :   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          48 :     memcpy(new_p + new_size - in_use_back, old_p + old_size - in_use_back,
      61             :            in_use_back);
      62          48 :     memcpy(new_p, old_p, in_use_front);
      63          48 :   }
      64             : };
      65             : 
      66             : }  // namespace flatbuffers
      67             : 
      68             : #endif  // FLATBUFFERS_ALLOCATOR_H_

Generated by: LCOV version 1.14