From 58a7201645c6375b5631fd5cf89d5d3d670415d8 Mon Sep 17 00:00:00 2001 From: Gregory John Casamento Date: Sat, 12 Oct 2019 23:03:28 -0400 Subject: [PATCH] Implementation of most functions. --- Headers/Foundation/NSDateInterval.h | 7 ++- Source/NSDateInterval.m | 70 +++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 1 deletion(-) diff --git a/Headers/Foundation/NSDateInterval.h b/Headers/Foundation/NSDateInterval.h index 2341ee4db..f97c94972 100644 --- a/Headers/Foundation/NSDateInterval.h +++ b/Headers/Foundation/NSDateInterval.h @@ -36,7 +36,12 @@ extern "C" { #if OS_API_VERSION(MAC_OS_X_VERSION_10_12, GS_API_LATEST) @interface NSDateInterval : NSObject - +{ + NSTimeInterval _duration; + NSDate *_startDate; + NSDate *_endDate; +} + // Init - (instancetype) init; diff --git a/Source/NSDateInterval.m b/Source/NSDateInterval.m index 2a15bffbd..6619e80e2 100644 --- a/Source/NSDateInterval.m +++ b/Source/NSDateInterval.m @@ -24,26 +24,51 @@ */ #include +#include @implementation NSDateInterval // Init - (instancetype)init { + self = [super init]; + if(self != nil) + { + _startDate = nil; + _duration = 0.0; + } + return self; } - (instancetype)initWithStartDate:(NSDate *)startDate duration:(NSTimeInterval)duration { + self = [super init]; + if(self != nil) + { + ASSIGNCOPY(_startDate, startDate); + ASSIGNCOPY(_endDate, [startDate dateByAddingTimeInterval: duration]); + _duration = duration; + } + return self; } - (instancetype)initWithStartDate:(NSDate *)startDate endDate:(NSDate *)endDate { + self = [super init]; + if(self != nil) + { + ASSIGNCOPY(_startDate, startDate); + ASSIGNCOPY(_endDate, endDate); + _duration = [endDate timeIntervalSinceDate: startDate]; + } + return self; } - (instancetype) initWithCoder: (NSCoder *)coder { + return nil; } - (void) encodeWithCoder: (NSCoder *)coder @@ -52,54 +77,99 @@ - (id) copyWithZone: (NSZone *)zone { + return [[[self class] allocWithZone: zone] + initWithStartDate: _startDate + duration: _duration]; +} + +- (void) dealloc +{ + RELEASE(_startDate); + [super dealloc]; } // Access - (NSDate *) startDate { + return _startDate; } - (void) setStartDate: (NSDate *)startDate { + ASSIGNCOPY(_startDate, startDate); } - (NSDate *) endDate { + return _endDate; } - (void) setEndDate: (NSDate *)endDate { + ASSIGNCOPY(_endDate, endDate); + _duration = [endDate timeIntervalSinceDate: _startDate]; } - (NSTimeInterval) duration { + return _duration; } - (void) setDuration: (NSTimeInterval)duration { + NSDate *newEndDate = [_startDate dateByAddingTimeInterval: duration]; + _duration = duration; + [self setEndDate: newEndDate]; } // Compare - (NSComparisonResult) compare: (NSDateInterval *)dateInterval { + // NSOrderedAscending + if([_startDate isEqualToDate: [dateInterval startDate]] && + _duration < [dateInterval duration]) + return NSOrderedAscending; + if([_startDate compare: [dateInterval startDate]] == NSOrderedAscending) + return NSOrderedAscending; + + // NSOrderedSame + if([self isEqualToDateInterval: dateInterval]) + return NSOrderedSame; + + if([_startDate isEqualToDate: [dateInterval startDate]] && + _duration > [dateInterval duration]) + return NSOrderedDescending; + if([_startDate compare: [dateInterval startDate]] == NSOrderedDescending) + return NSOrderedDescending; + + return 0; } - (BOOL) isEqualToDateInterval: (NSDateInterval *)dateInterval { + return ([_startDate isEqualToDate: [dateInterval startDate]] && + _duration == [dateInterval duration]); } // Determine - (BOOL) intersectsDateInterval: (NSDateInterval *)dateInterval { + return [self intersectionWithDateInterval: dateInterval] != nil; } - (NSDateInterval *) intersectionWithDateInterval: (NSDateInterval *)dateInterval { + return nil; } // Contain - (BOOL) containsDate: (NSDate *)date { + return ([_startDate compare: date] == NSOrderedSame || + [_endDate compare: date] == NSOrderedSame || + ([_startDate compare: date] == NSOrderedAscending && + [_endDate compare: date] == NSOrderedDescending)); + } @end