.. 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.

========================
Two-dimensional Datasets
========================

Record Batches
==============

.. doxygenclass:: arrow::RecordBatch
   :project: arrow_cpp
   :members:

.. doxygenclass:: arrow::RecordBatchReader
   :project: arrow_cpp
   :members:

.. doxygenclass:: arrow::TableBatchReader
   :project: arrow_cpp
   :members:

Tables
======

.. doxygenclass:: arrow::Table
   :project: arrow_cpp
   :members:

.. doxygenfunction:: arrow::ConcatenateTables
   :project: arrow_cpp

.. doxygenfunction:: arrow::PromoteTableToSchema(const std::shared_ptr<Table> &table, const std::shared_ptr<Schema> &schema, MemoryPool *pool)
   :project: arrow_cpp

.. doxygenfunction:: arrow::PromoteTableToSchema(const std::shared_ptr<Table> &table, const std::shared_ptr<Schema> &schema, const compute::CastOptions &options, MemoryPool *pool)
   :project: arrow_cpp
