9 #include <epicsVersion.h> 25 #define CASE(BASETYPE, PVATYPE, DBFTYPE, PVACODE) case DBR_##DBFTYPE: return pvd::pv##PVACODE; 26 #define CASE_SKIP_BOOL 27 #define CASE_REAL_INT64 30 #undef CASE_REAL_INT64 35 throw std::invalid_argument(
"Unsupported DBR code");
38 long copyPVD2DBF(
const pvd::PVField::const_shared_pointer& inraw,
39 void *outbuf,
short outdbf,
long *outnReq)
41 long nreq = outnReq ? *outnReq : 1;
42 if(!inraw || nreq <= 0 ||
INVALID_DB_REQ(outdbf))
return S_db_errArg;
46 pvd::PVField::const_shared_pointer in(inraw);
52 if(!in)
return S_db_errArg;
57 char *outsbuf = (
char*)outbuf;
64 if(!index)
return S_db_badField;
78 if(ival < strs.size()) {
81 const std::string& sval = strs[ival];
83 memcpy(outbuf, sval.c_str(), slen);
100 arr.
slice(0, nreq*elemsize);
101 nreq = arr.
size()/elemsize;
104 char *outsbuf = (
char*)outbuf;
113 memcpy(outsbuf, strs[
i].c_str(), slen);
114 outsbuf[slen] =
'\0';
125 }
else if(in->getField()->getType() ==
pvd::scalar) {
126 char *outsbuf = (
char*)outbuf;
135 memcpy(outbuf, val.
as<std::string>().c_str(), len);
146 memcpy(outbuf, temp.c_str(), len);
165 const pvd::PVField::shared_pointer& outraw,
173 if(!outraw)
return S_db_errArg;
175 pvd::PVField::shared_pointer out(outraw);
181 if(!out)
return S_db_errArg;
191 const std::string& instr(insbuf[0]);
198 if(!index)
return S_db_badField;
203 for(
size_t i=0, N=
std::min(
size_t(0xffff), choices.size());
i<N;
i++) {
204 if(choices[
i] == instr) {
214 result = pvd::castUnsafe<pvd::uint16>(instr);
215 }
catch(std::exception&){
220 index->putFrom(result);
229 }
else if(out->getField()->getType() ==
pvd::scalar) {
232 if(incnt==0)
return S_db_errArg;
240 return S_db_badField;
243 changed.
set(out->getFieldOffset());
FORCE_INLINE std::tr1::shared_ptr< PVField > getSubField(A a)
PVScalar is the base class for each scalar field.
#define assert(exp)
Declare that a condition should be true.
size_t elementSize(ScalarType id)
gives sizeof(T) where T depends on the scalar type id.
pointer data() const
Return Base pointer.
#define INVALID_DB_REQ(x)
long copyPVD2DBF(const pvd::PVField::const_shared_pointer &inraw, void *outbuf, short outdbf, long *outnReq)
ScalarType type() const
Type code of contained value. Or (ScalarType)-1 is empty.
void getAs(shared_vector< const T > &out) const
template class for all extensions of PVArray.
Base class for a scalarArray.
Data interface for a structure,.
size_t size() const
Number of elements visible through this vector.
epicsShareExtern void castUnsafeV(size_t count, ScalarType to, void *dest, ScalarType from, const void *src)
void putFrom(const shared_vector< const T > &inp)
void slice(size_t offset, size_t length=(size_t)-1)
Reduce the view of this shared_vector.
long copyDBF2PVD(const pvd::shared_vector< const void > &inbuf, const pvd::PVField::shared_pointer &outraw, pvd::BitSet &changed, const pvd::PVStringArray::const_svector &choices)
BitSet & set(uint32 bitIndex)
LIBCOM_API int epicsStdCall epicsSnprintf(char *str, size_t size, const char *format,...) EPICS_PRINTF_STYLE(3
::epics::pvData::shared_vector< const T > const_svector