1//===----------------------------------------------------------------------===//
2// DuckDB
3//
4// duckdb/common/arrow/arrow_buffer.hpp
5//
6//
7//===----------------------------------------------------------------------===//
8
9#pragma once
10
11#include "duckdb/common/common.hpp"
12
13struct ArrowSchema;
14
15namespace duckdb {
16
17struct ArrowBuffer {
18 static constexpr const idx_t MINIMUM_SHRINK_SIZE = 4096;
19
20 ArrowBuffer() : dataptr(nullptr), count(0), capacity(0) {
21 }
22 ~ArrowBuffer() {
23 if (!dataptr) {
24 return;
25 }
26 free(ptr: dataptr);
27 dataptr = nullptr;
28 count = 0;
29 capacity = 0;
30 }
31 // disable copy constructors
32 ArrowBuffer(const ArrowBuffer &other) = delete;
33 ArrowBuffer &operator=(const ArrowBuffer &) = delete;
34 //! enable move constructors
35 ArrowBuffer(ArrowBuffer &&other) noexcept {
36 std::swap(a&: dataptr, b&: other.dataptr);
37 std::swap(a&: count, b&: other.count);
38 std::swap(a&: capacity, b&: other.capacity);
39 }
40 ArrowBuffer &operator=(ArrowBuffer &&other) noexcept {
41 std::swap(a&: dataptr, b&: other.dataptr);
42 std::swap(a&: count, b&: other.count);
43 std::swap(a&: capacity, b&: other.capacity);
44 return *this;
45 }
46
47 void reserve(idx_t bytes) { // NOLINT
48 auto new_capacity = NextPowerOfTwo(v: bytes);
49 if (new_capacity <= capacity) {
50 return;
51 }
52 ReserveInternal(bytes: new_capacity);
53 }
54
55 void resize(idx_t bytes) { // NOLINT
56 reserve(bytes);
57 count = bytes;
58 }
59
60 void resize(idx_t bytes, data_t value) { // NOLINT
61 reserve(bytes);
62 for (idx_t i = count; i < bytes; i++) {
63 dataptr[i] = value;
64 }
65 count = bytes;
66 }
67
68 idx_t size() { // NOLINT
69 return count;
70 }
71
72 data_ptr_t data() { // NOLINT
73 return dataptr;
74 }
75
76 template <class T>
77 T *GetData() {
78 return reinterpret_cast<T *>(data());
79 }
80
81private:
82 void ReserveInternal(idx_t bytes) {
83 if (dataptr) {
84 dataptr = data_ptr_cast(src: realloc(ptr: dataptr, size: bytes));
85 } else {
86 dataptr = data_ptr_cast(src: malloc(size: bytes));
87 }
88 capacity = bytes;
89 }
90
91private:
92 data_ptr_t dataptr = nullptr;
93 idx_t count = 0;
94 idx_t capacity = 0;
95};
96
97} // namespace duckdb
98