30 #ifndef _BASE_LINE_OPERATIONS_HPP
31 #define _BASE_LINE_OPERATIONS_HPP
34 #include "Core/include/private/DImage.hpp"
40 template <
class T>
class Image;
44 template <
class T,
class T_out=T>
48 typedef typename imageInType::restrictLineType lineInType;
49 typedef typename imageInType::sliceType sliceInType;
52 typedef typename imageOutType::restrictLineType lineOutType;
53 typedef typename imageOutType::sliceType sliceOutType;
55 typedef lineInType lineType;
60 this->_exec(lineIn, size, lineOut);
64 virtual void _exec(
const lineInType,
const size_t, lineOutType) = 0;
65 virtual void _exec_aligned(
const lineInType lineIn,
const size_t size, lineOutType lineOut) { _exec(lineIn, size, lineOut); }
66 virtual void _exec(lineOutType,
const size_t,
const T_out) {}
67 virtual void _exec_aligned(lineOutType lineOut,
const size_t size, T_out value) { _exec(lineOut, size, value); }
68 inline void operator()(
const lineInType lineIn,
const size_t size, lineOutType lineOut)
74 if (!ptrOffset1 && !ptrOffset2)
76 _exec_aligned(lineIn, size, lineOut);
79 else if (ptrOffset1==ptrOffset2)
81 unsigned long misAlignSize = SIMD_VEC_SIZE - ptrOffset1;
82 _exec(lineIn, misAlignSize, lineOut);
83 _exec_aligned(lineIn+misAlignSize, size-misAlignSize, lineOut+misAlignSize);
88 _exec(lineIn, size, lineOut);
91 inline void operator()(
const lineInType lineIn,
const size_t size, T_out value)
93 if (size<SIMD_VEC_SIZE)
95 _exec(lineIn, size, value);
99 size_t misAlignSize = ptrOffset==0 ? 0 : SIMD_VEC_SIZE - ptrOffset;
101 _exec(lineIn, misAlignSize, value);
102 _exec_aligned(lineIn+misAlignSize, size-misAlignSize, value);
108 template <
class T1,
class T2=T1,
class T_out=T1>
114 typedef typename Image<T_out>::restrictLineType lineOutType;
115 typedef lineType1 lineType;
119 virtual void _exec(
const lineType1,
const lineType2,
const size_t, lineOutType) = 0;
120 virtual void _exec_aligned(
const lineType1 lineIn1,
const lineType2 lineIn2,
const size_t size, lineOutType lineOut) { _exec(lineIn1, lineIn2, size, lineOut); }
121 inline void operator()(
const lineType1 lineIn1,
const lineType2 lineIn2,
const size_t size, lineOutType lineOut)
123 return _exec(lineIn1, lineIn2, size, lineOut);
124 if (size<SIMD_VEC_SIZE)
126 _exec(lineIn1, lineIn2, size, lineOut);
134 if (!ptrOffset1 && !ptrOffset2 && !ptrOffset3)
136 _exec_aligned(lineIn1, lineIn2, size, lineOut);
139 else if (ptrOffset1==ptrOffset2 && ptrOffset2==ptrOffset3)
141 size_t misAlignSize = SIMD_VEC_SIZE - ptrOffset1;
142 _exec(lineIn1, lineIn2, misAlignSize, lineOut);
143 _exec_aligned(lineIn1+misAlignSize, lineIn2+misAlignSize, size-misAlignSize, lineOut+misAlignSize);
148 _exec(lineIn1, lineIn2, size, lineOut);
152 inline void operator()(
const lineType1 lineIn1,
const T2 value,
const size_t size, lineOutType lineOut)
154 if (size<SIMD_VEC_SIZE)
156 _exec(lineIn1, value, size, lineOut);
163 if (!ptrOffset1 && !ptrOffset2)
165 _exec_aligned(lineIn1, value, size, lineOut);
168 else if (ptrOffset1==ptrOffset2)
170 unsigned long misAlignSize = SIMD_VEC_SIZE - ptrOffset1;
171 _exec(lineIn1, value, misAlignSize, lineOut);
172 _exec_aligned(lineIn1+misAlignSize, value, size-misAlignSize, lineOut+misAlignSize);
177 _exec(lineIn1, value, size, lineOut);
185 template <
class T1,
class T2=T1,
class T3=T1,
class T_out=T1>
191 typedef typename Image<T3>::restrictLineType lineType3;
192 typedef typename Image<T_out>::restrictLineType lineOutType;
193 typedef lineType1 lineType;
195 virtual void _exec(
const lineType1 ,
const lineType2 ,
const lineType3 ,
const size_t , lineOutType ) = 0;
196 virtual void _exec_aligned(
const lineType1 lineIn1,
const lineType2 lineIn2,
const lineType3 lineIn3,
const size_t size, lineOutType lineOut) { _exec(lineIn1, lineIn2, lineIn3, size, lineOut); }
197 virtual void operator()(
const lineType1 lineIn1,
const lineType2 lineIn2,
const lineType3 lineIn3,
const size_t size, lineOutType lineOut)
199 if (size<SIMD_VEC_SIZE)
201 _exec(lineIn1, lineIn2, lineIn3, size, lineOut);
210 if (!ptrOffset1 && !ptrOffset2 && !ptrOffset3 && !ptrOffset4)
212 _exec_aligned(lineIn1, lineIn2, lineIn3, size, lineOut);
215 else if (ptrOffset1==ptrOffset2 && ptrOffset2==ptrOffset3)
217 size_t misAlignSize = SIMD_VEC_SIZE - ptrOffset1;
218 _exec(lineIn1, lineIn2, lineIn3, misAlignSize, lineOut);
219 _exec_aligned(lineIn1+misAlignSize, lineIn2+misAlignSize, lineIn3+misAlignSize, size-misAlignSize, lineOut+misAlignSize);
224 _exec(lineIn1, lineIn2, lineIn3, size, lineOut);
Main Image class.
Definition: DImage.hpp:57
Definition: DTypes.hpp:88
Definition: DBaseLineOperations.hpp:110
Definition: DBaseLineOperations.hpp:187
Definition: DBaseLineOperations.hpp:46