From b69c25feb6d4bd788ac6a1806da8397de9a385fc Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Sun, 31 May 2020 11:59:23 -0700 Subject: [PATCH] pass dbChannel* to PVIFBuilder::create() --- pdbApp/pdb.cpp | 2 +- pdbApp/pvif.cpp | 2 +- pdbApp/pvif.h | 2 +- testApp/testpvif.cpp | 49 +++++++++++++++++++++++++------------------- 4 files changed, 31 insertions(+), 24 deletions(-) diff --git a/pdbApp/pdb.cpp b/pdbApp/pdb.cpp index a108213..3d21ae1 100644 --- a/pdbApp/pdb.cpp +++ b/pdbApp/pdb.cpp @@ -447,7 +447,7 @@ PDBProvider::PDBProvider(const epics::pvAccess::Configuration::const_shared_poin chan.swap(temp); } - std::tr1::shared_ptr pvifbuilder(PVIFBuilder::create(mem.type)); + std::tr1::shared_ptr pvifbuilder(PVIFBuilder::create(mem.type, chan.chan)); if(!parts.empty()) builder = pvifbuilder->dtype(builder, parts.back().name, chan); diff --git a/pdbApp/pvif.cpp b/pdbApp/pvif.cpp index 2cc9fca..864301c 100644 --- a/pdbApp/pvif.cpp +++ b/pdbApp/pvif.cpp @@ -1229,7 +1229,7 @@ PVIFBuilder::dtype(epics::pvData::FieldBuilderPtr& builder, return builder; } -PVIFBuilder* PVIFBuilder::create(const std::string& type) +PVIFBuilder* PVIFBuilder::create(const std::string& type, dbChannel* chan) { if(type.empty() || type=="scalar") return new ScalarBuilder; diff --git a/pdbApp/pvif.h b/pdbApp/pvif.h index 6ef7369..5ec7603 100644 --- a/pdbApp/pvif.h +++ b/pdbApp/pvif.h @@ -407,7 +407,7 @@ struct QSRV_API PVIFBuilder { virtual PVIF* attach(dbChannel *channel, const epics::pvData::PVStructurePtr& root, const FieldName& fld) =0; // entry point for Builder - static PVIFBuilder* create(const std::string& name); + static PVIFBuilder* create(const std::string& mapname, dbChannel* chan); protected: PVIFBuilder() {} private: diff --git a/testApp/testpvif.cpp b/testApp/testpvif.cpp index 7002510..601452b 100644 --- a/testApp/testpvif.cpp +++ b/testApp/testpvif.cpp @@ -424,30 +424,37 @@ void testPlain() DBCH chan_ai("test:ai"); DBCH chan_mbbi("test:mbbi"); - p2p::auto_ptr builder; + pvd::PVStructurePtr root; + p2p::auto_ptr pvif_li; + p2p::auto_ptr pvif_si; + p2p::auto_ptr pvif_ai; + p2p::auto_ptr pvif_mbbi; { - builder.reset(PVIFBuilder::create("plain")); + p2p::auto_ptr builder_li(PVIFBuilder::create("plain", chan_li)); + p2p::auto_ptr builder_si(PVIFBuilder::create("plain", chan_si)); + p2p::auto_ptr builder_ai(PVIFBuilder::create("plain", chan_ai)); + p2p::auto_ptr builder_mbbi(PVIFBuilder::create("plain", chan_mbbi)); + + pvd::FieldConstPtr dtype_li(builder_li->dtype(chan_li)); + pvd::FieldConstPtr dtype_si(builder_si->dtype(chan_si)); + pvd::FieldConstPtr dtype_ai(builder_ai->dtype(chan_ai)); + pvd::FieldConstPtr dtype_mbbi(builder_mbbi->dtype(chan_mbbi)); + + pvd::StructureConstPtr dtype_root(pvd::getFieldCreate()->createFieldBuilder() + ->add("li", dtype_li) + ->add("si", dtype_si) + ->add("ai", dtype_ai) + ->add("mbbi", dtype_mbbi) + ->createStructure()); + + root = pvd::getPVDataCreate()->createPVStructure(dtype_root); + + pvif_li.reset(builder_li->attach(chan_li, root, FieldName("li"))); + pvif_si.reset(builder_si->attach(chan_si, root, FieldName("si"))); + pvif_ai.reset(builder_ai->attach(chan_ai, root, FieldName("ai"))); + pvif_mbbi.reset(builder_mbbi->attach(chan_mbbi, root, FieldName("mbbi"))); } - pvd::FieldConstPtr dtype_li(builder->dtype(chan_li)); - pvd::FieldConstPtr dtype_si(builder->dtype(chan_si)); - pvd::FieldConstPtr dtype_ai(builder->dtype(chan_ai)); - pvd::FieldConstPtr dtype_mbbi(builder->dtype(chan_mbbi)); - - pvd::StructureConstPtr dtype_root(pvd::getFieldCreate()->createFieldBuilder() - ->add("li", dtype_li) - ->add("si", dtype_si) - ->add("ai", dtype_ai) - ->add("mbbi", dtype_mbbi) - ->createStructure()); - - pvd::PVStructurePtr root(pvd::getPVDataCreate()->createPVStructure(dtype_root)); - - p2p::auto_ptr pvif_li(builder->attach(chan_li, root, FieldName("li"))); - 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_mbbi(builder->attach(chan_mbbi, root, FieldName("mbbi"))); - pvd::BitSet mask; mask.clear();