Range.cxx
Go to the documentation of this file.
1 
12 #ifdef _MSC_VER
13 // Include max() and min() missing from MicroSoft Visual C++.
14 #include "msdevstudio/MSconfig.h"
15 #endif
16 
17 #include "Range.h"
18 
19 #include <algorithm>
20 
21 #include <cassert>
22 #include <cmath>
23 #include <ostream>
24 
25 #ifndef _MSC_VER
26 using std::floor;
27 #endif
28 
29 using std::ostream;
30 using std::max;
31 using std::min;
32 using std::vector;
33 
34 using namespace hippodraw;
35 
37  : m_min( 0.0 ),
38  m_max( 0.0 ),
39  m_pos( DBL_MAX ),
40  m_empty( true )
41 {
42 }
43 
44 Range::Range ( double x, double y, double p )
45 {
46 
47  // x and y are being passed as 'nan' in some cases, leading to failure
48  // of assertion below. I dont know why they are being passed as nan and
49  // from where.
50 
51  if ( x > y ) {
52  m_min = 0;
53  m_max = 0;
54  m_pos = DBL_MAX;
55  m_empty = true;
56  }
57  else{
58  m_min = x;
59  m_max = y;
60  m_pos = p;
61  m_empty = false;
62  }
63 
64  // This assertion is failing.
65  //assert ( m_min <= m_max );
66 
67  //This is a dirty fix:
68  if ( ! ( m_min <= m_max ) ){
69  m_min = 0;
70  m_max = 0.1;
71  m_pos = DBL_MAX;
72  m_empty = true;
73  }
74 
75  assert ( m_min <= m_max );
76 
77 }
78 
79 Range::
80 Range ( const std::vector < double > & array )
81 {
82  setRange ( array.begin(), array.end () );
83 }
84 
85 double
86 Range::low() const
87 {
88  return m_min;
89 }
90 
91 void
92 Range::setLow ( double x )
93 {
94  m_min = x;
95  assert ( m_min <= m_max );
96 }
97 
98 double
99 Range::high() const
100 {
101  return m_max;
102 }
103 
104 void
105 Range::setHigh ( double x )
106 {
107  m_max = x;
108  assert ( m_min <= m_max );
109 }
110 
111 double
112 Range::pos() const
113 {
114  return m_pos;
115 }
116 
117 void
118 Range::setPos (double x)
119 {
120  m_pos = x;
121  assert ( m_min <= m_max );
122 }
123 
124 void
125 Range::setRange ( double low, double high, double pos )
126 {
127  m_min = low;
128  m_max = high;
129  m_pos = pos;
130  assert ( m_min <= m_max );
131 }
132 
133 void
134 Range::setLength ( double val, bool high_hold )
135 {
136  if( high_hold ){
137  m_min = m_max - val;
138  } else {
139  m_max = m_min + val;
140  }
141  assert ( m_min <= m_max );
142 }
143 
144 bool
145 Range::includes ( double val ) const
146 {
147  return val >= m_min && val <= m_max;
148 }
149 
150 bool
151 Range::
152 excludes ( double value ) const
153 {
154  return value < m_min || value > m_max;
155 }
156 
157 double
158 Range::
159 fraction ( double value ) const
160 {
161  return ( value - m_min ) / ( m_max - m_min );
162 }
163 
164 void Range::setEmpty ( bool yes )
165 {
166  m_empty = yes;
167 }
168 
169 void Range::setUnion ( const Range & range )
170 {
171  if ( m_empty ) {
172  m_min = range.m_min;
173  m_max = range.m_max;
174  m_pos = range.m_pos;
175  m_empty = false;
176  }
177  else {
178  m_min = min ( m_min, range.m_min );
179  m_max = max ( m_max, range.m_max );
180  m_pos = min ( m_pos, range.m_pos );
181  }
182 
183  assert ( m_min <= m_max );
184 
185 }
186 
187 void Range::setIntersect ( const Range & range )
188 {
189  if ( m_min > range.m_max || m_max < range.m_min ) return;
190  m_min = max ( m_min, range.m_min );
191  m_max = min ( m_max, range.m_max );
192  m_pos = max ( m_pos, range.m_min );
193 
194  assert ( m_min <= m_max );
195 }
196 
197 int
198 Range::numberOfBins ( double width ) const
199 {
200  assert ( m_max > m_min );
201  double number = (m_max - m_min) / width;
202 
203 #ifdef _MSC_VER
204  return static_cast < int > ( number+0.5 );
205 #else
206  return static_cast < int > ( rint( number ) );
207 #endif
208 }

Generated for HippoDraw Class Library by doxygen