ETL  0.04.19
_misc.h
Go to the documentation of this file.
1 
23 /* === S T A R T =========================================================== */
24 
25 #ifndef __ETL__MISC_H_
26 #define __ETL__MISC_H_
27 
28 /* === H E A D E R S ======================================================= */
29 #include <cmath>
30 
31 #include <math.h>
32 
33 /* === M A C R O S ========================================================= */
34 
35 /* === T Y P E D E F S ===================================================== */
36 
37 /* === C L A S S E S & S T R U C T S ======================================= */
38 
40 
41 template<typename I, typename T> inline I
42 binary_find(I begin, I end, const T& value)
43 {
44 #if 1
45  I iter(begin+(end-begin)/2);
46 
47  while(end-begin>1 && !(*iter==value))
48  {
49  ((*iter<value)?begin:end) = iter;
50 
51  iter = begin+(end-begin)/2;
52  }
53  return iter;
54 #else
55  size_t len_(end-begin);
56  size_t half_(len_/2);
57 
58  I iter(begin);
59  iter+=half_;
60 
61  while(len_>1 && !(*iter==value))
62  {
63  ((*iter<value)?begin:end) = iter;
64 
65  len_=half_;
66  half_/=2;
67 
68  iter=begin;
69  iter+=half_;
70  }
71  return iter;
72 #endif
73 }
74 
75 inline int round_to_int(const float x) {
79  // return static_cast<int>(x+0.5f); // <-- (a) fast, but rounds -1.333 to 0!
80  // return static_cast<int>(rintf(x)); // <-- (b) slow, but correct
81  if (x>=0) return static_cast<int>(x + 0.5); // <-- slower than (a), but correct, and faster than (b)
82  else return static_cast<int>(x - 0.5);
83 }
84 inline int round_to_int(const double x) {
85  // return static_cast<int>(x+0.5);
86  // return static_cast<int>(rint(x));
87  if (x>=0) return static_cast<int>(x + 0.5);
88  else return static_cast<int>(x - 0.5);
89 }
90 
91 inline int ceil_to_int(const float x) { return static_cast<int>(ceil(x)); }
92 inline int ceil_to_int(const double x) { return static_cast<int>(ceil(x)); }
93 
94 inline int floor_to_int(const float x) { return static_cast<int>(x); }
95 inline int floor_to_int(const double x) { return static_cast<int>(x); }
96 
98 
99 /* === E X T E R N S ======================================================= */
100 
101 /* === E N D =============================================================== */
102 
103 #endif