9 #include <pv/convert.h> 10 #include <pv/pvSubArrayCopy.h> 11 #define epicsExportSharedSymbols 18 using std::tr1::static_pointer_cast;
22 namespace epics {
namespace pvCopy{
24 static ConvertPtr convert = getConvert();
25 static std::string name(
"array");
27 PVArrayPlugin::PVArrayPlugin()
31 PVArrayPlugin::~PVArrayPlugin()
35 void PVArrayPlugin::create()
37 static bool firstTime =
true;
41 PVPluginRegistry::registerPlugin(name,pvPlugin);
46 const std::string & requestValue,
48 const PVFieldPtr & master)
50 return PVArrayFilter::create(requestValue,master);
53 PVArrayFilter::~PVArrayFilter()
57 static vector<string> split(
string const & colonSeparatedList) {
58 string::size_type numValues = 1;
59 string::size_type index=0;
61 string::size_type pos = colonSeparatedList.find(
':',index);
62 if(pos==string::npos)
break;
66 vector<string> valueList(numValues,
"");
68 for(
size_t i=0; i<numValues; i++) {
69 size_t pos = colonSeparatedList.find(
':',index);
70 string value = colonSeparatedList.substr(index,pos-index);
78 const std::string & requestValue,
79 const PVFieldPtr & master)
81 Type type = master->getField()->getType();
82 if(type!=scalarArray) {
89 vector<string> values(split(requestValue));
90 long num = values.size();
95 start = strtol(value.c_str(),0,10);
98 start = strtol(value.c_str(),0,10);
100 end = strtol(value.c_str(),0,10);
103 start = strtol(value.c_str(),0,10);
105 increment = strtol(value.c_str(),0,10);
107 end = strtol(value.c_str(),0,10);
118 start,increment,end,static_pointer_cast<PVScalarArray>(master)));
122 PVArrayFilter::PVArrayFilter(
long start,
long increment,
long end,
const PVScalarArrayPtr & masterArray)
124 increment(increment),
126 masterArray(masterArray)
131 bool PVArrayFilter::filter(
const PVFieldPtr & pvCopy,
const BitSetPtr & bitSet,
bool toCopy)
133 PVScalarArrayPtr copyArray = static_pointer_cast<PVScalarArray>(pvCopy);
135 long start = this->start;
136 long end = this->end;
137 long no_elements = masterArray->getLength();
139 start = no_elements+start;
140 if(start<0) start = 0;
143 end = no_elements + end;
144 if (end < 0) end = 0;
148 if (end >= no_elements) end = no_elements - 1;
149 if (end - start >= 0) len = 1 + (end - start) / increment;
150 if(len<=0 || start>=no_elements) {
151 copyArray->setLength(0);
154 long indfrom = start;
156 copyArray->setCapacity(len);
158 copy(*masterArray,indfrom,1,*copyArray,indto,1,len);
160 for(
long i=0; i<len; ++i) {
161 copy(*masterArray,indfrom,1,*copyArray,indto,1,1);
162 indfrom += increment;
166 copyArray->setLength(len);
167 bitSet->set(pvCopy->getFieldOffset());
170 if (end - start >= 0) len = 1 + (end - start) / increment;
171 if(len<=0)
return true;
172 if(no_elements<=end) masterArray->setLength(end+1);
176 copy(*copyArray,indfrom,1,*masterArray,indto,1,len);
178 for(
long i=0; i<len; ++i) {
179 copy(*copyArray,indfrom,1,*masterArray,indto,1,1);
187 string PVArrayFilter::getName()
std::tr1::shared_ptr< PVFilter > PVFilterPtr
std::tr1::shared_ptr< PVCopy > PVCopyPtr
A filter that gets a sub array from a PVScalarArray.
std::tr1::shared_ptr< PVArrayFilter > PVArrayFilterPtr
std::tr1::shared_ptr< PVArrayPlugin > PVArrayPluginPtr
A plugin for a filter that gets a sub array from a PVScalarArray.