This is Unofficial EPICS BASE Doxygen Site
Convert.cpp
Go to the documentation of this file.
1 /* Convert.cpp */
2 /*
3  * Copyright information and license terms for this software can be
4  * found in the file LICENSE that is included with the distribution
5  */
9 #include <cstdio>
10 #include <string>
11 #include <vector>
12 #include <stdexcept>
13 #include <typeinfo>
14 
15 #include <epicsMutex.h>
16 
17 #define epicsExportSharedSymbols
18 #include <pv/lock.h>
19 #include <pv/pvIntrospect.h>
20 #include <pv/pvData.h>
21 #include <pv/convert.h>
22 
24 using std::size_t;
25 using std::string;
26 
27 namespace epics { namespace pvData {
28 
29 
30 static std::vector<string> split(string commaSeparatedList) {
31  string::size_type numValues = 1;
32  string::size_type index=0;
33  while(true) {
34  string::size_type pos = commaSeparatedList.find(',',index);
35  if(pos==string::npos) break;
36  numValues++;
37  index = pos +1;
38  }
39  std::vector<string> valueList(numValues,"");
40  index=0;
41  for(size_t i=0; i<numValues; i++) {
42  size_t pos = commaSeparatedList.find(',',index);
43  string value = commaSeparatedList.substr(index,pos);
44  valueList[i] = value;
45  index = pos +1;
46  }
47  return valueList;
48 }
49 
50 void Convert::getString(string *buf,PVField const *pvField,int /*indentLevel*/)
51 {
52  // TODO indextLevel ignored
53  std::ostringstream strm;
54  pvField->dumpValue(strm);
55  strm << std::endl;
56  strm.str().swap(*buf);
57 }
58 
59 
60 size_t Convert::fromString(PVStructurePtr const &pvStructure, StringArray const & from, size_t fromStartIndex)
61 {
62  size_t processed = 0;
63 
64  PVFieldPtrArray const & fieldsData = pvStructure->getPVFields();
65  if (fieldsData.size() != 0) {
66  size_t length = pvStructure->getStructure()->getNumberFields();
67  for(size_t i=0; i<length; i++) {
68  PVFieldPtr fieldField = fieldsData[i];
69 
70  Type type = fieldField->getField()->getType();
71  if(type==structure) {
72  PVStructurePtr pv = static_pointer_cast<PVStructure>(fieldField);
73  size_t count = fromString(pv, from, fromStartIndex);
74  processed += count;
75  fromStartIndex += count;
76  }
77  else if(type==scalarArray) {
78  PVScalarArrayPtr pv = static_pointer_cast<PVScalarArray>(fieldField);
79  size_t count = fromString(pv, from[fromStartIndex]);
80  processed += count;
81  fromStartIndex += count;
82  }
83  else if(type==scalar) {
84  PVScalarPtr pv = static_pointer_cast<PVScalar>(fieldField);
85  fromString(pv, from[fromStartIndex++]);
86  processed++;
87  }
88  else {
89  // union, structureArray, unionArray not supported
90  std::ostringstream oss;
91  oss << "Convert::fromString unsupported fieldType " << type;
92  throw std::logic_error(oss.str());
93  }
94  }
95  }
96 
97  return processed;
98 }
99 
100 size_t Convert::fromString(PVScalarArrayPtr const &pv, string from)
101 {
102  if(from[0]=='[' && from[from.length()]==']') {
103  size_t offset = from.rfind(']');
104  from = from.substr(1, offset);
105  }
106  std::vector<string> valueList(split(from));
107  size_t length = valueList.size();
108  size_t num = fromStringArray(pv,0,length,valueList,0);
109  if(num<length) length = num;
110  pv->setLength(length);
111  return length;
112 }
113 
115  size_t offset, size_t length,
116  StringArray const & from,
117  size_t fromOffset)
118 {
119  size_t alen = pv->getLength();
120 
121  if(offset==0 && length>=alen) {
122  // replace all existing elements
123  assert(from.size()>=fromOffset+length);
124 
125  PVStringArray::svector data(length);
126  std::copy(from.begin()+fromOffset,
127  from.begin()+fromOffset+length,
128  data.begin());
129 
130  PVStringArray::const_svector temp(freeze(data));
131  pv->putFrom<string>(temp);
132  return length;
133 
134  } else {
135  // partial update.
136  throw std::runtime_error("fromStringArray: partial update not implemented");
137  }
138 }
139 
141  size_t offset, size_t length,
142  StringArray &to, size_t toOffset)
143 {
145  pv->getAs<string>(data);
146  data.slice(offset, length);
147  if(toOffset+data.size() > to.size())
148  to.resize(toOffset+data.size());
149  std::copy(data.begin()+toOffset, data.end(), to.begin());
150  return data.size();
151 }
152 
154 {
155  static ConvertPtr convert;
156  static Mutex mutex;
157  Lock xx(mutex);
158 
159  if(convert.get()==0) {
160  convert = ConvertPtr(new Convert());
161  }
162  return convert;
163 }
164 
165 }}
Definition: link.h:174
Conversion and Copy facility for pvData.
Definition: convert.h:47
#define assert(exp)
Declare that a condition should be true.
Definition: epicsAssert.h:70
static ConvertPtr getConvert()
Definition: Convert.cpp:153
A holder for a contiguous piece of memory.
Definition: sharedVector.h:27
int i
Definition: scan.c:967
Definition: tool_lib.h:67
shared_ptr< T > static_pointer_cast(shared_ptr< U > const &r) BOOST_NOEXCEPT
Definition: shared_ptr.hpp:788
pvd::StructureConstPtr type
void getString(std::string *buf, PVFieldPtr const &pvField)
Definition: convert.h:70
TODO only here because of the Lockable.
Definition: ntaggregate.cpp:16
A lock for multithreading.
Definition: lock.h:36
void copy(PVValueArray< T > &pvFrom, size_t fromOffset, size_t fromStride, PVValueArray< T > &pvTo, size_t toOffset, size_t toStride, size_t count)
Copy a subarray from one scalar array to another.
epicsMutex mutex
Definition: pvAccess.cpp:71
APIs for the epicsMutex mutual exclusion semaphore.
std::size_t toStringArray(PVScalarArrayPtr const &pv, std::size_t offset, std::size_t length, StringArray &to, std::size_t toOffset)
Definition: Convert.cpp:140
std::tr1::shared_ptr< PVScalar > PVScalarPtr
Definition: pvData.h:77
std::vector< PVFieldPtr > PVFieldPtrArray
Definition: pvData.h:70
size_t size() const
Number of elements visible through this vector.
Definition: sharedVector.h:220
std::tr1::shared_ptr< PVStructure > PVStructurePtr
Definition: pvData.h:87
std::vector< std::string > StringArray
Definition: pvType.h:110
std::tr1::shared_ptr< PVField > PVFieldPtr
Definition: pvData.h:66
std::size_t fromStringArray(PVScalarArrayPtr const &pv, std::size_t offset, std::size_t length, StringArray const &from, std::size_t fromOffset)
Definition: Convert.cpp:114
std::tr1::shared_ptr< Convert > ConvertPtr
Definition: convert.h:23
void slice(size_t offset, size_t length=(size_t)-1)
Reduce the view of this shared_vector.
Definition: sharedVector.h:244
epicsMutex Mutex
Definition: lock.h:28
std::tr1::shared_ptr< PVScalarArray > PVScalarArrayPtr
Definition: pvData.h:82
std::size_t fromString(PVStructurePtr const &pv, StringArray const &from, std::size_t fromStartIndex=0)