| 196 | } // anonymous namespace |
| 197 | |
| 198 | void copyData( uint8_t srcDimensions, size_t srcStrideBytes, const float *srcData, size_t numElements, uint8_t dstDimensions, size_t dstStrideBytes, float *dstData ) |
| 199 | { |
| 200 | if( srcStrideBytes == 0 ) |
| 201 | srcStrideBytes = srcDimensions * sizeof(float); |
| 202 | if( dstStrideBytes == 0 ) |
| 203 | dstStrideBytes = dstDimensions * sizeof(float); |
| 204 | |
| 205 | if( srcDimensions == 0 ) { // fill with zeros |
| 206 | for( size_t v = 0; v < numElements; ++v ) { |
| 207 | for( uint8_t d = 0; d < dstDimensions; ++d ) |
| 208 | dstData[d] = 0; |
| 209 | dstData = (float*)((uint8_t*)dstData + dstStrideBytes); |
| 210 | } |
| 211 | } |
| 212 | else if( srcStrideBytes == srcDimensions * sizeof(float) ) // call equivalent method that doesn't support srcStrideBytes |
| 213 | copyData( srcDimensions, srcData, numElements, dstDimensions, dstStrideBytes, dstData ); |
| 214 | // we can get away with a memcpy |
| 215 | else if( (srcDimensions == dstDimensions) && (dstStrideBytes == dstDimensions * sizeof(float)) && (srcStrideBytes == dstStrideBytes) ) { |
| 216 | memcpy( dstData, srcData, numElements * srcDimensions * sizeof(float) ); |
| 217 | } |
| 218 | else { |
| 219 | switch( srcDimensions ) { |
| 220 | case 1: |
| 221 | switch( dstDimensions ) { |
| 222 | case 1: copyDataImpl<1,1>( srcData, srcStrideBytes, numElements, dstStrideBytes, dstData ); break; |
| 223 | case 2: copyDataImpl<1,2>( srcData, srcStrideBytes, numElements, dstStrideBytes, dstData ); break; |
| 224 | case 3: copyDataImpl<1,3>( srcData, srcStrideBytes, numElements, dstStrideBytes, dstData ); break; |
| 225 | case 4: copyDataImpl<1,4>( srcData, srcStrideBytes, numElements, dstStrideBytes, dstData ); break; |
| 226 | default: throw ExcIllegalDestDimensions(); |
| 227 | } |
| 228 | break; |
| 229 | case 2: |
| 230 | switch( dstDimensions ) { |
| 231 | case 1: copyDataImpl<2,1>( srcData, srcStrideBytes, numElements, dstStrideBytes, dstData ); break; |
| 232 | case 2: copyDataImpl<2,2>( srcData, srcStrideBytes, numElements, dstStrideBytes, dstData ); break; |
| 233 | case 3: copyDataImpl<2,3>( srcData, srcStrideBytes, numElements, dstStrideBytes, dstData ); break; |
| 234 | case 4: copyDataImpl<2,4>( srcData, srcStrideBytes, numElements, dstStrideBytes, dstData ); break; |
| 235 | default: throw ExcIllegalDestDimensions(); |
| 236 | } |
| 237 | break; |
| 238 | case 3: |
| 239 | switch( dstDimensions ) { |
| 240 | case 1: copyDataImpl<3,1>( srcData, srcStrideBytes, numElements, dstStrideBytes, dstData ); break; |
| 241 | case 2: copyDataImpl<3,2>( srcData, srcStrideBytes, numElements, dstStrideBytes, dstData ); break; |
| 242 | case 3: copyDataImpl<3,3>( srcData, srcStrideBytes, numElements, dstStrideBytes, dstData ); break; |
| 243 | case 4: copyDataImpl<3,4>( srcData, srcStrideBytes, numElements, dstStrideBytes, dstData ); break; |
| 244 | default: throw ExcIllegalDestDimensions(); |
| 245 | } |
| 246 | break; |
| 247 | case 4: |
| 248 | switch( dstDimensions ) { |
| 249 | case 1: copyDataImpl<4,1>( srcData, srcStrideBytes, numElements, dstStrideBytes, dstData ); break; |
| 250 | case 2: copyDataImpl<4,2>( srcData, srcStrideBytes, numElements, dstStrideBytes, dstData ); break; |
| 251 | case 3: copyDataImpl<4,3>( srcData, srcStrideBytes, numElements, dstStrideBytes, dstData ); break; |
| 252 | case 4: copyDataImpl<4,4>( srcData, srcStrideBytes, numElements, dstStrideBytes, dstData ); break; |
| 253 | default: throw ExcIllegalDestDimensions(); |
| 254 | } |
| 255 | break; |
no outgoing calls
no test coverage detected