13 #define epicsExportSharedSymbols 20 namespace epics {
namespace pvData {
32 if(pvTo.
isImmutable())
throw std::invalid_argument(
"pvSubArrayCopy: pvTo is immutable");
33 if(fromStride<1 || toStride<1)
throw std::invalid_argument(
"stride must be >=1");
35 size_t maxcount = (fromLength -fromOffset + fromStride -1)/fromStride;
36 if(count>maxcount)
throw std::invalid_argument(
"pvSubArrayCopy pvFrom length error");
37 size_t newLength = toOffset + count*toStride;
39 if(newLength>capacity) capacity = newLength;
44 for(
size_t i=pvTo.
getLength();
i< capacity; ++
i) temp[
i] = T();
45 for(
size_t i=0;
i<count; ++
i) temp[
i*toStride + toOffset] = vecFrom[
i*fromStride+fromOffset];
61 if(scalarType!=otherType) {
62 throw std::invalid_argument(
"pvSubArrayCopy element types do not match");
70 toOffset,toStride,count);
77 toOffset,toStride,count);
84 toOffset,toStride,count);
91 toOffset,toStride,count);
98 toOffset,toStride,count);
105 toOffset,toStride,count);
112 toOffset,toStride,count);
119 toOffset,toStride,count);
126 toOffset,toStride,count);
133 toOffset,toStride,count);
140 toOffset,toStride,count);
147 toOffset,toStride,count);
163 throw std::logic_error(
"pvSubArrayCopy pvTo is immutable");
165 if(pvFromStride<1 || toStride<1)
throw std::invalid_argument(
"stride must be >=1");
168 if(pvFromStructure->getStructure()!=toStructure->getStructure()) {
169 throw std::invalid_argument(
170 "pvSubArrayCopy structureArray pvTo and pvFrom have different structures");
172 size_t pvFromLength = pvFrom.
getLength();
173 size_t maxcount = (pvFromLength -pvFromOffset + pvFromStride -1)/pvFromStride;
174 if(count>maxcount)
throw std::invalid_argument(
"pvSubArrayCopy pvFrom length error");
175 size_t newLength = toOffset + count*toStride;
177 if(newLength>capacity) capacity = newLength;
183 temp[
i] =
getPVDataCreate()->createPVStructure(toStructure->getStructure());
184 for(
size_t i=0;
i<count; ++
i) temp[
i*toStride + toOffset] = vecFrom[
i*pvFromStride+pvFromOffset];
199 throw std::logic_error(
"pvSubArrayCopy pvTo is immutable");
201 if(pvFromStride<1 || toStride<1)
throw std::invalid_argument(
"stride must be >=1");
204 if(pvFromUnion->getUnion()!=toUnion->getUnion()) {
205 throw std::invalid_argument(
206 "pvSubArrayCopy unionArray pvTo and pvFrom have different unions");
208 size_t pvFromLength = pvFrom.
getLength();
209 size_t maxcount = (pvFromLength -pvFromOffset + pvFromStride -1)/pvFromStride;
210 if(count>maxcount)
throw std::invalid_argument(
"pvSubArrayCopy pvFrom length error");
211 size_t newLength = toOffset + count*toStride;
213 if(newLength>capacity) capacity = newLength;
220 for(
size_t i=0;
i<count; ++
i) temp[
i*toStride + toOffset] = vecFrom[
i*pvFromStride+pvFromOffset];
236 if(pvFromType!=pvToType)
throw std::invalid_argument(
"pvSubArrayCopy: pvFrom and pvTo different types");
240 if(pvFromScalarType!=pvToScalarType){
241 throw std::invalid_argument(
"pvSubArrayCopy: pvFrom and pvTo different types");
244 if(pvTo.
isImmutable())
throw std::invalid_argument(
"pvSubArrayCopy: pvTo is immutable");
246 copy(dynamic_cast<PVScalarArray &>(pvFrom) ,pvFromOffset,pvFromStride,
247 dynamic_cast<PVScalarArray&>(pvTo),
248 pvToOffset,pvToStride,count);
251 copy(dynamic_cast<PVStructureArray &>(pvFrom) ,pvFromOffset,pvFromStride,
252 dynamic_cast<PVStructureArray&>(pvTo),
253 pvToOffset,pvToStride,count);
256 copy(dynamic_cast<PVUnionArray &>(pvFrom) ,pvFromOffset,pvFromStride,
257 dynamic_cast<PVUnionArray&>(pvTo),
258 pvToOffset,pvToStride,count);
263 PVArray::shared_pointer
const & pvFrom,
266 PVArray::shared_pointer & pvTo,
271 copy(*pvFrom,pvFromOffset,pvFromStride,*pvTo,pvToOffset,pvToStride,count);
virtual const_svector view() const OVERRIDE FINAL
Fetch a read-only view of the current array data.
Data class for a unionArray.
A holder for a contiguous piece of memory.
StructureArrayConstPtr getStructureArray() const
const FieldConstPtr & getField() const
virtual void replace(const const_svector &other) OVERRIDE FINAL
TODO only here because of the Lockable.
std::tr1::shared_ptr< const StructureArray > StructureArrayConstPtr
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.
virtual size_t getCapacity() const OVERRIDE FINAL
virtual void replace(const const_svector &next) OVERRIDE FINAL
template class for all extensions of PVArray.
Base class for a scalarArray.
virtual size_t getCapacity() const OVERRIDE FINAL
const ScalarArrayConstPtr getScalarArray() const
virtual size_t getLength() const OVERRIDE FINAL
Data class for a structureArray.
virtual size_t getCapacity() const OVERRIDE FINAL
virtual void replace(const const_svector &other) OVERRIDE FINAL
virtual const_svector view() const OVERRIDE FINAL
Fetch a read-only view of the current array data.
virtual size_t getLength() const OVERRIDE FINAL
virtual size_t getLength() const OVERRIDE FINAL
virtual const_svector view() const OVERRIDE
Fetch a read-only view of the current array data.
PVArray is the base class for all array types.
UnionArrayConstPtr getUnionArray() const
FORCE_INLINE const PVDataCreatePtr & getPVDataCreate()
std::tr1::shared_ptr< const UnionArray > UnionArrayConstPtr