diff --git a/pdbApp/pdbsingle.cpp b/pdbApp/pdbsingle.cpp index b098cb1..9f5d2c6 100644 --- a/pdbApp/pdbsingle.cpp +++ b/pdbApp/pdbsingle.cpp @@ -96,7 +96,7 @@ void pdb_single_event(void *user_arg, struct dbChannel *chan, PDBSinglePV::PDBSinglePV(DBCH& chan, const PDBProvider::shared_pointer& prov) :provider(prov) - ,builder(new ScalarBuilder) + ,builder(new ScalarBuilder(chan.chan)) ,interested_iterating(false) ,evt_VALUE(this) ,evt_PROPERTY(this) diff --git a/pdbApp/pvif.cpp b/pdbApp/pvif.cpp index 864301c..f9ad800 100644 --- a/pdbApp/pvif.cpp +++ b/pdbApp/pvif.cpp @@ -950,6 +950,7 @@ struct PVIFPlain : public PVIF struct PlainBuilder : public PVIFBuilder { + explicit PlainBuilder(dbChannel* chan) :PVIFBuilder(chan) {} virtual ~PlainBuilder() {} // fetch the structure description @@ -990,6 +991,7 @@ struct PlainBuilder : public PVIFBuilder struct AnyScalarBuilder : public PVIFBuilder { + explicit AnyScalarBuilder(dbChannel* chan) :PVIFBuilder(chan) {} virtual ~AnyScalarBuilder() {} // fetch the structure description @@ -1088,6 +1090,7 @@ struct PVIFMeta : public PVIF struct MetaBuilder : public PVIFBuilder { + explicit MetaBuilder(dbChannel* chan) :PVIFBuilder(chan) {} virtual ~MetaBuilder() {} // fetch the structure description @@ -1152,6 +1155,9 @@ struct PVIFProc : public PVIF struct ProcBuilder : public PVIFBuilder { + explicit ProcBuilder(dbChannel* chan) :PVIFBuilder(chan) {} + virtual ~ProcBuilder() {} + // fetch the structure description virtual epics::pvData::FieldConstPtr dtype(dbChannel *channel) OVERRIDE FINAL { throw std::logic_error("Don't call me"); @@ -1232,15 +1238,15 @@ PVIFBuilder::dtype(epics::pvData::FieldBuilderPtr& builder, PVIFBuilder* PVIFBuilder::create(const std::string& type, dbChannel* chan) { if(type.empty() || type=="scalar") - return new ScalarBuilder; + return new ScalarBuilder(chan); else if(type=="plain") - return new PlainBuilder; + return new PlainBuilder(chan); else if(type=="any") - return new AnyScalarBuilder; + return new AnyScalarBuilder(chan); else if(type=="meta") - return new MetaBuilder; + return new MetaBuilder(chan); else if(type=="proc") - return new ProcBuilder; + return new ProcBuilder(chan); else throw std::runtime_error(std::string("Unknown +type=")+type); } diff --git a/pdbApp/pvif.h b/pdbApp/pvif.h index 5ec7603..61e517e 100644 --- a/pdbApp/pvif.h +++ b/pdbApp/pvif.h @@ -390,7 +390,9 @@ private: * Caller than creates a PVStructure and uses PVIFBuilder::attach() to * build mappings for each dbChannel in the composed locations. */ -struct QSRV_API PVIFBuilder { +struct QSRV_API PVIFBuilder +{ + dbChannel* const channel; virtual ~PVIFBuilder() {} @@ -409,7 +411,7 @@ struct QSRV_API PVIFBuilder { // entry point for Builder static PVIFBuilder* create(const std::string& mapname, dbChannel* chan); protected: - PVIFBuilder() {} + explicit PVIFBuilder(dbChannel* chan) : channel(chan) {} private: PVIFBuilder(const PVIFBuilder&); PVIFBuilder& operator=(const PVIFBuilder&); @@ -417,6 +419,7 @@ private: struct QSRV_API ScalarBuilder : public PVIFBuilder { + explicit ScalarBuilder(dbChannel* chan) :PVIFBuilder(chan) {} virtual ~ScalarBuilder() {} virtual epics::pvData::FieldConstPtr dtype(dbChannel *channel) OVERRIDE FINAL; diff --git a/testApp/testpvif.cpp b/testApp/testpvif.cpp index 601452b..81bb42d 100644 --- a/testApp/testpvif.cpp +++ b/testApp/testpvif.cpp @@ -74,38 +74,56 @@ void testScalar() testEqual(dbChannelFinalFieldType(chan_i64), DBR_INT64); #endif - ScalarBuilder builder; - - pvd::FieldConstPtr dtype_li(builder.dtype(chan_li)); + pvd::PVStructurePtr root; + p2p::auto_ptr pvif_li; #ifdef USE_INT64 - pvd::FieldConstPtr dtype_i64(builder.dtype(chan_i64)); + p2p::auto_ptr pvif_i64; #endif - pvd::FieldConstPtr dtype_si(builder.dtype(chan_si)); - pvd::FieldConstPtr dtype_ai(builder.dtype(chan_ai)); - pvd::FieldConstPtr dtype_ai_rval(builder.dtype(chan_ai_rval)); - pvd::FieldConstPtr dtype_mbbi(builder.dtype(chan_mbbi)); - - pvd::StructureConstPtr dtype_root(pvd::getFieldCreate()->createFieldBuilder() - ->add("li", dtype_li) + p2p::auto_ptr pvif_si; + p2p::auto_ptr pvif_ai; + p2p::auto_ptr pvif_ai_rval; + p2p::auto_ptr pvif_mbbi; + { + ScalarBuilder builder_li(chan_li); #ifdef USE_INT64 - ->add("i64", dtype_i64) + ScalarBuilder builder_i64(chan_i64); #endif - ->add("si", dtype_si) - ->add("ai", dtype_ai) - ->add("ai_rval", dtype_ai_rval) - ->add("mbbi", dtype_mbbi) - ->createStructure()); + ScalarBuilder builder_si(chan_si); + ScalarBuilder builder_ai(chan_ai); + ScalarBuilder builder_ai_rval(chan_ai_rval); + ScalarBuilder builder_mbbi(chan_mbbi); - pvd::PVStructurePtr root(pvd::getPVDataCreate()->createPVStructure(dtype_root)); + pvd::FieldConstPtr dtype_li(builder_li.dtype(chan_li)); + #ifdef USE_INT64 + pvd::FieldConstPtr dtype_i64(builder_i64.dtype(chan_i64)); + #endif + pvd::FieldConstPtr dtype_si(builder_si.dtype(chan_si)); + pvd::FieldConstPtr dtype_ai(builder_ai.dtype(chan_ai)); + pvd::FieldConstPtr dtype_ai_rval(builder_ai_rval.dtype(chan_ai_rval)); + pvd::FieldConstPtr dtype_mbbi(builder_mbbi.dtype(chan_mbbi)); - p2p::auto_ptr pvif_li(builder.attach(chan_li, root, FieldName("li"))); -#ifdef USE_INT64 - p2p::auto_ptr pvif_i64(builder.attach(chan_i64, root, FieldName("i64"))); -#endif - p2p::auto_ptr pvif_si(builder.attach(chan_si, root, FieldName("si"))); - p2p::auto_ptr pvif_ai(builder.attach(chan_ai, root, FieldName("ai"))); - p2p::auto_ptr pvif_ai_rval(builder.attach(chan_ai_rval, root, FieldName("ai_rval"))); - p2p::auto_ptr pvif_mbbi(builder.attach(chan_mbbi, root, FieldName("mbbi"))); + pvd::StructureConstPtr dtype_root(pvd::getFieldCreate()->createFieldBuilder() + ->add("li", dtype_li) + #ifdef USE_INT64 + ->add("i64", dtype_i64) + #endif + ->add("si", dtype_si) + ->add("ai", dtype_ai) + ->add("ai_rval", dtype_ai_rval) + ->add("mbbi", dtype_mbbi) + ->createStructure()); + + root = pvd::getPVDataCreate()->createPVStructure(dtype_root); + + pvif_li.reset(builder_li.attach(chan_li, root, FieldName("li"))); + #ifdef USE_INT64 + pvif_i64.reset(builder_i64.attach(chan_i64, root, FieldName("i64"))); + #endif + pvif_si.reset(builder_si.attach(chan_si, root, FieldName("si"))); + pvif_ai.reset(builder_ai.attach(chan_ai, root, FieldName("ai"))); + pvif_ai_rval.reset(builder_ai_rval.attach(chan_ai_rval, root, FieldName("ai_rval"))); + pvif_mbbi.reset(builder_mbbi.attach(chan_mbbi, root, FieldName("mbbi"))); + } testShow()<<"Entire structure\n"<