15 #ifndef __IPSDKUTIL_INSTRUCTIONSET_DETAIL_STD_SATURATEDCASTPACK_H__ 16 #define __IPSDKUTIL_INSTRUCTIONSET_DETAIL_STD_SATURATEDCASTPACK_H__ 25 #include <boost/type_traits/is_same.hpp> 26 #include <boost/type_traits/is_signed.hpp> 35 template <
typename TIn,
typename TOut>
37 typename boost::enable_if_c<
38 boost::is_same<TIn, TOut>::value
42 static IPSDK_FORCEINLINE
47 out._val =
static_cast<TOut
>(in._val);
51 static IPSDK_FORCEINLINE
56 out._val =
static_cast<TOut
>(in._val);
60 template <
typename TIn,
typename TOut>
62 typename boost::enable_if_c<
63 boost::is_integral<TIn>::value &&
64 boost::is_integral<TOut>::value &&
65 boost::is_signed<TIn>::value==boost::is_signed<TOut>::value &&
66 sizeof(TIn)<sizeof(TOut)
70 static IPSDK_FORCEINLINE
75 out._val =
static_cast<TOut
>(in._val);
79 static IPSDK_FORCEINLINE
84 out._val =
static_cast<TOut
>(in._val);
88 template <
typename TIn,
typename TOut>
90 typename boost::enable_if_c<
91 boost::is_integral<TIn>::value &&
92 boost::is_integral<TOut>::value &&
93 boost::is_signed<TIn>::value &&
94 !boost::is_signed<TOut>::value &&
95 sizeof(TOut)>=sizeof(TIn)
99 static IPSDK_FORCEINLINE
103 const TIn clampedIn = in._val >= 0 ? in._val : 0;
105 out._val =
static_cast<TOut
>(clampedIn);
109 static IPSDK_FORCEINLINE
114 const TIn clampedIn = in._val >= 0 ? in._val : 0;
115 out._val =
static_cast<TOut
>(clampedIn);
119 template <
typename TIn,
typename TOut>
121 typename boost::enable_if_c<
122 boost::is_integral<TIn>::value &&
123 boost::is_integral<TOut>::value &&
124 !boost::is_signed<TIn>::value &&
125 boost::is_signed<TOut>::value &&
126 sizeof(TOut)<=sizeof(TIn)
130 static IPSDK_FORCEINLINE
131 BasePack<ePackType::ePT_Scalar, TOut>
132 act(
const BasePack<ePackType::ePT_Scalar, TIn>& in)
134 static TIn nMax =
static_cast<TIn
>(NumericLimits<TOut>::max());
135 const TIn clampedIn = (in._val >= nMax ? nMax : in._val);
136 BasePack<ePackType::ePT_Scalar, TOut> out;
137 out._val =
static_cast<TOut
>(clampedIn);
141 static IPSDK_FORCEINLINE
143 act(
const BasePack<ePackType::ePT_Scalar, TIn>& in,
144 BasePack<ePackType::ePT_Scalar, TOut>& out)
146 const TIn nMax =
static_cast<TIn
>(NumericLimits<TOut>::max());
147 const TIn clampedIn = (in._val >= nMax ? nMax : in._val);
148 out._val =
static_cast<TOut
>(clampedIn);
152 template <
typename TIn,
typename TOut>
154 typename boost::enable_if_c<
155 boost::is_integral<TIn>::value &&
156 boost::is_integral<TOut>::value &&
157 !boost::is_signed<TIn>::value &&
158 boost::is_signed<TOut>::value &&
159 (sizeof(TOut) > sizeof(TIn))
163 static IPSDK_FORCEINLINE
164 BasePack<ePackType::ePT_Scalar, TOut>
165 act(
const BasePack<ePackType::ePT_Scalar, TIn>& in)
167 BasePack<ePackType::ePT_Scalar, TOut> out;
168 out._val =
static_cast<TOut
>(in._val);
172 static IPSDK_FORCEINLINE
174 act(
const BasePack<ePackType::ePT_Scalar, TIn>& in,
175 BasePack<ePackType::ePT_Scalar, TOut>& out)
177 out._val =
static_cast<TOut
>(in._val);
181 template <
typename TIn,
typename TOut>
183 typename boost::enable_if_c<
184 boost::is_integral<TIn>::value &&
185 boost::is_integral<TOut>::value &&
186 !boost::is_signed<TIn>::value &&
187 !boost::is_signed<TOut>::value &&
188 sizeof(TOut)<sizeof(TIn)
192 static IPSDK_FORCEINLINE
193 BasePack<ePackType::ePT_Scalar, TOut>
194 act(
const BasePack<ePackType::ePT_Scalar, TIn>& in)
196 static TIn nMax =
static_cast<TIn
>(NumericLimits<TOut>::max());
197 const TIn clampedIn = (in._val >= nMax ? nMax : in._val);
198 BasePack<ePackType::ePT_Scalar, TOut> out;
199 out._val =
static_cast<TOut
>(clampedIn);
203 static IPSDK_FORCEINLINE
205 act(
const BasePack<ePackType::ePT_Scalar, TIn>& in,
206 BasePack<ePackType::ePT_Scalar, TOut>& out)
208 const TIn nMax =
static_cast<TIn
>(NumericLimits<TOut>::max());
209 const TIn clampedIn = (in._val >= nMax ? nMax : in._val);
210 out._val =
static_cast<TOut
>(clampedIn);
214 template <
typename TIn,
typename TOut>
216 typename boost::enable_if_c<
217 boost::is_integral<TIn>::value &&
218 boost::is_integral<TOut>::value &&
219 boost::is_signed<TIn>::value &&
220 sizeof(TOut)<sizeof(TIn)
224 static IPSDK_FORCEINLINE
225 BasePack<ePackType::ePT_Scalar, TOut>
226 act(
const BasePack<ePackType::ePT_Scalar, TIn>& in)
228 BasePack<ePackType::ePT_Scalar, TOut> out;
229 const TIn nMin =
static_cast<TIn
>(NumericLimits<TOut>::min());
230 const TIn nMax =
static_cast<TIn
>(NumericLimits<TOut>::max());
231 TIn clampedIn = (in._val > nMax ? nMax : in._val);
232 clampedIn = (clampedIn < nMin ? nMin : clampedIn);
233 out._val =
static_cast<TOut
>(clampedIn);
237 static IPSDK_FORCEINLINE
239 act(
const BasePack<ePackType::ePT_Scalar, TIn>& in,
240 BasePack<ePackType::ePT_Scalar, TOut>& out)
242 const TIn nMin =
static_cast<TIn
>(NumericLimits<TOut>::min());
243 const TIn nMax =
static_cast<TIn
>(NumericLimits<TOut>::max());
244 TIn clampedIn = (in._val > nMax ? nMax : in._val);
245 clampedIn = (clampedIn < nMin ? nMin : clampedIn);
246 out._val =
static_cast<TOut
>(clampedIn);
250 template <
typename TIn>
252 typename boost::enable_if_c<boost::is_integral<TIn>::value>::type>
254 static IPSDK_FORCEINLINE
255 BasePack<ePackType::ePT_Scalar, ipReal32>
256 act(
const BasePack<ePackType::ePT_Scalar, TIn>& in)
258 BasePack<ePackType::ePT_Scalar, ipReal32> out;
259 out._val =
static_cast<ipReal32>(in._val);
263 static IPSDK_FORCEINLINE
265 act(
const BasePack<ePackType::ePT_Scalar, TIn>& in,
266 BasePack<ePackType::ePT_Scalar, ipReal32>& out)
268 out._val =
static_cast<ipReal32>(in._val);
272 template <
typename TOut>
274 typename boost::enable_if_c<boost::is_integral<TOut>::value>::type>
276 static IPSDK_FORCEINLINE
277 BasePack<ePackType::ePT_Scalar, TOut>
278 act(
const BasePack<ePackType::ePT_Scalar, ipReal32>& in)
280 BasePack<ePackType::ePT_Scalar, TOut> out;
283 const TOut tMin = NumericLimits<TOut>::min();
284 const TOut tMax = NumericLimits<TOut>::max();
285 TOut clampedIn =
static_cast<TOut
>(in._val);
286 clampedIn = (in._val > fMax ? tMax : clampedIn);
287 clampedIn = (in._val < fMin ? tMin : clampedIn);
288 out._val =
static_cast<TOut
>(clampedIn);
292 static IPSDK_FORCEINLINE
294 act(
const BasePack<ePackType::ePT_Scalar, ipReal32>& in,
295 BasePack<ePackType::ePT_Scalar, TOut>& out)
297 const TOut tMin = NumericLimits<TOut>::min();
298 const TOut tMax = NumericLimits<TOut>::max();
301 TOut clampedIn =
static_cast<TOut
>(in._val);
302 clampedIn = (in._val > fMax ? tMax : clampedIn);
303 clampedIn = (in._val < fMin ? tMin : clampedIn);
304 out._val = clampedIn;
308 template <
typename TIn>
310 typename boost::enable_if_c<
311 !boost::is_same<TIn, ipReal64>::value
315 static IPSDK_FORCEINLINE
316 BasePack<ePackType::ePT_Scalar, ipReal64>
317 act(
const BasePack<ePackType::ePT_Scalar, TIn>& in)
319 BasePack<ePackType::ePT_Scalar, ipReal32> out;
320 out._val =
static_cast<ipReal64>(in._val);
324 static IPSDK_FORCEINLINE
326 act(
const BasePack<ePackType::ePT_Scalar, TIn>& in,
327 BasePack<ePackType::ePT_Scalar, ipReal64>& out)
329 out._val =
static_cast<ipReal64>(in._val);
333 template <
typename TOut>
335 typename boost::enable_if_c<
336 !boost::is_same<ipReal64, TOut>::value
340 static IPSDK_FORCEINLINE
341 BasePack<ePackType::ePT_Scalar, TOut>
342 act(
const BasePack<ePackType::ePT_Scalar, ipReal64>& in)
344 BasePack<ePackType::ePT_Scalar, TOut> out;
345 const TOut tMin = NumericLimits<TOut>::min();
346 const TOut tMax = NumericLimits<TOut>::max();
349 TOut clampedIn = (in._val > fMax ? tMax :
static_cast<TOut
>(in._val));
350 clampedIn = (in._val < fMin ? tMin : clampedIn);
351 out._val = clampedIn;
355 static IPSDK_FORCEINLINE
357 act(
const BasePack<ePackType::ePT_Scalar, ipReal64>& in,
358 BasePack<ePackType::ePT_Scalar, TOut>& out)
360 const TOut tMin = NumericLimits<TOut>::min();
361 const TOut tMax = NumericLimits<TOut>::max();
364 TOut clampedIn = (in._val > fMax ? tMax :
static_cast<TOut
>(in._val));
365 clampedIn = (in._val < fMin ? tMin : clampedIn);
366 out._val = clampedIn;
377 #endif // __IPSDKUTIL_INSTRUCTIONSET_DETAIL_STD_SATURATEDCASTPACK_H__ Defines the IPSDK_FORCEINLINE.
Main namespace for IPSDK library.
Definition: AlgorithmFunctionEfficiency.h:22
Definition: SaturatedCastPack.h:33
double ipReal64
Base types definition.
Definition: BaseTypes.h:57
BasePack class; defines a set of scalars (for instruction set "standard") or registers (for all other...
eInstructionSet
Enumerate for processor instruction set description.
Definition: InstructionSetTypes.h:31
Definition of import/export macro for library.
compiler optimisations only
Definition: InstructionSetTypes.h:34
float ipReal32
Base types definition.
Definition: BaseTypes.h:56
structure containing intrinsic registers used to store vectorized data
Definition: BasePackDecl.h:29