Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

executable file 179 lines (159 sloc) 4.919 kB
/*
* CPRange.j
* Foundation
*
* Created by Francisco Tolmasky.
* Copyright 2008, 280 North, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
/*!
@addtogroup foundation
@{
*/
/*!
Makes a CPRange.
@param location the location for new range
@param length the length of the new range
@group CPRange
@return CPRange the new range object
*/
function CPMakeRange(location, length)
{
return { location: location, length: length };
}
/*!
Makes a copy of a CPRange.
@param aRange the CPRange to copy
@group CPRange
@return CPRange the copy of the range
*/
function CPCopyRange(aRange)
{
return { location: aRange.location, length: aRange.length };
}
/*!
Makes a copy of a CPRange.
@param aRange the CPRange to copy
@group CPRange
@return CPRange the copy of the range
*/
function CPMakeRangeCopy(aRange)
{
return { location:aRange.location, length:aRange.length };
}
/*!
Determines if a range is empty \c length is 0.
@param aRange the range to test
@group CPRange
@return YES if the range is empty
*/
function CPEmptyRange(aRange)
{
return aRange.length === 0;
}
/*!
Finds the range maximum. (\c location + length)
@param aRange the range to calculate a maximum from
@group CPRange
@return int the range maximum
*/
function CPMaxRange(aRange)
{
return aRange.location + aRange.length;
}
/*!
Determines if two CPRanges are equal.
@param lhsRange the first CPRange
@param rhsRange the second CPRange
@return BOOL \c YES if the two CPRanges are equal.
*/
function CPEqualRanges(lhsRange, rhsRange)
{
return ((lhsRange.location === rhsRange.location) && (lhsRange.length === rhsRange.length));
}
/*!
Determines if a number is within a specified CPRange.
@param aLocation the number to check
@param aRange the CPRange to check within
@group CPRange
@return BOOL \c YES if \c aLocation is within the range
*/
function CPLocationInRange(aLocation, aRange)
{
return (aLocation >= aRange.location) && (aLocation < CPMaxRange(aRange));
}
/*!
Creates a new range with the minimum \c location and a \c length
that extends to the maximum \c length.
@param lhsRange the first CPRange
@param rhsRange the second CPRange
@group CPRange
@return CPRange the new CPRange
*/
function CPUnionRange(lhsRange, rhsRange)
{
var location = MIN(lhsRange.location, rhsRange.location);
return CPMakeRange(location, MAX(CPMaxRange(lhsRange), CPMaxRange(rhsRange)) - location);
}
/*!
Creates a new CPRange that spans the common range of two CPRanges
@param lhsRange the first CPRange
@param rhsRange the second CPRange
@group CPRange
@return CPRange the new CPRange
*/
function CPIntersectionRange(lhsRange, rhsRange)
{
if (CPMaxRange(lhsRange) < rhsRange.location || CPMaxRange(rhsRange) < lhsRange.location)
return CPMakeRange(0, 0);
var location = MAX(lhsRange.location, rhsRange.location);
return CPMakeRange(location, MIN(CPMaxRange(lhsRange), CPMaxRange(rhsRange)) - location);
}
/*!
Checks if a range completely contains another range. In other words, if one range is the "super range" of another.
@param lhsRange the containing range
@param rhsRange the range we are testing to see if lhsRange contains it
@group CPRange
@return BOOL whether or not lhsRange completely contains rhsRange
*/
function CPRangeInRange(lhsRange, rhsRange)
{
return (lhsRange.location <= rhsRange.location && CPMaxRange(lhsRange) >= CPMaxRange(rhsRange));
}
/*!
Returns a string describing a range.
@param aRange the range to describe
@group CPRange
@return CPString a describing string
*/
function CPStringFromRange(aRange)
{
return "{" + aRange.location + ", " + aRange.length + "}";
}
/*!
Creates a CPRange from the contents of a CPString.
@param aString the string to create a CPRange from
@group CPRange
@return CPRange the new range
*/
function CPRangeFromString(aString)
{
var comma = aString.indexOf(',');
return { location:parseInt(aString.substr(1, comma - 1)), length:parseInt(aString.substring(comma + 1, aString.length)) };
}
/*!
@}
*/
Jump to Line
Something went wrong with that request. Please try again.