8 #define epicsExportSharedSymbols 12 namespace epics{
namespace pvData{
35 buildStruct(this->builder, nest);
43 storeStruct(builder, str);
63 builder->add(name, stype);
75 builder->addArray(name, array.original_type());
96 if(val->getField()->getType()!=
scalar)
100 scalar->putFrom(value);
110 for(StringArray::const_iterator it=field.begin(), end=field.end(); it!=end; ++it)
112 PVField::const_shared_pointer sub(val.
getSubField(*it));
115 switch(subtype->getType()) {
118 const PVScalar* subs(static_cast<const PVScalar*>(sub.get()));
121 #define STYPE(stype) case pv##stype: { const PV ##stype* ptr(static_cast<const PV##stype*>(subs)); PV##stype::value_type temp(ptr->get()); self._add(*it, pv##stype, &temp); } break 139 self._add(*it, *static_cast<const PVStructure*>(sub.get()));
142 THROW_EXCEPTION2(std::runtime_error,
"ValueBuilder can only clone scalar and structure");
162 for(children_t::const_iterator it=children.begin(), end=children.end(); it!=end; ++it)
167 void ValueBuilder::_add(
const std::string& name,
const PVStructure& V)
175 void ValueBuilder::_add(
const std::string& name,
ScalarType stype,
const void *V)
177 const children_t::iterator it(children.find(name));
178 if(it!=children.end()) {
180 THROW_EXCEPTION2(std::logic_error,
"Not allowed to replace field. wrong type");
183 epics::auto_ptr<child> store;
185 #define STYPE(stype) case stype: store.reset(new child_scalar<ScalarTypeTraits<stype>::type>(V)); break 203 if(it!=children.end()) {
207 children[name] = store.get();
213 const children_t::iterator it(children.find(name));
214 if(it!=children.end()) {
216 THROW_EXCEPTION2(std::logic_error,
"Not allowed to replace field. wrong type");
221 children[name] = store.get();
228 THROW_EXCEPTION2(std::invalid_argument,
"addNested() only supports structure");
230 children_t::const_iterator it(children.find(name));
231 if(it==children.end()) {
232 epics::auto_ptr<child_struct> store(
new child_struct(
this,
id));
234 children[name] = store.get();
239 std::ostringstream msg;
240 msg<<
"Can't replace non-struct field '"<<name<<
"' with struct";
258 builder->setId(
self.
id);
260 for(children_t::const_iterator it=
self.children.begin(), end=
self.children.end(); it!=end; ++it)
262 it->second->build(it->first, builder);
268 for(children_t::const_iterator it=
self.children.begin(), end=
self.children.end(); it!=end; ++it)
270 it->second->store(val->getSubFieldT(it->first));
277 THROW_EXCEPTION2(std::logic_error,
"Only top level structure may be built. Missing endNested() ?");
285 type = tbuild->createStructure();
288 PVStructure::shared_pointer root(type->build());
FORCE_INLINE std::tr1::shared_ptr< PVField > getSubField(A a)
epics::pvData::BitSetPtr empty
PVScalar is the base class for each scalar field.
#define assert(exp)
Declare that a condition should be true.
friend struct child_struct
#define THROW_EXCEPTION2(TYPE, MSG)
std::tr1::shared_ptr< PVStructure > buildPVStructure() const
virtual void build(const std::string &name, FieldBuilderPtr &builder)=0
ValueBuilder & addNested(const std::string &name, Type type=structure, const std::string &id=std::string())
Start a sub-structure.
virtual void build(const std::string &name, FieldBuilderPtr &builder) OVERRIDE FINAL
virtual void store(const PVFieldPtr &val) OVERRIDE FINAL
ValueBuilder(const std::string &id=std::string())
empty structure
pvd::StructureConstPtr type
TODO only here because of the Lockable.
std::tr1::shared_ptr< const Structure > StructureConstPtr
ValueBuilder & endNested()
End a sub-structure.
std::tr1::shared_ptr< FieldBuilder > FieldBuilderPtr
virtual void store(const PVFieldPtr &val)=0
virtual ~child_scalar_array()
const ScalarConstPtr getScalar() const
child_scalar(const void *v)
static void buildStruct(const ValueBuilder &self, FieldBuilderPtr &builder)
virtual void build(const std::string &name, FieldBuilderPtr &builder) OVERRIDE FINAL
virtual void build(const std::string &name, FieldBuilderPtr &builder) OVERRIDE FINAL
virtual ~child_scalar_base()
std::tr1::shared_ptr< PVScalar > PVScalarPtr
shared_vector< const void > array
Data interface for a structure,.
std::tr1::shared_ptr< const Field > FieldConstPtr
child_scalar_base(ScalarType s)
static void fillStruct(ValueBuilder &self, const PVStructure &val)
FORCE_INLINE const FieldCreatePtr & getFieldCreate()
std::tr1::shared_ptr< PVStructure > PVStructurePtr
virtual void store(const PVFieldPtr &val) OVERRIDE FINAL
child_scalar_array(const shared_vector< const void > &v)
child_struct(ValueBuilder *par, const std::string &id)
friend struct child_scalar_array
virtual void store(const PVFieldPtr &val) OVERRIDE FINAL
std::vector< std::string > StringArray
std::tr1::shared_ptr< PVField > PVFieldPtr
static void storeStruct(const ValueBuilder &self, const PVStructurePtr &val)
const StructureConstPtr & getStructure() const
std::tr1::shared_ptr< PVScalarArray > PVScalarArrayPtr