diff --git a/src/pvxs/data.h b/src/pvxs/data.h index ff07920..b2c33c8 100644 --- a/src/pvxs/data.h +++ b/src/pvxs/data.h @@ -121,6 +121,8 @@ enum struct Kind : uint8_t { Null = 0xe0, }; +enum class ArrayType : uint8_t; + /** Possible Field types. * * eg. String is scalar string, StringA is array of strings. @@ -183,6 +185,7 @@ struct TypeCode { constexpr TypeCode(code_t c) :code(c) {} PVXS_API StoreType storedAs() const; + PVXS_API ArrayType arrayType() const; //! associated array of type constexpr TypeCode arrayOf() const {return TypeCode{uint8_t(code|0x08)};} diff --git a/src/type.cpp b/src/type.cpp index 540c542..7022ee2 100644 --- a/src/type.cpp +++ b/src/type.cpp @@ -80,6 +80,31 @@ StoreType TypeCode::storedAs() const } } +ArrayType TypeCode::arrayType() const +{ + switch(code) { +#define CASE(ATYPE, TYPE) case TypeCode::TYPE: return ArrayType::ATYPE + CASE(Bool, BoolA); + CASE(Int8, Int8A); + CASE(Int16, Int16A); + CASE(Int32, Int32A); + CASE(Int64, Int64A); + CASE(UInt8, UInt8A); + CASE(UInt16, UInt16A); + CASE(UInt32, UInt32A); + CASE(UInt64, UInt64A); + CASE(Float32, Float32A); + CASE(Float64, Float64A); + CASE(String, StringA); + CASE(Value, StructA); + CASE(Value, UnionA); + CASE(Value, AnyA); +#undef CASE + default: + throw std::logic_error("TypeCode can not be mapped to ArrayType"); + } +} + const char* TypeCode::name() const { switch(code) {