Line data Source code
1 : /** 2 : * \file InPointerFilter.hxx 3 : */ 4 : 5 : #include "InPointerFilter.h" 6 : 7 : #include <cstring> 8 : 9 : namespace ATK 10 : { 11 : template<typename DataType> 12 188 : InPointerFilter<DataType>::InPointerFilter(const DataType* array, int channels, gsl::index size, bool interleaved) 13 188 : :TypedBaseFilter<DataType>(0, static_cast<int>(interleaved?size:channels)), array(array), mysize(interleaved?channels:size), channels(static_cast<int>(interleaved?size:channels)), interleaved(interleaved) 14 : { 15 188 : } 16 : 17 : template<typename DataType> 18 7 : void InPointerFilter<DataType>::set_pointer(const DataType* array, gsl::index size) 19 : { 20 7 : this->array = array; 21 7 : mysize = size; 22 7 : offset = 0; 23 7 : } 24 : 25 : template<typename DataType> 26 605 : void InPointerFilter<DataType>::process_impl(gsl::index size) const 27 : { 28 605 : if(!interleaved) 29 : { 30 600 : auto i = std::min(size, mysize - offset); 31 600 : if (mysize < offset) 32 : { 33 2 : i = 0; 34 : } 35 1206 : for(gsl::index j = 0; j < channels; ++j) 36 : { 37 606 : memcpy(reinterpret_cast<void*>(outputs[j]), reinterpret_cast<const void*>(&array[offset + (j * mysize)]), static_cast<size_t>(i) * sizeof(DataType)); 38 : } 39 732 : for(; i < size; ++i) 40 : { 41 286 : for(gsl::index j = 0; j < channels; ++j) 42 : { 43 154 : outputs[j][i] = TypeTraits<DataType>::Zero(); 44 : } 45 : } 46 : } 47 : else 48 : { 49 5 : gsl::index i = 0; 50 215 : for(i = 0; i < size && (i + offset < mysize); ++i) 51 : { 52 630 : for(gsl::index j = 0; j < channels; ++j) 53 : { 54 420 : outputs[j][i] = array[channels * offset + (j + i * channels)]; 55 : } 56 : } 57 105 : for(; i < size; ++i) 58 : { 59 300 : for(gsl::index j = 0; j < channels; ++j) 60 : { 61 200 : outputs[j][i] = TypeTraits<DataType>::Zero(); 62 : } 63 : } 64 : } 65 : 66 605 : offset += size; 67 605 : } 68 : }