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

.. default-domain:: cpp
.. highlight:: cpp

Getting Started
===============

The following articles demonstrate installation, use, and a basic understanding of Arrow.
These articles will get you setup quickly using Arrow and give you a taste of what the
library is capable of.
Specifically, it contains: an installation and linking guide; documentation of conventions used
in the codebase and suggested for users; and tutorials, including:

* Building Arrow arrays and tabular structures
* Reading and writing Parquet, Arrow, and CSV files
* Executing compute kernels on arrays
* Reading and writing multi-file partitioned datasets

Start here to gain a basic understanding of Arrow, and move on to the :doc:`/cpp/user_guide` to
explore more specific topics and underlying concepts, or the :doc:`/cpp/api` to explore Arrow's
API.

.. toctree::

   build_system
   conventions
   tutorials/basic_arrow.rst
   tutorials/io_tutorial.rst
   tutorials/compute_tutorial.rst
   tutorials/datasets_tutorial.rst
