16 #define epicsExportSharedSymbols 26 namespace epics {
namespace pvData {
31 : parent(
NULL),field(field),
32 fieldOffset(0), nextFieldOffset(0),
46 if(nextFieldOffset==0) computeOffset(
this);
52 if(nextFieldOffset==0) computeOffset(
this);
53 return nextFieldOffset;
58 if(nextFieldOffset==0) computeOffset(
this);
59 return (nextFieldOffset - fieldOffset);
67 if(postHandler) postHandler->postPut();
73 if(postHandler.get()==handler.get())
return;
74 throw std::logic_error(
75 "PVField::setPostHandler a postHandler is already registered");
78 postHandler = handler;
99 string ret(fieldName);
102 if(fld->getFieldName().size()==0)
break;
103 ret = fld->getFieldName() +
'.' + ret;
108 void PVField::computeOffset(
const PVField * pvField) {
113 xxx->fieldOffset = 0;
114 xxx->nextFieldOffset = 1;
122 size_t nextOffset = 1;
126 PVField *pvField = pvFields[
i].get();
128 switch(field->getType()) {
135 pvField->fieldOffset = offset;
136 pvField->nextFieldOffset = nextOffset;
140 pvField->computeOffset(pvField,offset);
147 xxx->fieldOffset = 0;
148 xxx->nextFieldOffset = nextOffset;
151 void PVField::computeOffset(
const PVField * pvField,
size_t offset) {
152 size_t beginOffset = offset;
153 size_t nextOffset = offset + 1;
156 for(
size_t i=0;
i < pvStructure->
getStructure()->getNumberFields();
i++) {
158 PVField *pvSubField = pvFields[
i].get();
160 switch(field->getType()) {
167 pvSubField->fieldOffset = offset;
168 pvSubField->nextFieldOffset = nextOffset;
172 pvSubField->computeOffset(pvSubField,offset);
178 xxx->fieldOffset = beginOffset;
179 xxx->nextFieldOffset = nextOffset;
185 throw std::invalid_argument(
"destination is immutable");
188 throw std::invalid_argument(
"field types do not match");
243 throw std::logic_error(
"PVField::copy unknown type");
const PVFieldPtrArray & getPVFields() const
PVScalar is the base class for each scalar field.
Data class for a unionArray.
void copyUnchecked(const PVUnionArray &from)
#define assert(exp)
Declare that a condition should be true.
void setParentAndName(PVStructure *parent, std::string const &fieldName)
void setPostHandler(PostHandlerPtr const &postHandler)
virtual void setImmutable()
const FieldConstPtr & getField() const
PVField(FieldConstPtr field)
virtual void copyUnchecked(const PVScalar &from)=0
TODO only here because of the Lockable.
static size_t num_instances
PVField is the base class for each PVData field.
std::ostream & operator<<(std::ostream &o, const Field &f)
std::size_t getFieldOffset() const
void copyUnchecked(const PVStructure &from)
std::string getFullName() const
std::tr1::shared_ptr< PostHandler > PostHandlerPtr
APIs for the epicsMutex mutual exclusion semaphore.
Base class for a scalarArray.
void copyUnchecked(const PVField &from)
PVUnion has a single subfield.
std::vector< PVFieldPtr > PVFieldPtrArray
Data interface for a structure,.
std::tr1::shared_ptr< const Field > FieldConstPtr
Data class for a structureArray.
const StructureConstPtr & getStructure() const
void copyUnchecked(const PVStructureArray &from)
shared_ptr< T > const_pointer_cast(shared_ptr< U > const &r) BOOST_NOEXCEPT
virtual std::ostream & dumpValue(std::ostream &o) const =0
void copyUnchecked(const PVUnion &from)
virtual bool equals(PVField &pv)
PVStructure * getParent()
void copyUnchecked(const PVScalarArray &from)
void copy(const PVField &from)
std::size_t getNextFieldOffset() const
std::size_t getNumberFields() const