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

.. _implementations:

Apache Paimon C++
=================

Paimon C++ is a high-performance C++ implementation of Apache Paimon. We aim to
provide a native, high-performance and extensible implementation that allows
native engines to access the Paimon datalake format with maximum efficiency.

.. grid:: 1 2 2 2
   :gutter: 4
   :padding: 2 2 0 0
   :class-container: sd-text-center

   .. grid-item-card:: Getting started
      :class-card: contrib-card
      :shadow: none

      Start here to gain a basic understanding of Paimon with
      an installation and linking guide, basic concepts etc.

      +++

      .. button-link:: getting_started.html
         :click-parent:
         :color: primary
         :expand:

         To Getting started

   .. grid-item-card:: User Guide
      :class-card: contrib-card
      :shadow: none

      Explore more specific topics and underlying concepts
      of Paimon C++

      +++

      .. button-link:: user_guide.html
         :click-parent:
         :color: primary
         :expand:

         To the User Guide

.. grid:: 1 2 2 2
   :gutter: 4
   :padding: 2 2 0 0
   :class-container: sd-text-center

   .. grid-item-card:: Examples
      :class-card: contrib-card
      :shadow: none

      Find the description and location of the examples
      using Paimon C++ library

      +++

      .. button-link:: examples/index.html
         :click-parent:
         :color: primary
         :expand:

         To the Examples

   .. grid-item-card:: API Reference
      :class-card: contrib-card
      :shadow: none

      Explore Paimon's API reference documentation

      +++

      .. button-link:: api.html
         :click-parent:
         :color: primary
         :expand:

         To the API Reference


.. toctree::
   :maxdepth: 2
   :hidden:

   getting_started
   user_guide
   Examples <examples/index>
   api
