diff --git a/src/cmake/Setup3rdParty.cmake b/src/cmake/Setup3rdParty.cmake
index ee53a6fe6..11171eaf5 100644
--- a/src/cmake/Setup3rdParty.cmake
+++ b/src/cmake/Setup3rdParty.cmake
@@ -190,3 +190,14 @@ if(CALIPER_DIR)
message(FATAL_ERROR "CALIPER_DIR is set, but Caliper wasn't found.")
endif()
endif()
+
+################################
+# Setup Totalview if available
+################################
+# Search for Totalview.
+if(TOTALVIEW_DIR)
+ include(cmake/thirdparty/SetupTotalview.cmake)
+ if(NOT TOTALVIEW_FOUND)
+ message(WARNING "TOTALVIEW_DIR is set, but Totalview wasn't found.")
+ endif()
+endif()
diff --git a/src/cmake/thirdparty/SetupTotalview.cmake b/src/cmake/thirdparty/SetupTotalview.cmake
new file mode 100644
index 000000000..a5ce9a347
--- /dev/null
+++ b/src/cmake/thirdparty/SetupTotalview.cmake
@@ -0,0 +1,29 @@
+# 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.
+###############################################################################
+#
+# Setup TOTALVIEW
+
+
+# first Check for TOTALVIEW_DIR
+
+if(TOTALVIEW_DIR)
+
+ find_path(TOTALVIEW_INCLUDE_DIRECTORIES
+ tv_data_display.h
+ NO_DEFAULT_PATH
+ PATHS ${TOTALVIEW_DIR}/include)
+
+ find_path(TOTALVIEW_SOURCE_DIRECTORY
+ tv_data_display.c
+ NO_DEFAULT_PATH
+ PATHS ${TOTALVIEW_DIR}/src)
+
+ if (TOTALVIEW_INCLUDE_DIRECTORIES)
+ set(TOTALVIEW_FOUND TRUE)
+ set(CONDUIT_USE_TOTALVIEW TRUE)
+ set(CONDUIT_EXCLUDE_TV_DATA_DISPLAY FALSE)
+ endif()
+
+endif()
diff --git a/src/debug/gdb/conduit-gdb.py b/src/debug/gdb/conduit-gdb.py
new file mode 100644
index 000000000..c33db8e40
--- /dev/null
+++ b/src/debug/gdb/conduit-gdb.py
@@ -0,0 +1,216 @@
+# 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.
+
+import gdb
+import gdb.printing
+import itertools
+
+
+class ConduitTypes:
+ """Represent Conduit TypeIDs."""
+ def __init__(self):
+ self.EMPTY_ID = gdb.parse_and_eval("(int)conduit::DataType::EMPTY_ID");
+ self.OBJECT_ID = gdb.parse_and_eval("(int)conduit::DataType::OBJECT_ID");
+ self.LIST_ID = gdb.parse_and_eval("(int)conduit::DataType::LIST_ID");
+ self.INT8_ID = gdb.parse_and_eval("(int)conduit::DataType::INT8_ID");
+ self.INT16_ID = gdb.parse_and_eval("(int)conduit::DataType::INT16_ID");
+ self.INT32_ID = gdb.parse_and_eval("(int)conduit::DataType::INT32_ID");
+ self.INT64_ID = gdb.parse_and_eval("(int)conduit::DataType::INT64_ID");
+ self.UINT8_ID = gdb.parse_and_eval("(int)conduit::DataType::UINT8_ID");
+ self.UINT16_ID = gdb.parse_and_eval("(int)conduit::DataType::UINT16_ID");
+ self.UINT32_ID = gdb.parse_and_eval("(int)conduit::DataType::UINT32_ID");
+ self.UINT64_ID = gdb.parse_and_eval("(int)conduit::DataType::UINT64_ID");
+ self.FLOAT32_ID = gdb.parse_and_eval("(int)conduit::DataType::FLOAT32_ID");
+ self.FLOAT64_ID = gdb.parse_and_eval("(int)conduit::DataType::FLOAT64_ID");
+ self.CHAR8_STR_ID = gdb.parse_and_eval("(int)conduit::DataType::CHAR8_STR_ID");
+
+ def type_string(self, val):
+ dtype_id = self.node_type(val)
+ tp = ""
+ if dtype_id == self.INT8_ID:
+ tp = "char"
+ elif dtype_id == self.INT16_ID:
+ tp = "short"
+ elif dtype_id == self.INT32_ID:
+ tp = "int"
+ elif dtype_id == self.INT64_ID:
+ tp = "long"
+ elif dtype_id == self.UINT8_ID:
+ tp = "unsigned char"
+ elif dtype_id == self.UINT16_ID:
+ tp = "unsigned short"
+ elif dtype_id == self.UINT32_ID:
+ tp = "unsigned int"
+ elif dtype_id == self.UINT64_ID:
+ tp = "unsigned long"
+ elif dtype_id == self.FLOAT32_ID:
+ tp = "float"
+ elif dtype_id == self.FLOAT64_ID:
+ tp = "double"
+
+ return tp
+
+ def node_type(self, val):
+ dtype_id = val['m_schema'].dereference()
+ int_t = gdb.lookup_type('int')
+ return dtype_id['m_dtype']['m_id'].cast(int_t)
+
+class EmptyNodePrinter:
+ """Print an empty conduit::Node object."""
+
+ def __init__(self):
+ pass
+
+ def to_string(self):
+ return "empty Node"
+
+
+class StringNodePrinter:
+ """Print a string conduit::Node object."""
+
+ def __init__(self, val, types):
+ self.types = types
+ self.val = val
+
+ def to_string(self):
+ t = gdb.lookup_type('const char *').pointer()
+ v = self.val['m_data'].cast(t)
+ return v
+
+ def display_hint(self):
+ return 'string'
+
+class ArrayNodePrinter:
+ """Print an array numeric conduit::Node object."""
+
+ def __init__(self, val, types):
+ self.types = types
+ self.val = val
+ self.num_elts = self.val['m_schema'].dereference()['m_dtype']['m_num_ele']
+
+ def to_string(self):
+ return "{{ array length {0} }}".format(self.num_elts)
+
+ def children (self):
+ tp = self.types.type_string(self.val)
+ t = gdb.lookup_type(tp).pointer()
+ v = self.val['m_data'].cast(t)
+
+ for i in range(self.num_elts):
+ yield "[{0}]".format(i), v[i]
+
+ def display_hint(self):
+ return 'array'
+
+
+class ScalarNodePrinter:
+ """Print a scalar numeric conduit::Node object."""
+
+ def __init__(self, val, types):
+ self.types = types
+ self.val = val
+
+ def to_string(self):
+ tp = self.types.type_string(self.val)
+ t = gdb.lookup_type(tp).pointer()
+ v = self.val['m_data'].cast(t)
+ return v[0]
+
+class TreeNodePrinter:
+ """Let subclasses count children."""
+
+ def __init__(self, types):
+ self.types = types
+
+ def count_children(self, val):
+ dtype_id = self.types.node_type(val)
+
+ tp = ''
+ if dtype_id == self.types.OBJECT_ID:
+ tp = 'conduit::Schema::Schema_Object_Hierarchy'
+ elif dtype_id == self.types.LIST_ID:
+ tp = 'conduit::Schema::Schema_List_Hierarchy'
+
+ t = gdb.lookup_type(tp).pointer()
+ hier_data = val['m_schema'].dereference()['m_hierarchy_data'].cast(t).dereference()['children']
+ hier_data_first = hier_data['_M_impl']['_M_start']
+ hier_data_last = hier_data['_M_impl']['_M_finish']
+ return hier_data_last - hier_data_first
+
+
+class ListNodePrinter(TreeNodePrinter):
+ """Print a list conduit::Node object."""
+
+ def __init__(self, val, types):
+ super().__init__(types)
+ self.val = val
+ self.num_children = self.count_children(val)
+
+ def to_string(self):
+ return "{{ list length {0} }}".format(self.num_children)
+
+ def display_hint(self):
+ return 'array'
+
+ def children (self):
+ for i in range(self.num_children):
+ yield ("[{0}]".format(i),
+ self.val['m_children']['_M_impl']['_M_start'][i].dereference())
+ # yield ("idx", "lv")
+
+
+class ObjectNodePrinter(TreeNodePrinter):
+ """Print an object conduit::Node object."""
+
+ def __init__(self, val, types):
+ super().__init__(types)
+ self.val = val
+ self.num_children = self.count_children(val)
+
+ def to_string(self):
+ return "{{ object children {0} }}".format(self.num_children)
+
+ def display_hint(self):
+ return 'map'
+
+ def children (self):
+ names = self.object_children_names()
+
+ for i in range(2*self.num_children):
+ yield ("{0}".format(names[i]),
+ self.val['m_children']['_M_impl']['_M_start'][i].dereference())
+ # return [("blah", "1"), ("blah", "a"), ("blah", "2"), ("blah", "b"), ("blah","3"), ("blah", "c")]
+
+ def object_children_names(self):
+ dtype_id = self.types.node_type(self.val)
+
+ if dtype_id == self.types.OBJECT_ID:
+ tp = 'conduit::Schema::Schema_Object_Hierarchy'
+ t = gdb.lookup_type(tp).pointer()
+ return self.val['m_schema'].dereference()['m_hierarchy_data'].cast(t)['object_order']['_M_impl']['_M_start']
+ else:
+ return None
+
+def node_pp_function(val):
+ if str(val.type) == 'conduit::Node':
+ types = ConduitTypes()
+ tid = types.node_type(val)
+ if tid == types.EMPTY_ID:
+ return EmptyNodePrinter()
+ elif tid == types.CHAR8_STR_ID:
+ return StringNodePrinter(val, types)
+ elif tid == types.LIST_ID:
+ return ListNodePrinter(val, types)
+ elif tid == types.OBJECT_ID:
+ return ObjectNodePrinter(val, types)
+ else:
+ elt_count = val['m_schema'].dereference()['m_dtype']['m_num_ele']
+ if elt_count < 2:
+ return ScalarNodePrinter(val, types)
+ else:
+ return ArrayNodePrinter(val, types)
+ return None
+
+
+gdb.pretty_printers.append(node_pp_function)
diff --git a/src/debug/msvs/ConduitNode.natvis b/src/debug/msvs/ConduitNode.natvis
new file mode 100644
index 000000000..d3a33d77f
--- /dev/null
+++ b/src/debug/msvs/ConduitNode.natvis
@@ -0,0 +1,78 @@
+
+
+
+
+ empty conduit::Node
+ object {{ size: { m_children.size() } }}
+ list {{ size: { m_children.size() } }}
+ int8 {{ size: {m_schema->m_dtype.m_num_ele} }}
+ int16 {{ size: {m_schema->m_dtype.m_num_ele} }}
+ int32 {{ size: {m_schema->m_dtype.m_num_ele} }}
+ int64 {{ size: {m_schema->m_dtype.m_num_ele} }}
+ uint8 {{ size: {m_schema->m_dtype.m_num_ele} }}
+ uint16 {{ size: {m_schema->m_dtype.m_num_ele} }}
+ int32 {{ size: {m_schema->m_dtype.m_num_ele} }}
+ int64 {{ size: {m_schema->m_dtype.m_num_ele} }}
+ float {{ size: {m_schema->m_dtype.m_num_ele} }}
+ double {{ size: {m_schema->m_dtype.m_num_ele} }}
+ string: { (char *)m_data }
+ leaf value
+
+
+ m_children.size()
+ m_children._Mypair._Myval2._Myfirst
+
+
+
+
+ m_children.size()
+
+
+
+ - m_children[i]
+ i++
+
+
+
+ m_schema->m_dtype.m_num_ele
+ (signed char *)m_data
+
+
+ m_schema->m_dtype.m_num_ele
+ (signed short *)m_data
+
+
+ m_schema->m_dtype.m_num_ele
+ (signed int *)m_data
+
+
+ m_schema->m_dtype.m_num_ele
+ (signed long *)m_data
+
+
+ m_schema->m_dtype.m_num_ele
+ (unsigned char *)m_data
+
+
+ m_schema->m_dtype.m_num_ele
+ (unsigned short *)m_data
+
+
+ m_schema->m_dtype.m_num_ele
+ (unsigned int *)m_data
+
+
+ m_schema->m_dtype.m_num_ele
+ (unsigned long *)m_data
+
+
+ m_schema->m_dtype.m_num_ele
+ (float *)m_data
+
+
+ m_schema->m_dtype.m_num_ele
+ (double *)m_data
+
+
+
+
diff --git a/src/docs/sphinx/debugger_MSVS_Conduit_list.png b/src/docs/sphinx/debugger_MSVS_Conduit_list.png
new file mode 100644
index 000000000..41dd258ba
Binary files /dev/null and b/src/docs/sphinx/debugger_MSVS_Conduit_list.png differ
diff --git a/src/docs/sphinx/debugger_Totalview_Conduit_list_datawindows.png b/src/docs/sphinx/debugger_Totalview_Conduit_list_datawindows.png
new file mode 100644
index 000000000..5c1b55457
Binary files /dev/null and b/src/docs/sphinx/debugger_Totalview_Conduit_list_datawindows.png differ
diff --git a/src/docs/sphinx/debugger_Totalview_Conduit_list_mainwindow.png b/src/docs/sphinx/debugger_Totalview_Conduit_list_mainwindow.png
new file mode 100644
index 000000000..eece91fc0
Binary files /dev/null and b/src/docs/sphinx/debugger_Totalview_Conduit_list_mainwindow.png differ
diff --git a/src/docs/sphinx/tutorial_cpp.rst b/src/docs/sphinx/tutorial_cpp.rst
index fb28ea8d4..abfb13ae0 100644
--- a/src/docs/sphinx/tutorial_cpp.rst
+++ b/src/docs/sphinx/tutorial_cpp.rst
@@ -22,5 +22,5 @@ with C++ and Python examples.
tutorial_cpp_move_and_swap
tutorial_cpp_utils
tutorial_cpp_errors
-
+ tutorial_cpp_debugger
diff --git a/src/docs/sphinx/tutorial_cpp_debugger.rst b/src/docs/sphinx/tutorial_cpp_debugger.rst
new file mode 100644
index 000000000..82d03fc7f
--- /dev/null
+++ b/src/docs/sphinx/tutorial_cpp_debugger.rst
@@ -0,0 +1,52 @@
+.. # 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.
+
+============================================
+Debugger Integration
+============================================
+
+Conduit provides files to display Nodes more intuitively within the MS Visual Studio, Totalview, and GDB debuggers. This complements Conduit's exensive support for writing Nodes as text and to various file formats.
+
+MS Visual Studio
+----------------
+
+MS Visual Studio uses `XML files`_ with the extension .natvis to display custom classes. The file ``conduit\src\debug\msvs\ConduitNode.natvis`` will allow Visual Studio to display most Nodes properly. If you used CMake (stand-alone or through Visual Studio) to generate the project files, ConduitNode.natvis should already be added to the conduit project file. If you need to add the .natvis file to an existing project, follow the `instructions`_ on Microsoft's web page for .natvis files.
+
+.. _XML files: https://learn.microsoft.com/en-us/visualstudio/debugger/create-custom-views-of-native-objects
+
+.. _instructions: https://learn.microsoft.com/en-us/visualstudio/debugger/create-custom-views-of-native-objects#add-a-natvis-file-to-a-c-project
+
+.. image:: debugger_MSVS_Conduit_list.png
+ :width: 772
+ :alt: Screenshot of MS Visual Studio debugger session using ConduitNode.natvis, showing list, scalar, object, and array Nodes
+
+The screenshot above shows how Visual Studio shows scalar, array, list, and object Nodes.
+
+Because of limits on what a .natvis file can do, adding and removing child Nodes from an object Node can get the object in a state where the .natvis cannot understand it and shows incorrect data. If you don't remove child Nodes from an object, the visualizer should show the correct data structure.
+
+Totalview
+---------
+
+To display custom C++ objects, Totalview `requires you`_ to compile some extra functions into your code. To display a Node, Conduit provides ``int TV_ttf_display_type ( const conduit::Node *n )`` in ``conduit/src/libs/conduit/debug/conduit_node_totalview.cpp``. To configure Conduit with Totalview support, specify the Totalview directory, which must contain ``include/tv_data_display.h``, on your CMake command line by adding ``-DTOTALVIEW_DIR=/full/path/to/totalview``. This will add conduit_node_totalview.cpp to the build, add TOTALVIEW_DIR/include to the search path, and add the file TOTALVIEW_DIR/src/tv_data_display.c to the build. Totalview states that tv_data_display.c must only be compiled once in an executable for things to work right. If you compile Conduit with Totalview support within another application that already builds in tv_data_display.c, add ``-DCONDUIT_EXCLUDE_TV_DATA_DISPLAY=1`` to exclude that file from Conduit's build.
+
+.. _requires you: https://help.totalview.io/classicTV/current/HTML/index.html#page/Reference_Guide/cppview.html
+
+.. image:: debugger_Totalview_Conduit_list_mainwindow.png
+ :width: 734
+ :alt: Screenshot of Totalview debugger session main window
+
+Totalview can display Nodes with scalar, array, string, list, and object data. Here is a screenshot of a the main window of a Totalview session stopped with a Node ``n`` in scope.
+
+.. image:: debugger_Totalview_Conduit_list_datawindows.png
+ :width: 903
+ :alt: Screenshot of Totalview debugger session data windows, showing object, list, scalar, and array Nodes
+
+On the left, the top window shows the contents of ``n``, a child Node named "mylist." Lower left shows the contents of ``n["mylist"]``, a list of four Nodes. Diving into each of the four nodes produces the windows on the right, showing the values of each.
+
+GDB
+---
+
+GDB uses Python routines to display custom objects. Configure and build a debug build of Conduit. From within GDB, load ``conduit/src/debug/gdb/conduit-gdb.py``.
+
+The GDB debugger helper works in principle like the MSVS .natvis file. At present, it is a work in progress (object Nodes don't display properly).
diff --git a/src/libs/conduit/CMakeLists.txt b/src/libs/conduit/CMakeLists.txt
index 7dba4a76c..19f7afdb5 100644
--- a/src/libs/conduit/CMakeLists.txt
+++ b/src/libs/conduit/CMakeLists.txt
@@ -98,6 +98,17 @@ set(conduit_sources
conduit_annotations.cpp
)
+if(TOTALVIEW_FOUND)
+ list(APPEND conduit_sources debug/conduit_node_totalview.cpp)
+ if(NOT CONDUIT_EXCLUDE_TV_DATA_DISPLAY)
+ list(APPEND conduit_sources ${TOTALVIEW_SOURCE_DIRECTORY}/tv_data_display.c)
+ endif()
+endif()
+
+if (CMAKE_GENERATOR MATCHES "Visual Studio")
+ list(APPEND conduit_sources ../../debug/msvs/ConduitNode.natvis)
+endif()
+
#
# Specify conduit c interface sources
#
@@ -164,7 +175,8 @@ add_compiled_library(NAME conduit
target_include_directories(conduit
PUBLIC
$
- $)
+ $
+ $<$:${TOTALVIEW_INCLUDE_DIRECTORIES}>)
#################################
diff --git a/src/libs/conduit/conduit_config.h.in b/src/libs/conduit/conduit_config.h.in
index b8b377d1f..647742cb7 100644
--- a/src/libs/conduit/conduit_config.h.in
+++ b/src/libs/conduit/conduit_config.h.in
@@ -53,7 +53,8 @@
#cmakedefine CONDUIT_USE_PARMETIS
-#endif
+#cmakedefine CONDUIT_USE_TOTALVIEW
+#endif
diff --git a/src/libs/conduit/conduit_node.hpp b/src/libs/conduit/conduit_node.hpp
index 5325af696..10ae11fb4 100644
--- a/src/libs/conduit/conduit_node.hpp
+++ b/src/libs/conduit/conduit_node.hpp
@@ -38,6 +38,11 @@
#include "conduit_node_iterator.hpp"
#include "conduit_utils.hpp"
+#if defined(CONDUIT_USE_TOTALVIEW)
+// forward declaration of debugger visualizer function
+int TV_ttf_display_type ( const conduit::Node *n );
+#endif
+
//-----------------------------------------------------------------------------
// -- begin conduit:: --
@@ -84,6 +89,10 @@ class CONDUIT_API Node
friend class NodeConstIterator;
friend class Generator;
+#if defined(CONDUIT_USE_TOTALVIEW)
+ friend int ::TV_ttf_display_type ( const conduit::Node *n );
+#endif
+
//-----------------------------------------------------------------------------
//
// -- begin declaration of Node construction and destruction --
diff --git a/src/libs/conduit/debug/conduit_node_totalview.cpp b/src/libs/conduit/debug/conduit_node_totalview.cpp
new file mode 100644
index 000000000..8991621c4
--- /dev/null
+++ b/src/libs/conduit/debug/conduit_node_totalview.cpp
@@ -0,0 +1,123 @@
+// 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.
+
+#include "conduit_node.hpp"
+#include "tv_data_display.h"
+
+#include
+#include
+
+static const char * empty_Node_TV_string = "(empty Node)";
+
+const std::string dtype_to_TV_string ( const conduit::DataType dtype, const char *hint );
+const std::string index_to_TV_string ( int idx );
+
+const std::string dtype_to_TV_string ( const conduit::DataType dtype, const char *hint )
+{
+ std::stringstream ss;
+
+ ss << hint;
+ if (dtype.number_of_elements() > 1)
+ {
+ ss << index_to_TV_string(dtype.number_of_elements());
+ }
+
+ return ss.str();
+}
+
+const std::string index_to_TV_string ( int idx )
+{
+ std::stringstream ss;
+
+ ss << "[" << idx << "]";
+
+ return ss.str();
+}
+
+int TV_ttf_display_type ( const conduit::Node *n )
+{
+ switch(n->dtype().id()) {
+ case conduit::DataType::EMPTY_ID:
+ {
+ TV_ttf_add_row ("data", TV_ttf_type_ascii_string, empty_Node_TV_string);
+ break;
+ }
+ case conduit::DataType::OBJECT_ID:
+ {
+ const std::vector & child_names = n->child_names();
+ const conduit::Schema & schema = n->schema();
+ for (const std::string & name : child_names)
+ {
+ size_t cidx = (size_t)schema.child_index(name);
+ TV_ttf_add_row (name.c_str(), "conduit::Node *", &(n->m_children[cidx]));
+ }
+ break;
+ }
+ case conduit::DataType::LIST_ID:
+ {
+ size_t number_of_children = (size_t)n->number_of_children();
+ for (size_t cidx = 0; cidx < number_of_children; ++cidx)
+ {
+ TV_ttf_add_row (index_to_TV_string(cidx).c_str(), "conduit::Node *", &(n->m_children[cidx]));
+ }
+ break;
+ }
+ case conduit::DataType::INT8_ID:
+ {
+ TV_ttf_add_row ("data", dtype_to_TV_string(n->dtype(), "conduit::int8").c_str(), n->data_ptr());
+ break;
+ }
+ case conduit::DataType::INT16_ID:
+ {
+ TV_ttf_add_row ("data", dtype_to_TV_string(n->dtype(), "conduit::int16").c_str(), n->data_ptr());
+ break;
+ }
+ case conduit::DataType::INT32_ID:
+ {
+ TV_ttf_add_row ("data", dtype_to_TV_string(n->dtype(), "conduit::int32").c_str(), n->data_ptr());
+ break;
+ }
+ case conduit::DataType::INT64_ID:
+ {
+ TV_ttf_add_row ("data", dtype_to_TV_string(n->dtype(), "conduit::int64").c_str(), n->data_ptr());
+ break;
+ }
+ case conduit::DataType::UINT8_ID:
+ {
+ TV_ttf_add_row ("data", dtype_to_TV_string(n->dtype(), "conduit::uint8").c_str(), n->data_ptr());
+ break;
+ }
+ case conduit::DataType::UINT16_ID:
+ {
+ TV_ttf_add_row ("data", dtype_to_TV_string(n->dtype(), "conduit::uint16").c_str(), n->data_ptr());
+ break;
+ }
+ case conduit::DataType::UINT32_ID:
+ {
+ TV_ttf_add_row ("data", dtype_to_TV_string(n->dtype(), "conduit::uint32").c_str(), n->data_ptr());
+ break;
+ }
+ case conduit::DataType::UINT64_ID:
+ {
+ TV_ttf_add_row ("data", dtype_to_TV_string(n->dtype(), "conduit::uint64").c_str(), n->data_ptr());
+ break;
+ }
+ case conduit::DataType::FLOAT32_ID:
+ {
+ TV_ttf_add_row ("data", dtype_to_TV_string(n->dtype(), "conduit::float32").c_str(), n->data_ptr());
+ break;
+ }
+ case conduit::DataType::FLOAT64_ID:
+ {
+ TV_ttf_add_row ("data", dtype_to_TV_string(n->dtype(), "conduit::float64").c_str(), n->data_ptr());
+ break;
+ }
+ case conduit::DataType::CHAR8_STR_ID:
+ TV_ttf_add_row ("data", TV_ttf_type_ascii_string, n->as_char8_str());
+ break;
+ }
+
+ return TV_ttf_format_ok;
+}
+