diff --git a/src/data.cpp b/src/data.cpp index bf32579..019a3fd 100644 --- a/src/data.cpp +++ b/src/data.cpp @@ -969,10 +969,11 @@ size_t Value::nmembers() const { switch(desc ? desc->code.code : TypeCode::Null) { case TypeCode::Struct: - case TypeCode::StructA: case TypeCode::Union: - case TypeCode::UnionA: return desc->miter.size(); + case TypeCode::StructA: + case TypeCode::UnionA: + return desc->members[0].miter.size(); default: return 0u; } diff --git a/src/dataimpl.h b/src/dataimpl.h index bf09401..dd5adf8 100644 --- a/src/dataimpl.h +++ b/src/dataimpl.h @@ -72,7 +72,7 @@ struct FieldDesc { size_t parent_index=0; // For Union, UnionA, StructA - // For Union, the choices concatenated together (members.size() !+ #choices) + // For Union, the choices concatenated together (members.size() != #choices) // For UnionA/StructA containing a single Union/Struct std::vector members; diff --git a/src/pvxs/data.h b/src/pvxs/data.h index 850d52a..94eb40b 100644 --- a/src/pvxs/data.h +++ b/src/pvxs/data.h @@ -741,6 +741,7 @@ public: //! Number of child fields. //! only Struct, StructA, Union, UnionA return non-zero + //! \since UNRELEASED correctly return non-zero for StructA and UnionA size_t nmembers() const; struct _IAll {}; diff --git a/test/testtype.cpp b/test/testtype.cpp index 83955e2..cdc2921 100644 --- a/test/testtype.cpp +++ b/test/testtype.cpp @@ -207,6 +207,12 @@ void testTypeDef() " [0] float parent=[0] [0:1)\n" ); + testEq(val["value"].nmembers(), 0u); + testEq(val["arbitrary"].nmembers(), 1u); + testEq(val["arbitrary.sarr"].nmembers(), 1u); + testEq(val["choice"].nmembers(), 2u); + testEq(val["achoice"].nmembers(), 2u); + // try to access all field Kinds // sub-struct and scalar @@ -586,7 +592,7 @@ void testFormat() MAIN(testtype) { - testPlan(63); + testPlan(68); testSetup(); showSize(); testCode();