// ========================================================================== // Project: SproutCore
- JavaScript Application Framework // Copyright: ©2006-2011 Strobe Inc. and contributors. // ©2008-2011 Apple Inc. All rights reserved. // License: Licensed under MIT license (see license.js) // ==========================================================================
SC.mixin( /** @scope SC
*/ {
/** A zero length range at zero. */ ZERO_RANGE: { start: 0, length: 0 }, RANGE_NOT_FOUND: { start: 0, length: -1 }, /** Returns true if the passed index is in the specified range */ valueInRange: function(value, range) { return (value >= 0) && (value >= range.start) && (value < (range.start + range.length)); }, /** Returns first value of the range. */ minRange: function(range) { return range.start; }, /** Returns the first value outside of the range. */ maxRange: function(range) { return (range.length < 0) ? -1 : (range.start + range.length); }, /** Returns the union of two ranges. If one range is null, the other range will be returned. */ unionRanges: function(r1, r2) { if ((r1 == null) || (r1.length < 0)) return r2 ; if ((r2 == null) || (r2.length < 0)) return r1 ; var min = Math.min(r1.start, r2.start), max = Math.max(SC.maxRange(r1), SC.maxRange(r2)) ; return { start: min, length: max - min } ; }, /** Returns the intersection of the two ranges or SC.RANGE_NOT_FOUND */ intersectRanges: function(r1, r2) { if ((r1 == null) || (r2 == null)) return SC.RANGE_NOT_FOUND ; if ((r1.length < 0) || (r2.length < 0)) return SC.RANGE_NOT_FOUND; var min = Math.max(SC.minRange(r1), SC.minRange(r2)), max = Math.min(SC.maxRange(r1), SC.maxRange(r2)) ; if (max < min) return SC.RANGE_NOT_FOUND ; return { start: min, length: max-min }; }, /** Returns the difference of the two ranges or SC.RANGE_NOT_FOUND */ subtractRanges: function(r1, r2) { if ((r1 == null) || (r2 == null)) return SC.RANGE_NOT_FOUND ; if ((r1.length < 0) || (r2.length < 0)) return SC.RANGE_NOT_FOUND; var max = Math.max(SC.minRange(r1), SC.minRange(r2)), min = Math.min(SC.maxRange(r1), SC.maxRange(r2)) ; if (max < min) return SC.RANGE_NOT_FOUND ; return { start: min, length: max-min }; }, /** Returns a clone of the range. */ cloneRange: function(r) { return { start: r.start, length: r.length }; }, /** Returns true if the two passed ranges are equal. A null value is treated like RANGE_NOT_FOUND. */ rangesEqual: function(r1, r2) { if (r1===r2) return true ; if (r1 == null) return r2.length < 0 ; if (r2 == null) return r1.length < 0 ; return (r1.start == r2.start) && (r1.length == r2.length) ; }
});