.. # Copyright (c) Lawrence Livermore National Security, LLC and other Conduit
.. # Project developers. See top-level LICENSE AND COPYRIGHT files for dates and
.. # other details. No copyright assignment is required to contribute to Conduit.

===================
Table Blueprint
===================
The *table* blueprint protocol provides a convention for expressing tabular data in Conduit.
Each data entry in a *table* represents a column and each column contains the same
number of rows.
Nodes that conform to the *table* blueprint protocol are easily translated to and from CSV files.

Protocol
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

To conform to the *table* blueprint protocol, a Node must have a "values" child which is a *list* OR an *object* and:

 * All of "values" children are data arrays OR *mcarrays*
 * All of "values" children must have the same number of elements

A node will also conform to the *table* blueprint protocol if it is a collection of tables.
A valid collection of *tables* must be a *list* OR an *object* and:

 * All of its children are valid *tables* as defined above.

Table Examples
~~~~~~~~~~~~~~~~~~~

An example of a *table* blueprint in yaml format:

.. code:: yaml

    values:
        scalar_column: [0, 1, 2, 3]
        vector_column:
            x: [0, 1, 2, 3]
            y: [0, 1, 2, 3]
            z: [0, 1, 2, 3]

An example of a collection of *tables* in yaml format:

.. code:: yaml

    point_data:
        values:
            points:
                x: [0, 1, 2, 3]
                y: [0, 1, 2, 3]
                z: [0, 1, 2, 3]
            scalar_data: [0, 1, 2, 3]
    element_data:
        values:
            scalar_data: [0, 1]
            vector_data:
                a: [0, 1]
                b: [0, 1]
                c: [0, 1]


The table blueprint namespace includes a function *basic()*, that generates a simple
example of tabular data.

.. code:: cpp

    conduit::blueprint::table::examples::basic(conduit::index_t nx,
                                               conduit::index_t ny,
                                               conduit::index_t nz,
                                               Node &res);

This function will generate points (points/x, points/y, points/z) in a uniform manner based off the arguments
*nx*, *ny*, and *nz*.
Also included in the output table is a point_data column that starts at 0 and increases by 1 for each point.

The resulting data is placed the Node *res*, which is passed in via a reference.

For more details, see the unit tests that exercise these examples in ``src/tests/blueprint/t_blueprint_table_verify.cpp``
and ``src/tests/blueprint/t_blueprint_table_examples.cpp``.

