.. Licensed to the Apache Software Foundation (ASF) under one
.. or more contributor license agreements.  See the NOTICE file
.. distributed with this work for additional information
.. regarding copyright ownership.  The ASF licenses this file
.. to you under the Apache License, Version 2.0 (the
.. "License"); you may not use this file except in compliance
.. with the License.  You may obtain a copy of the License at

..   http://www.apache.org/licenses/LICENSE-2.0

.. Unless required by applicable law or agreed to in writing,
.. software distributed under the License is distributed on an
.. "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
.. KIND, either express or implied.  See the License for the
.. specific language governing permissions and limitations
.. under the License.

Memory (management)
===================

Devices
-------

.. doxygenclass:: arrow::Device
   :project: arrow_cpp
   :members:

.. doxygenclass:: arrow::CPUDevice
   :project: arrow_cpp
   :members:

.. doxygenfunction:: arrow::default_cpu_memory_manager
   :project: arrow_cpp

Memory Managers
---------------

.. doxygenclass:: arrow::MemoryManager
   :project: arrow_cpp
   :members:

.. doxygenclass:: arrow::CPUMemoryManager
   :project: arrow_cpp
   :members:

Buffers
-------

.. doxygenclass:: arrow::Buffer
   :members:

.. doxygenclass:: arrow::MutableBuffer
   :members:

.. doxygenclass:: arrow::ResizableBuffer
   :members:

Non-owning Buffer
-----------------

.. warning::
   This class is exposed solely as a building block for :class:`arrow::ArraySpan`.
   For any other purpose, please use :class:`arrow::Buffer`.

.. doxygenclass:: arrow::BufferSpan
   :members:

Memory Pools
------------

.. doxygenfunction:: arrow::default_memory_pool

.. doxygenfunction:: arrow::jemalloc_memory_pool

.. doxygenfunction:: arrow::mimalloc_memory_pool

.. doxygenfunction:: arrow::system_memory_pool

.. doxygenclass:: arrow::MemoryPool
   :members:

.. doxygenclass:: arrow::LoggingMemoryPool
   :members:

.. doxygenclass:: arrow::ProxyMemoryPool
   :members:

.. doxygenfunction:: arrow::SupportedMemoryBackendNames

Allocation Functions
--------------------

These functions allocate a buffer from a particular memory pool.

.. doxygengroup:: buffer-allocation-functions
   :content-only:

Slicing
-------

.. doxygengroup:: buffer-slicing-functions
   :content-only:

.. _cpp-api-buffer-builders:

Buffer Builders
---------------

.. doxygenclass:: arrow::BufferBuilder
   :members:

.. doxygenclass:: arrow::TypedBufferBuilder
   :members:

STL Integration
---------------

.. doxygenclass:: arrow::stl::allocator
   :members:

.. doxygenclass:: arrow::stl::STLMemoryPool
   :members:
