Archived
1
This repository has been archived on 2022-08-08. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
mathpad/MathKit/MPRangePath.h
Kim Wittenburg 7438fd1f95 Added Lots of Documentation
Added some nice to haves
Improved and Unified General Code Layout
2015-01-04 02:54:27 +01:00

327 lines
11 KiB
Objective-C

//
// MPRange.h
// MathPad
//
// Created by Kim Wittenburg on 18.04.14.
// Copyright (c) 2014 Kim Wittenburg. All rights reserved.
//
#import "MPExpression.h"
/*!
@header
This file contains the <code>MPRangePath</code> class.
The <code>MPRangePath</code> combines an <code>NSIndexPath</code> with a
<code>NSRange</code>. A range path is used in a tree structure to identify a
number of subsequent nodes. This is achieved by combining a range path that
stores the location of the first node in the tree with an integer that stores
the number of nodes that should be included in the range path.
*/
/*!
@define MPMakeRangePath
@abstract Creates a new <code>NSRangePath</code> instance with the given
location and length.
@param loc
The location of the first included item. This must be an
<code>NSIndexPath</code> instance.
@param len
The number of nodes to include in the range path.
@return A new range path.
*/
#define MPMakeRangePath(loc, len) [MPRangePath rangePathWithLocation:(loc) length:(len)]
@class MPRangePath, MPExpression;
/*!
@class MPRangePath
@abstract A <code>MPRangePath</code> instance identifies a range of
subsequent nodes in a tree structure.
@discussion <code>MPRangePath</code> instances are immutable.
*/
@interface MPRangePath : NSObject <NSCopying, NSCoding>
#pragma mark Creation Methods
/*!
@methodgroup Creation Methods
*/
/*!
@method init
@abstract Initializes an empty range path.
@discussion This method is a convenience initializer to create a range path
with an empty location and a length of <code>0</code>.
@return A new <code>MPRangePath</code> instance.
*/
- (instancetype)init;
/*!
@method initWithRange:
@abstract Initializes a newly created range path with the specified range.
@discussion This method is a convenience initializer to convert from a
<code>NSRange</code> struct to a <code>MPRangePath</code>
instance. The location of the created range path is an index path
of length <code>1</code>.
@param aRange
The range to be converted into a <code>MPRangePath</code>.
@return A <code>MPRangePath</code> instance.
*/
- (instancetype)initWithRange:(NSRange)aRange;
/*!
@method initWithLocation:lenght:
@abstract Initializes a newly created range path with the specified location
and length.
@discussion The last index in the <code>location</code> addresses the first
item that is actually selected.
@param location
The location of the first element that should be addressed by
this range path.
@param length
The number of elements to be addressed by this range path.
@return A <code>MPRangePath</code> instance.
*/
- (instancetype)initWithLocation:(NSIndexPath *)location
length:(NSUInteger)length; /* designated initializer */
/*!
@method rangePath
@abstract Allocates and initializes an empty <code>NSRangePath</code>
instance.
@discussion An empty range path's location has <code>0</code> indexes and a
length of <code>0</code>.
@return A newly created <code>MPRangePath</code> instance.
*/
+ (instancetype)rangePath;
/*!
@method rangePathWithRange:
@abstract Allocates a new <code>MPRangePath</code> instance and initializes
it with the specified location and length.
@discussion The location of <code>aRange</code> is translated into an index
path for the range path.
@param aRange
The range to be converted into a range path.
@return A newly created <code>MPRangePath</code> instance.
*/
+ (instancetype)rangePathWithRange:(NSRange)aRange;
/*!
@method rangePathWithLocation:length:
@abstract Allocates a new <code>MPRangePath</code> instance and initializes
it with the specified location and length.
@param location
The location of the first element that should be addressed by the
range path.
@param length
The number of elements that should be addressed by the range
path.
@return A newly created <code>MPRangePath</code> instance.
*/
+ (instancetype)rangePathWithLocation:(NSIndexPath *)location
length:(NSUInteger)length;
#pragma mark Properties
/*!
@methodgroup Properties
*/
/*!
@property location
@abstract The location of the first element addressed by the receiver.
*/
@property (readonly, nonatomic, strong) NSIndexPath *location;
/*!
@property length
@abstract The number of elements addressed by the receiver. The element
addressed by the last index of the location property plus the
length of the receiver is <b>not</b> considered inside of the
range path.
*/
@property (readonly, nonatomic) NSUInteger length;
/*!
@method maxRangePath
@abstract Similar to the <code>NSRange</code> function
<code>NSMaxRange</code> this method returns the first index after
the receiving <code>NSRangePath</code>.
@return The first index after the receiving <code>NSRangePath</code>.
*/
- (NSIndexPath *)maxRangePath;
/*!
@method rangeAtLastIndex
@abstract Returns a <code>NSRange</code> constructed from the last index of
the receiver's location and the receiver's length.
@return The range identifying the elements at the last index in the
receiver's index path.
*/
- (NSRange)rangeAtLastIndex;
#pragma mark Working With Ranges
/*!
@methodgroup Working With Ranges
*/
/*!
@method containsLocation:
@abstract Checks wether the range path addressed by the receiver includes
<code>location</code>.
@discussion The index path is considered inside the receiver if the indexes
in the receiver's <code>location</code> property are equal to the
respective indexes index in <code>location</code>. For the last
position of the last index of the receiver's
<code>location</code> it is also valid if the respective index is
inside the range at the last index.
@param location
The index path to check wether it is contained in the receiver.
@return <code>YES</code> if the range path addressed by the receiver also
contains <code>location,</code> <code>NO</code> otherwise.
*/
- (BOOL)containsLocation:(NSIndexPath *)location;
/*!
@method containsRangePath:
@abstract Checks wether the receiver completely contains
<code>aRangePath</code>.
@discussion A range path is contained by another range path if either the
receiver's range at its last index contains the index at the
respective location of the location path of
<code>aRangePath</code> or (if the locations are of the same
length) the receiver's range at its last index contains the last
index's range of <code>aRangePath</code>.
@param aRangePath
The range path to check wether it is contained in the receiver.
@return <code>YES</code> if the range path addressed by the receiver also
includes <code>aRangePath,</code> <code>NO</code> otherwise.
*/
- (BOOL)containsRangePath:(MPRangePath *)aRangePath;
/*!
@method isEqualToRangePath:
@abstract Checks wether the receiver and <code>aRangePath</code> are equal.
@discussion If you know that you are comparing two range paths (that are not
<code>nil</code>) you should prefer this method over
<code>isEqual:</code> because it is more performant.
@param aRangePath
The range path to check for equality. If this parameter is
<code>nil</code> this method may raise an exception.
@return <code>YES</code> if the receiver is equal to
<code>aRangePath</code>, <code>NO</code> otherwise.
*/
- (BOOL)isEqualToRangePath:(MPRangePath *)aRangePath;
@end
@interface MPExpression (MPRangeExtension)
/*!
@method subexpressionWithRangePath:
@abstract Creates a new expression with the symbols in the specified range
path.
@discussion The elements in the newly created expression are copied to the
new exoression. The range path is specified in the length
reference frame.
If the specified range exceeds the receiver's bounds a
<code>NSRangeException</code> is raised.
@param aRangePath
The range path from which to create the new expression.
@return A new expression.
*/
- (MPExpression *)subexpressionWithRangePath:(MPRangePath *)aRangePath
referenceFrame:(MPReferenceFrame)referenceFrame;
/*!
@method replaceItemsInRangePath:referenceFrame:withElements:
@abstract Replaces the items in the specified range path with the contents
of <code>elements</code>.
@discussion All objects in the <code>elements</code> array must conform to
the <code>@link
//apple_ref/occ/intf/MPExpressionElement@/link</code> protocol.
If one or more objects do not conform to the protocol a
<code>@link
//apple_ref/c/data/MPIllegalElementException@/link</code> is
raised.
@param rangePath
The range path to be replaced. The location of the range path
(except for the last index) is expressed in the element reference
frame. The range of the range path is expressed in the specified
<code>referenceFrame</code>.
@param referenceFrame
The reference frame to use. This only applies to the range at the
last index of the range path. The path of the range path is
always expressed in the element reference frame.
@param elements
The elements replacing the ones in the specified range path.
*/
- (void)replaceItemsInRangePath:(MPRangePath *)rangePath
referenceFrame:(MPReferenceFrame)referenceFrame
withElements:(NSArray *)elements;
@end