diff --git a/src/libs/conduit/Schema.cpp b/src/libs/conduit/Schema.cpp index 99275cc66..5778e06a1 100644 --- a/src/libs/conduit/Schema.cpp +++ b/src/libs/conduit/Schema.cpp @@ -782,6 +782,24 @@ Schema::child_index(const std::string &path) const return res; } +//---------------------------------------------------------------------------// +std::string +Schema::child_name(index_t idx) const +{ + std::string res = ""; + + if(m_dtype.id() == DataType::OBJECT_ID) + { + const std::vector &obj_order = object_order(); + if( idx < obj_order.size()) + { + res = obj_order[idx]; + } + } + + return res; +} + //---------------------------------------------------------------------------// Schema & Schema::fetch(const std::string &path) diff --git a/src/libs/conduit/Schema.hpp b/src/libs/conduit/Schema.hpp index bba5d117e..316a46a80 100644 --- a/src/libs/conduit/Schema.hpp +++ b/src/libs/conduit/Schema.hpp @@ -256,6 +256,11 @@ class CONDUIT_API Schema /// path to index map index_t child_index(const std::string &path) const; + /// index to path map + /// returns an empty string when passed index is invalid, or + /// this schema does not describe an object. + std::string child_name(index_t idx) const; + /// this uses the fetch method Schema &operator[](const std::string &path); /// the const variant uses the "fetch_child" method diff --git a/src/tests/conduit/t_conduit_schema.cpp b/src/tests/conduit/t_conduit_schema.cpp index dca72881a..ac978796f 100644 --- a/src/tests/conduit/t_conduit_schema.cpp +++ b/src/tests/conduit/t_conduit_schema.cpp @@ -182,6 +182,29 @@ TEST(schema_basics, schema_alloc) } +//----------------------------------------------------------------------------- +TEST(schema_basics, schema_name_by_index) +{ + Schema s1; + s1["a"].set(DataType::int64()); + s1["b"].set(DataType::float64()); + s1["c"].set(DataType::float64()); + + // standard case + EXPECT_EQ(s1.child_name(0),"a"); + EXPECT_EQ(s1.child_name(1),"b"); + EXPECT_EQ(s1.child_name(2),"c"); + + // these are out of bounds, should be empty + EXPECT_EQ(s1.child_name(100),""); + EXPECT_EQ(s1["a"].child_name(100),""); + + Schema s2; + // check empty schema + EXPECT_EQ(s2.child_name(100),""); +} + + //----------------------------------------------------------------------------- /// /// commented out b/c spanned_bytes is now private,