OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2007, 2009, 2010 Apple Inc. All rights reserved. | 2 * Copyright (C) 2007, 2009, 2010 Apple Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
177 { | 177 { |
178 for (unsigned n = 0; n < length(); n++) { | 178 for (unsigned n = 0; n < length(); n++) { |
179 if (time >= start(n, IGNORE_EXCEPTION) && time <= end(n, IGNORE_EXCEPTIO
N)) | 179 if (time >= start(n, IGNORE_EXCEPTION) && time <= end(n, IGNORE_EXCEPTIO
N)) |
180 return true; | 180 return true; |
181 } | 181 } |
182 return false; | 182 return false; |
183 } | 183 } |
184 | 184 |
185 double TimeRanges::nearest(double time) const | 185 double TimeRanges::nearest(double time) const |
186 { | 186 { |
187 double closest = 0; | |
188 unsigned count = length(); | 187 unsigned count = length(); |
| 188 double bestMatch = 0; |
| 189 double bestDelta = std::numeric_limits<double>::infinity(); |
189 for (unsigned ndx = 0; ndx < count; ndx++) { | 190 for (unsigned ndx = 0; ndx < count; ndx++) { |
190 double startTime = start(ndx, IGNORE_EXCEPTION); | 191 double startTime = start(ndx, IGNORE_EXCEPTION); |
191 double endTime = end(ndx, IGNORE_EXCEPTION); | 192 double endTime = end(ndx, IGNORE_EXCEPTION); |
192 if (time >= startTime && time <= endTime) | 193 if (time >= startTime && time <= endTime) |
193 return time; | 194 return time; |
194 if (fabs(startTime - time) < closest) | 195 if (time < startTime) { |
195 closest = fabs(startTime - time); | 196 double delta = startTime - time; |
196 else if (fabs(endTime - time) < closest) | 197 if (delta < bestDelta) { |
197 closest = fabs(endTime - time); | 198 bestMatch = startTime; |
| 199 bestDelta = delta; |
| 200 } |
| 201 } else if (time > endTime) { |
| 202 double delta = time - endTime; |
| 203 if (delta < bestDelta) { |
| 204 bestMatch = endTime; |
| 205 bestDelta = delta; |
| 206 } |
| 207 } |
198 } | 208 } |
199 return closest; | 209 return bestMatch; |
200 } | 210 } |
201 | 211 |
202 void TimeRanges::trace(Visitor* visitor) | 212 void TimeRanges::trace(Visitor* visitor) |
203 { | 213 { |
204 visitor->trace(m_ranges); | 214 visitor->trace(m_ranges); |
205 } | 215 } |
OLD | NEW |