Blame client/iOS/Additions/OrderedDictionary.m

Packit 1fb8d4
//
Packit 1fb8d4
//  OrderedDictionary.m
Packit 1fb8d4
//  OrderedDictionary
Packit 1fb8d4
//
Packit 1fb8d4
//  Modified version (Added indexForKey/Value functions)
Packit 1fb8d4
//
Packit 1fb8d4
//  Created by Matt Gallagher on 19/12/08.
Packit 1fb8d4
//  Copyright 2008 Matt Gallagher. All rights reserved.
Packit 1fb8d4
//
Packit 1fb8d4
//  This software is provided 'as-is', without any express or implied
Packit 1fb8d4
//  warranty. In no event will the authors be held liable for any damages
Packit 1fb8d4
//  arising from the use of this software. Permission is granted to anyone to
Packit 1fb8d4
//  use this software for any purpose, including commercial applications, and to
Packit 1fb8d4
//  alter it and redistribute it freely, subject to the following restrictions:
Packit 1fb8d4
//
Packit 1fb8d4
//  1. The origin of this software must not be misrepresented; you must not
Packit 1fb8d4
//     claim that you wrote the original software. If you use this software
Packit 1fb8d4
//     in a product, an acknowledgment in the product documentation would be
Packit 1fb8d4
//     appreciated but is not required.
Packit 1fb8d4
//  2. Altered source versions must be plainly marked as such, and must not be
Packit 1fb8d4
//     misrepresented as being the original software.
Packit 1fb8d4
//  3. This notice may not be removed or altered from any source
Packit 1fb8d4
//     distribution.
Packit 1fb8d4
//
Packit 1fb8d4
Packit 1fb8d4
#import "OrderedDictionary.h"
Packit 1fb8d4
Packit 1fb8d4
NSString *DescriptionForObject(NSObject *object, id locale, NSUInteger indent)
Packit 1fb8d4
{
Packit 1fb8d4
	NSString *objectString;
Packit 1fb8d4
	if ([object isKindOfClass:[NSString class]])
Packit 1fb8d4
	{
Packit 1fb8d4
		objectString = (NSString *)[[object retain] autorelease];
Packit 1fb8d4
	}
Packit 1fb8d4
	else if ([object respondsToSelector:@selector(descriptionWithLocale:indent:)])
Packit 1fb8d4
	{
Packit 1fb8d4
		objectString = [(NSDictionary *)object descriptionWithLocale:locale indent:indent];
Packit 1fb8d4
	}
Packit 1fb8d4
	else if ([object respondsToSelector:@selector(descriptionWithLocale:)])
Packit 1fb8d4
	{
Packit 1fb8d4
		objectString = [(NSSet *)object descriptionWithLocale:locale];
Packit 1fb8d4
	}
Packit 1fb8d4
	else
Packit 1fb8d4
	{
Packit 1fb8d4
		objectString = [object description];
Packit 1fb8d4
	}
Packit 1fb8d4
	return objectString;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
@implementation OrderedDictionary
Packit 1fb8d4
Packit 1fb8d4
- (id)init
Packit 1fb8d4
{
Packit 1fb8d4
	return [self initWithCapacity:0];
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
- (id)initWithCapacity:(NSUInteger)capacity
Packit 1fb8d4
{
Packit 1fb8d4
	self = [super init];
Packit 1fb8d4
	if (self != nil)
Packit 1fb8d4
	{
Packit 1fb8d4
		dictionary = [[NSMutableDictionary alloc] initWithCapacity:capacity];
Packit 1fb8d4
		array = [[NSMutableArray alloc] initWithCapacity:capacity];
Packit 1fb8d4
	}
Packit 1fb8d4
	return self;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
- (void)dealloc
Packit 1fb8d4
{
Packit 1fb8d4
	[dictionary release];
Packit 1fb8d4
	[array release];
Packit 1fb8d4
	[super dealloc];
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
- (id)copy
Packit 1fb8d4
{
Packit 1fb8d4
	return [self mutableCopy];
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
- (void)setObject:(id)anObject forKey:(id)aKey
Packit 1fb8d4
{
Packit 1fb8d4
	if (![dictionary objectForKey:aKey])
Packit 1fb8d4
	{
Packit 1fb8d4
		[array addObject:aKey];
Packit 1fb8d4
	}
Packit 1fb8d4
	[dictionary setObject:anObject forKey:aKey];
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
- (void)removeObjectForKey:(id)aKey
Packit 1fb8d4
{
Packit 1fb8d4
	[dictionary removeObjectForKey:aKey];
Packit 1fb8d4
	[array removeObject:aKey];
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
- (NSUInteger)count
Packit 1fb8d4
{
Packit 1fb8d4
	return [dictionary count];
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
- (id)objectForKey:(id)aKey
Packit 1fb8d4
{
Packit 1fb8d4
	return [dictionary objectForKey:aKey];
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
- (NSEnumerator *)keyEnumerator
Packit 1fb8d4
{
Packit 1fb8d4
	return [array objectEnumerator];
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
- (NSEnumerator *)reverseKeyEnumerator
Packit 1fb8d4
{
Packit 1fb8d4
	return [array reverseObjectEnumerator];
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
- (void)insertObject:(id)anObject forKey:(id)aKey atIndex:(NSUInteger)anIndex
Packit 1fb8d4
{
Packit 1fb8d4
	if ([dictionary objectForKey:aKey])
Packit 1fb8d4
	{
Packit 1fb8d4
		[self removeObjectForKey:aKey];
Packit 1fb8d4
	}
Packit 1fb8d4
	[array insertObject:aKey atIndex:anIndex];
Packit 1fb8d4
	[dictionary setObject:anObject forKey:aKey];
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
- (id)keyAtIndex:(NSUInteger)anIndex
Packit 1fb8d4
{
Packit 1fb8d4
	return [array objectAtIndex:anIndex];
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
- (NSUInteger)indexForKey:(id)key
Packit 1fb8d4
{
Packit Service 5a9772
	return [array indexOfObject:key];
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
- (NSUInteger)indexForValue:(id)value
Packit 1fb8d4
{
Packit Service 5a9772
	NSArray *keys = [self allKeysForObject:value];
Packit Service 5a9772
	if ([keys count] > 0)
Packit Service 5a9772
	{
Packit Service 5a9772
		return [self indexForKey:[keys objectAtIndex:0]];
Packit Service 5a9772
	}
Packit Service 5a9772
Packit Service 5a9772
	return NSNotFound;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
- (NSString *)descriptionWithLocale:(id)locale indent:(NSUInteger)level
Packit 1fb8d4
{
Packit 1fb8d4
	NSMutableString *indentString = [NSMutableString string];
Packit 1fb8d4
	NSUInteger i, count = level;
Packit 1fb8d4
	for (i = 0; i < count; i++)
Packit 1fb8d4
	{
Packit 1fb8d4
		[indentString appendFormat:@"    "];
Packit 1fb8d4
	}
Packit Service 5a9772
Packit 1fb8d4
	NSMutableString *description = [NSMutableString string];
Packit 1fb8d4
	[description appendFormat:@"%@{\n", indentString];
Packit 1fb8d4
	for (NSObject *key in self)
Packit 1fb8d4
	{
Packit Service 5a9772
		[description appendFormat:@"%@    %@ = %@;\n", indentString,
Packit Service 5a9772
		                          DescriptionForObject(key, locale, level),
Packit Service 5a9772
		                          DescriptionForObject([self objectForKey:key], locale, level)];
Packit 1fb8d4
	}
Packit 1fb8d4
	[description appendFormat:@"%@}\n", indentString];
Packit 1fb8d4
	return description;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
@end