From cdeecdcc46355e599f05a8db08dc408cc1bee1c4 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Wed, 18 Dec 2019 18:29:15 -0800 Subject: [PATCH] update data.h --- src/data.cpp | 24 +++++++++++++++++++++--- src/nt.cpp | 5 ++--- src/pvxs/data.h | 14 ++++++++++++-- src/pvxs/nt.h | 12 ++++++++++-- test/testtype.cpp | 2 +- 5 files changed, 46 insertions(+), 11 deletions(-) diff --git a/src/data.cpp b/src/data.cpp index d5a42ac..c6704b1 100644 --- a/src/data.cpp +++ b/src/data.cpp @@ -14,6 +14,12 @@ namespace pvxs { +NoField::NoField() + :std::runtime_error ("No such field") +{} + +NoField::~NoField() {} + NoConvert::NoConvert() :std::runtime_error ("No conversion defined") {} @@ -154,6 +160,12 @@ const std::string& Value::id() const return desc->id; } +bool Value::idStartsWith(const std::string& prefix) const +{ + auto ID = this->id(); + return ID.size()>=prefix.size() && prefix==ID.substr(0u, prefix.size()); +} + namespace { // C-style cast between scalar storage types, and print to string (base 10) template @@ -176,7 +188,7 @@ bool copyOutScalar(const Src& src, void *ptr, StoreType type) void Value::copyOut(void *ptr, StoreType type) const { if(!desc) - throw NoConvert(); + throw NoField(); switch(store->code) { case StoreType::Real: if(copyOutScalar(store->as(), ptr, type)) return; else break; @@ -251,7 +263,7 @@ bool copyInScalar(Dest& dest, const void *ptr, StoreType type) void Value::copyIn(const void *ptr, StoreType type) { if(!desc) - throw NoConvert(); + throw NoField(); switch(store->code) { case StoreType::Real: if(!copyInScalar(store->as(), ptr, type)) throw NoConvert(); break; @@ -316,8 +328,14 @@ void Value::copyIn(const void *ptr, StoreType type) break; } } - // fall through + throw NoConvert(); case StoreType::Null: + if(desc->code==TypeCode::Struct && type==StoreType::Compound) { + auto& val = *reinterpret_cast(ptr); + if(val.desc && val.desc->code==TypeCode::Struct) { + // Struct to Struct assignment. + } + } throw NoConvert(); } diff --git a/src/nt.cpp b/src/nt.cpp index 0a3b247..5aa5de0 100644 --- a/src/nt.cpp +++ b/src/nt.cpp @@ -9,8 +9,7 @@ namespace pvxs { namespace nt { - -TypeDef NTScalar::build() +TypeDef NTScalar::build() const { return TypeDef(TypeCode::Struct, value.isarray() ? "epics:nt/NTScalarArray:1.0" : "epics:nt/NTScalar:1.0", { @@ -72,7 +71,7 @@ TypeDef NTScalar::build() // return def; } -TypeDef NTNDArray::build() +TypeDef NTNDArray::build() const { TypeDef def(TypeCode::Struct, "epics:nt/NTNDArray:1.0"); diff --git a/src/pvxs/data.h b/src/pvxs/data.h index 6939617..db4ae65 100644 --- a/src/pvxs/data.h +++ b/src/pvxs/data.h @@ -37,7 +37,7 @@ struct FieldDesc; //! maps T to one of the types which can be stored in the FieldStorage::store union //! typename StorageMap::store_t is, if existant, is one such type. -//! Can store_t shall be cast-able to/from T. +//! store_t shall be cast-able to/from T. //! StorageMap::code is the associated StoreType. template struct StorageMap; @@ -65,6 +65,10 @@ template<> struct StorageMap { typedef std::string store_t; static constexpr StoreType code{StoreType::String}; }; +template<> +struct StorageMap +{ typedef std::string store_t; static constexpr StoreType code{StoreType::String}; }; + template<> struct StorageMap> { typedef shared_array store_t; static constexpr StoreType code{StoreType::Array}; }; @@ -214,11 +218,16 @@ public: PVXS_API std::ostream& operator<<(std::ostream& strm, const TypeDef&); +struct PVXS_API NoField : public std::runtime_error +{ + explicit NoField(); + virtual ~NoField(); +}; + struct PVXS_API NoConvert : public std::runtime_error { explicit NoConvert(); virtual ~NoConvert(); - TypeCode source; }; //! pointer-like reference to a single data field @@ -265,6 +274,7 @@ public: TypeCode type() const; StoreType storageType() const; const std::string& id() const; + bool idStartsWith(const std::string& prefix) const; //! test for instance equality. inline bool compareInst(const Value& o) { return store==o.store; } diff --git a/src/pvxs/nt.h b/src/pvxs/nt.h index 164357b..f351ea7 100644 --- a/src/pvxs/nt.h +++ b/src/pvxs/nt.h @@ -9,6 +9,8 @@ #include #include +struct epicsTimeStamp; // epicsTime.h + namespace pvxs { namespace nt { @@ -19,12 +21,18 @@ struct NTScalar { bool valueAlarm; PVXS_API - TypeDef build(); + TypeDef build() const; + inline Value create() const { + return build().create(); + } }; struct NTNDArray { PVXS_API - TypeDef build(); + TypeDef build() const; + inline Value create() const { + return build().create(); + } }; }} // namespace pvxs::nt diff --git a/test/testtype.cpp b/test/testtype.cpp index b914862..8cd4726 100644 --- a/test/testtype.cpp +++ b/test/testtype.cpp @@ -43,7 +43,7 @@ void testBasic() testOk1(!val.valid()); testOk1(!val.isMarked()); - testThrows([&val]() { + testThrows([&val]() { val.from(4.2); }); }