/** * Copyright - See the COPYRIGHT that is included with this distribution. * EPICS pvData is distributed subject to a Software License Agreement found * in file LICENSE that is included with this distribution. */ /** * @author Marty Kraimer * @date 2013.07 */ #include #include #include #define epicsExportSharedSymbols #include namespace epics { namespace pvData { template void copy( PVValueArray & pvFrom, size_t fromOffset, PVValueArray & pvTo, size_t toOffset, size_t len) { if(pvTo.isImmutable()) { throw std::logic_error("pvSubArrayCopy to is immutable"); } size_t fromLength = pvFrom.getLength(); if(fromOffset+len>fromLength) { throw std::length_error("pvSubArrayCopy from length error"); } size_t capacity = pvTo.getCapacity(); if(toOffset+len>capacity) capacity = toOffset + len; shared_vector temp(capacity); typename PVValueArray::const_svector vecFrom = pvFrom.view(); typename PVValueArray::const_svector vecTo = pvTo.view(); for(size_t i=0; i temp2(freeze(temp)); pvTo.replace(temp2); } void copy( PVScalarArray & from, size_t fromOffset, PVScalarArray & to, size_t toOffset, size_t len) { ScalarType scalarType = from.getScalarArray()->getElementType(); ScalarType otherType = to.getScalarArray()->getElementType(); if(scalarType!=otherType) { throw std::invalid_argument("pvSubArrayCopy element types do not match"); } switch(scalarType) { case pvBoolean: { copy(dynamic_cast &>(from),fromOffset, dynamic_cast& >(to), toOffset,len); } break; case pvByte: { copy(dynamic_cast &>(from),fromOffset, dynamic_cast& >(to), toOffset,len); } break; case pvShort: { copy(dynamic_cast &>(from),fromOffset, dynamic_cast& >(to), toOffset,len); } break; case pvInt: { copy(dynamic_cast &>(from),fromOffset, dynamic_cast& >(to), toOffset,len); } break; case pvLong: { copy(dynamic_cast &>(from),fromOffset, dynamic_cast& >(to), toOffset,len); } break; case pvUByte: { copy(dynamic_cast &>(from),fromOffset, dynamic_cast& >(to), toOffset,len); } break; case pvUShort: { copy(dynamic_cast &>(from),fromOffset, dynamic_cast& >(to), toOffset,len); } break; case pvUInt: { copy(dynamic_cast &>(from),fromOffset, dynamic_cast& >(to), toOffset,len); } break; case pvULong: { copy(dynamic_cast &>(from),fromOffset, dynamic_cast& >(to), toOffset,len); } break; case pvFloat: { copy(dynamic_cast &>(from),fromOffset, dynamic_cast& >(to), toOffset,len); } break; case pvDouble: { copy(dynamic_cast &>(from),fromOffset, dynamic_cast& >(to), toOffset,len); } break; case pvString: { copy(dynamic_cast &>(from),fromOffset, dynamic_cast& >(to), toOffset,len); } break; } } void copy( PVStructureArray & from, size_t fromOffset, PVStructureArray & to, size_t toOffset, size_t len) { if(to.isImmutable()) { throw std::logic_error("pvSubArrayCopy to is immutable"); } StructureArrayConstPtr fromStructure = from.getStructureArray(); StructureArrayConstPtr toStructure = to.getStructureArray(); if(fromStructure!=toStructure) { throw std::invalid_argument( "pvSubArrayCopy structureArray to and from have different structures"); } size_t fromLength = from.getLength(); if(fromOffset+len>fromLength) { throw std::length_error("pvSubArrayCopy from length error"); } size_t capacity = to.getCapacity(); if(toOffset+len>capacity) capacity = toOffset+len; shared_vector temp(capacity); PVValueArray::const_svector vecFrom = from.view(); PVValueArray::const_svector vecTo = to.view(); for(size_t i=0; i temp2(freeze(temp)); to.replace(temp2); } void copy( PVArray & from, size_t fromOffset, PVArray & to, size_t toOffset, size_t len) { Type type = from.getField()->getType(); Type otherType = to.getField()->getType(); if(type!=otherType) { throw std::invalid_argument("pvSubArrayCopy types do not match"); } if(type==scalarArray) { copy(dynamic_cast(from) ,fromOffset, dynamic_cast(to), toOffset,len); } if(type==structureArray) { copy(dynamic_cast(from) ,fromOffset, dynamic_cast(to), toOffset,len); } } }}