Skip to content

Latest commit

 

History

History
130 lines (89 loc) · 4.33 KB

tutorial_cpp_numeric.rst

File metadata and controls

130 lines (89 loc) · 4.33 KB

Accessing Numeric Data

Accessing Scalars and Arrays

You can access leaf types (numeric scalars or arrays) using Node's as_{type} methods.

.. literalinclude:: ../../tests/docs/t_conduit_docs_tutorial_numeric.cpp
   :start-after: BEGIN_EXAMPLE("numeric_as_dtype")
   :end-before:  END_EXAMPLE("numeric_as_dtype")
   :language: cpp
   :dedent: 4

.. literalinclude:: t_conduit_docs_tutorial_numeric_out.txt
   :start-after: BEGIN_EXAMPLE("numeric_as_dtype")
   :end-before:  END_EXAMPLE("numeric_as_dtype")

Or you can use Node::value(), which can infer the correct return type via a cast.

.. literalinclude:: ../../tests/docs/t_conduit_docs_tutorial_numeric.cpp
   :start-after: BEGIN_EXAMPLE("numeric_via_value")
   :end-before:  END_EXAMPLE("numeric_via_value")
   :language: cpp
   :dedent: 4

.. literalinclude:: t_conduit_docs_tutorial_numeric_out.txt
   :start-after: BEGIN_EXAMPLE("numeric_via_value")
   :end-before:  END_EXAMPLE("numeric_via_value")


Accessing array data via pointers works the same way, using Node's as_{type} methods.

.. literalinclude:: ../../tests/docs/t_conduit_docs_tutorial_numeric.cpp
   :start-after: BEGIN_EXAMPLE("numeric_ptr_as_dtype")
   :end-before:  END_EXAMPLE("numeric_ptr_as_dtype")
   :language: cpp
   :dedent: 4

.. literalinclude:: t_conduit_docs_tutorial_numeric_out.txt
   :start-after: BEGIN_EXAMPLE("numeric_ptr_as_dtype")
   :end-before:  END_EXAMPLE("numeric_ptr_as_dtype")


Or using Node::value():

.. literalinclude:: ../../tests/docs/t_conduit_docs_tutorial_numeric.cpp
   :start-after: BEGIN_EXAMPLE("numeric_ptr_via_value")
   :end-before:  END_EXAMPLE("numeric_ptr_via_value")
   :language: cpp
   :dedent: 4

.. literalinclude:: t_conduit_docs_tutorial_numeric_out.txt
   :start-after: BEGIN_EXAMPLE("numeric_ptr_via_value")
   :end-before:  END_EXAMPLE("numeric_ptr_via_value")



For non-contiguous arrays, direct pointer access is complex due to the indexing required. Conduit provides a simple DataArray class that handles per-element indexing for all types of arrays.

.. literalinclude:: ../../tests/docs/t_conduit_docs_tutorial_numeric.cpp
   :start-after: BEGIN_EXAMPLE("numeric_strided_data_array")
   :end-before:  END_EXAMPLE("numeric_strided_data_array")
   :language: cpp
   :dedent: 4

.. literalinclude:: t_conduit_docs_tutorial_numeric_out.txt
   :start-after: BEGIN_EXAMPLE("numeric_strided_data_array")
   :end-before:  END_EXAMPLE("numeric_strided_data_array")

C++11 Initializer Lists

When C++11 support is enabled you can set Node values using initializer lists with numeric literals.

.. literalinclude:: ../../tests/docs/t_conduit_docs_tutorial_numeric.cpp
   :start-after: BEGIN_EXAMPLE("numeric_cxx11_init")
   :end-before:  END_EXAMPLE("numeric_cxx11_init")
   :language: cpp
   :dedent: 4


.. literalinclude:: t_conduit_docs_tutorial_numeric_out.txt
   :start-after: BEGIN_EXAMPLE("numeric_cxx11_init")
   :end-before:  END_EXAMPLE("numeric_cxx11_init")


Using Introspection and Conversion

In this example, we have an array in a node that we are interested in processing using an existing function that only handles doubles. We ensure the node is compatible with the function, or transform it to a contiguous double array.

.. literalinclude:: ../../tests/docs/t_conduit_docs_tutorial_numeric.cpp
   :start-after: _conduit_tutorial_cpp_numeric_introspection_start
   :end-before:  _conduit_tutorial_cpp_numeric_introspection_end
   :language: cpp


.. literalinclude:: t_conduit_docs_tutorial_numeric_out.txt
   :start-after: BEGIN_EXAMPLE("numeric_double_conversion")
   :end-before:  END_EXAMPLE("numeric_double_conversion")