nndeploy C++ API  0.2.0
nndeploy C++ API
saturate_cast.h
Go to the documentation of this file.
1 #ifndef _NNDEPLOY_BASE_SATURATE_CAST_H_
2 #define _NNDEPLOY_BASE_SATURATE_CAST_H_
3 
5 
6 namespace nndeploy {
7 namespace base {
8 
32 template <typename T>
33 static inline T saturate_cast(unsigned char v) {
34  return T(v);
35 }
37 template <typename T>
38 static inline T saturate_cast(signed char v) {
39  return T(v);
40 }
42 template <typename T>
43 static inline T saturate_cast(unsigned short v) {
44  return T(v);
45 }
47 template <typename T>
48 static inline T saturate_cast(short v) {
49  return T(v);
50 }
52 template <typename T>
53 static inline T saturate_cast(unsigned v) {
54  return T(v);
55 }
57 template <typename T>
58 static inline T saturate_cast(int v) {
59  return T(v);
60 }
62 template <typename T>
63 static inline T saturate_cast(float v) {
64  return T(v);
65 }
67 template <typename T>
68 static inline T saturate_cast(double v) {
69  return T(v);
70 }
72 template <typename T>
73 static inline T saturate_cast(int64_t v) {
74  return T(v);
75 }
77 template <typename T>
78 static inline T saturate_cast(uint64_t v) {
79  return T(v);
80 }
81 
82 template <>
83 inline unsigned char saturate_cast<unsigned char>(signed char v) {
84  return (unsigned char)std::max((int)v, 0);
85 }
86 template <>
87 inline unsigned char saturate_cast<unsigned char>(unsigned short v) {
88  return (unsigned char)std::min((unsigned)v, (unsigned)UCHAR_MAX);
89 }
90 template <>
91 inline unsigned char saturate_cast<unsigned char>(int v) {
92  return (unsigned char)((unsigned)v <= UCHAR_MAX ? v : v > 0 ? UCHAR_MAX : 0);
93 }
94 template <>
95 inline unsigned char saturate_cast<unsigned char>(short v) {
96  return saturate_cast<unsigned char>((int)v);
97 }
98 template <>
99 inline unsigned char saturate_cast<unsigned char>(unsigned v) {
100  return (unsigned char)std::min(v, (unsigned)UCHAR_MAX);
101 }
102 template <>
103 inline unsigned char saturate_cast<unsigned char>(float v) {
104  int iv = static_cast<int>(std::round(v));
105  return saturate_cast<unsigned char>(iv);
106 }
107 template <>
108 inline unsigned char saturate_cast<unsigned char>(double v) {
109  int iv = static_cast<int>(std::round(v));
110  return saturate_cast<unsigned char>(iv);
111 }
112 template <>
113 inline unsigned char saturate_cast<unsigned char>(int64_t v) {
114  return (unsigned char)((uint64_t)v <= (uint64_t)UCHAR_MAX ? v
115  : v > 0 ? UCHAR_MAX
116  : 0);
117 }
118 template <>
119 inline unsigned char saturate_cast<unsigned char>(uint64_t v) {
120  return (unsigned char)std::min(v, (uint64_t)UCHAR_MAX);
121 }
122 
123 template <>
124 inline signed char saturate_cast<signed char>(unsigned char v) {
125  return (signed char)std::min((int)v, SCHAR_MAX);
126 }
127 template <>
128 inline signed char saturate_cast<signed char>(unsigned short v) {
129  return (signed char)std::min((unsigned)v, (unsigned)SCHAR_MAX);
130 }
131 template <>
132 inline signed char saturate_cast<signed char>(int v) {
133  return (signed char)((unsigned)(v - SCHAR_MIN) <= (unsigned)UCHAR_MAX ? v
134  : v > 0 ? SCHAR_MAX
135  : SCHAR_MIN);
136 }
137 template <>
138 inline signed char saturate_cast<signed char>(short v) {
139  return saturate_cast<signed char>((int)v);
140 }
141 template <>
142 inline signed char saturate_cast<signed char>(unsigned v) {
143  return (signed char)std::min(v, (unsigned)SCHAR_MAX);
144 }
145 template <>
146 inline signed char saturate_cast<signed char>(float v) {
147  int iv = static_cast<int>(std::round(v));
148  return saturate_cast<signed char>(iv);
149 }
150 template <>
151 inline signed char saturate_cast<signed char>(double v) {
152  int iv = static_cast<int>(std::round(v));
153  return saturate_cast<signed char>(iv);
154 }
155 template <>
156 inline signed char saturate_cast<signed char>(int64_t v) {
157  return (signed char)((uint64_t)((int64_t)v - SCHAR_MIN) <= (uint64_t)UCHAR_MAX
158  ? v
159  : v > 0 ? SCHAR_MAX
160  : SCHAR_MIN);
161 }
162 template <>
163 inline signed char saturate_cast<signed char>(uint64_t v) {
164  return (signed char)std::min(v, (uint64_t)SCHAR_MAX);
165 }
166 
167 template <>
168 inline unsigned short saturate_cast<unsigned short>(signed char v) {
169  return (unsigned short)std::max((int)v, 0);
170 }
171 template <>
172 inline unsigned short saturate_cast<unsigned short>(short v) {
173  return (unsigned short)std::max((int)v, 0);
174 }
175 template <>
176 inline unsigned short saturate_cast<unsigned short>(int v) {
177  return (unsigned short)((unsigned)v <= (unsigned)USHRT_MAX ? v
178  : v > 0 ? USHRT_MAX
179  : 0);
180 }
181 template <>
182 inline unsigned short saturate_cast<unsigned short>(unsigned v) {
183  return (unsigned short)std::min(v, (unsigned)USHRT_MAX);
184 }
185 template <>
186 inline unsigned short saturate_cast<unsigned short>(float v) {
187  int iv = static_cast<int>(std::round(v));
189 }
190 template <>
191 inline unsigned short saturate_cast<unsigned short>(double v) {
192  int iv = static_cast<int>(std::round(v));
194 }
195 template <>
196 inline unsigned short saturate_cast<unsigned short>(int64_t v) {
197  return (unsigned short)((uint64_t)v <= (uint64_t)USHRT_MAX ? v
198  : v > 0 ? USHRT_MAX
199  : 0);
200 }
201 template <>
202 inline unsigned short saturate_cast<unsigned short>(uint64_t v) {
203  return (unsigned short)std::min(v, (uint64_t)USHRT_MAX);
204 }
205 
206 template <>
207 inline short saturate_cast<short>(unsigned short v) {
208  return (short)std::min((int)v, SHRT_MAX);
209 }
210 template <>
211 inline short saturate_cast<short>(int v) {
212  return (short)((unsigned)(v - SHRT_MIN) <= (unsigned)USHRT_MAX ? v
213  : v > 0 ? SHRT_MAX
214  : SHRT_MIN);
215 }
216 template <>
217 inline short saturate_cast<short>(unsigned v) {
218  return (short)std::min(v, (unsigned)SHRT_MAX);
219 }
220 template <>
221 inline short saturate_cast<short>(float v) {
222  int iv = static_cast<int>(std::round(v));
223  return saturate_cast<short>(iv);
224 }
225 template <>
226 inline short saturate_cast<short>(double v) {
227  int iv = static_cast<int>(std::round(v));
228  return saturate_cast<short>(iv);
229 }
230 template <>
231 inline short saturate_cast<short>(int64_t v) {
232  return (short)((uint64_t)((int64_t)v - SHRT_MIN) <= (uint64_t)USHRT_MAX ? v
233  : v > 0 ? SHRT_MAX
234  : SHRT_MIN);
235 }
236 template <>
237 inline short saturate_cast<short>(uint64_t v) {
238  return (short)std::min(v, (uint64_t)SHRT_MAX);
239 }
240 
241 template <>
242 inline int saturate_cast<int>(unsigned v) {
243  return (int)std::min(v, (unsigned)INT_MAX);
244 }
245 template <>
246 inline int saturate_cast<int>(int64_t v) {
247  return (int)((uint64_t)(v - INT_MIN) <= (uint64_t)UINT_MAX ? v
248  : v > 0 ? INT_MAX
249  : INT_MIN);
250 }
251 template <>
252 inline int saturate_cast<int>(uint64_t v) {
253  return (int)std::min(v, (uint64_t)INT_MAX);
254 }
255 template <>
256 inline int saturate_cast<int>(float v) {
257  return static_cast<int>(std::round(v));
258 }
259 template <>
260 inline int saturate_cast<int>(double v) {
261  return static_cast<int>(std::round(v));
262 }
263 
264 template <>
265 inline unsigned saturate_cast<unsigned>(signed char v) {
266  return (unsigned)std::max(v, (signed char)0);
267 }
268 template <>
269 inline unsigned saturate_cast<unsigned>(short v) {
270  return (unsigned)std::max(v, (short)0);
271 }
272 template <>
273 inline unsigned saturate_cast<unsigned>(int v) {
274  return (unsigned)std::max(v, (int)0);
275 }
276 template <>
277 inline unsigned saturate_cast<unsigned>(int64_t v) {
278  return (unsigned)((uint64_t)v <= (uint64_t)UINT_MAX ? v
279  : v > 0 ? UINT_MAX
280  : 0);
281 }
282 template <>
283 inline unsigned saturate_cast<unsigned>(uint64_t v) {
284  return (unsigned)std::min(v, (uint64_t)UINT_MAX);
285 }
286 // we intentionally do not clip negative numbers, to make -1 become 0xffffffff
287 // etc.
288 template <>
289 inline unsigned saturate_cast<unsigned>(float v) {
290  return static_cast<unsigned>(std::round(v));
291 }
292 template <>
293 inline unsigned saturate_cast<unsigned>(double v) {
294  return static_cast<unsigned>(std::round(v));
295 }
296 
297 template <>
298 inline uint64_t saturate_cast<uint64_t>(signed char v) {
299  return (uint64_t)std::max(v, (signed char)0);
300 }
301 template <>
302 inline uint64_t saturate_cast<uint64_t>(short v) {
303  return (uint64_t)std::max(v, (short)0);
304 }
305 template <>
306 inline uint64_t saturate_cast<uint64_t>(int v) {
307  return (uint64_t)std::max(v, (int)0);
308 }
309 template <>
310 inline uint64_t saturate_cast<uint64_t>(int64_t v) {
311  return (uint64_t)std::max(v, (int64_t)0);
312 }
313 
314 template <>
315 inline int64_t saturate_cast<int64_t>(uint64_t v) {
316  return (int64_t)std::min(v, (uint64_t)LLONG_MAX);
317 }
318 
319 } // namespace base
320 } // namespace nndeploy
321 
322 #endif /* _NNDEPLOY_BASE_SATURATE_CAST_H_ */
unsigned short saturate_cast< unsigned short >(signed char v)
int64_t saturate_cast< int64_t >(uint64_t v)
short saturate_cast< short >(unsigned short v)
uint64_t saturate_cast< uint64_t >(signed char v)
unsigned char saturate_cast< unsigned char >(signed char v)
Definition: saturate_cast.h:83
int saturate_cast< int >(unsigned v)
signed char saturate_cast< signed char >(unsigned char v)
unsigned saturate_cast< unsigned >(signed char v)
base::Status round(device::Tensor *input, device::Tensor *output)