(re)compute the selected subset of provided base structure.
53 if(
base.getFieldOffset()!=0)
54 THROW_EXCEPTION2(std::logic_error,
"Mapper must be used with top level PVStructure");
63 PVScalar::const_shared_pointer pbp(pvRequest.getSubField<PVScalar>(
"record._options.keepIDs"));
65 if(pbp) keepids = pbp->getAs<
boolean>();
66 }
catch(std::runtime_error& e){
67 std::ostringstream msg;
68 msg<<
"Can't parse keepIDs : '"<<e.what()<<
"' ";
69 temp.messages+=msg.str();
72 PVStructure::const_shared_pointer fields(pvRequest.getSubField<PVStructure>(
"field"));
73 if(!fields || fields->getPVFields().empty()) {
75 temp.typeBase = temp.typeRequested =
base.getStructure();
77 for(
size_t i=1, N=
base.getNextFieldOffset();
i<N;
i++)
78 temp.maskRequested.set(
i);
84 builder = builder->setId(
base.getStructure()->getID());
86 ok &= temp._compute(
base, *fields, builder, keepids, 0);
88 temp.typeBase =
base.getStructure();
89 temp.typeRequested = builder->createStructure();
95 temp.typeRequested = temp.typeBase;
102 temp.base2req.resize(
base.getNextFieldOffset());
104 temp.req2base.resize(proto->getNextFieldOffset());
107 temp.base2req[0] = Mapping(0,
false);
108 temp.req2base[0] = Mapping(0,
false);
113 for(
size_t r=1, N=proto->getNextFieldOffset(); r<N; r++) {
114 PVField::const_shared_pointer fld_req(proto->getSubFieldT(r)),
115 fld_base(
base.getSubFieldT(fld_req->getFullName()));
116 const size_t b = fld_base->getFieldOffset();
118 if(!temp.requestedMask().get(b))
121 bool leaf = fld_base->getField()->getType()!=
structure;
124 temp.base2req[b] = Mapping(r, leaf);
125 temp.req2base[r] = Mapping(b, leaf);
128 for(
const PVStructure *parent = fld_req->getParent(); parent; parent = parent->getParent()) {
129 temp.req2base[parent->getFieldOffset()].tomask .set(b);
130 temp.req2base[parent->getFieldOffset()].frommask.set(r);
133 for(
const PVStructure *parent = fld_base->getParent(); parent; parent = parent->getParent()) {
134 temp.base2req[parent->getFieldOffset()].tomask .set(r);
135 temp.base2req[parent->getFieldOffset()].frommask.set(b);
140 temp.maskRequested.set(0);
142 if(temp.maskRequested.nextSetBit(1)==-1) {
144 temp.messages+=
"Empty field selection";
148 throw std::runtime_error(temp.messages);
#define THROW_EXCEPTION2(TYPE, MSG)
void swap(PVRequestMapper &other)
Exchange contents of two mappers. O(0) and never throws.
std::tr1::shared_ptr< FieldBuilder > FieldBuilderPtr
const StructureConstPtr & base() const
FORCE_INLINE const FieldCreatePtr & getFieldCreate()
std::tr1::shared_ptr< PVStructure > PVStructurePtr