Initial Cocoa (Objective-C) API.
2 // MYVersionDictionary.m
5 // Created by Jens Alfke on 9/21/09.
6 // Copyright 2009 Jens Alfke. All rights reserved.
9 #import "MYVersionDictionary.h"
10 #import "MYOttoman_internal.h"
11 #import <Foundation/Foundation.h>
13 #include "VersionDictionary.h"
15 using namespace Mooseyard;
18 @interface MYDictionaryEnumerator : NSEnumerator
20 Dictionary::Iterator *_iter;
23 - (id) initWithDict: (const Dictionary*)dict;
28 static id BlobToNSData (const Blob &blob, bool copy =true) {
32 return [NSData dataWithBytes: blob.bytes length: blob.length];
34 return [NSData dataWithBytesNoCopy: (void*)blob.bytes
39 static Blob BlobFromId (id object) {
40 if ([object isKindOfClass: [NSData class]])
41 return Blob([object bytes], [object length]);
48 @implementation MYVersionDictionary
51 - (id) _initWithVersionDictionary: (VersionDictionary*)dict
66 return _dict->count();
69 - (id)objectForKey:(id)keyObject {
70 return BlobToNSData( _dict->get( Key(BlobFromId(keyObject)) ) );
73 - (NSEnumerator *)keyEnumerator {
74 return [[[MYDictionaryEnumerator alloc] initWithDict: _dict] autorelease];
78 return _dict->generation();
81 - (NSDate*) dateCreated {
82 return [NSDate dateWithTimeIntervalSince1970: _dict->timestamp()];
85 - (BOOL) isLatestVersion {
86 return _dict->isLatestVersion();
89 - (MYVersionDictionary*) previousVersion {
90 const VersionDictionary *prev = _dict->previousVersion();
92 return [[[MYVersionDictionary alloc] _initWithVersionDictionary: prev] autorelease];
102 @implementation MYCurrentVersionDictionary
105 - (id) _initWithOverlayDictionary: (OverlayDictionary*)dict
119 - (NSUInteger)count {
120 return _dict->count();
123 - (id)objectForKey:(id)keyObject {
124 Blob keyBlob = BlobFromId(keyObject);
125 return keyBlob ? BlobToNSData( _dict->get( Key(keyBlob) ) ) :nil;
128 - (NSEnumerator *)keyEnumerator {
129 return [[[MYDictionaryEnumerator alloc] initWithDict: _dict] autorelease];
132 - (void)setObject:(id)anObject forKey:(id)aKey {
133 Key key = Key(BlobFromId(aKey));
134 NSAssert1(key, @"Invalid %@ key; only NSData supported", [aKey class]);
135 Blob value = BlobFromId(anObject);
136 NSAssert1(key, @"Invalid %@ value; only NSData supported", [aKey class]);
137 _dict->put(key, value);
140 - (void)removeObjectForKey:(id)aKey {
141 Key key = Key(BlobFromId(aKey));
142 NSAssert1(key, @"Invalid key class %@; only NSData supported", [aKey class]);
151 @implementation MYDictionaryEnumerator
153 - (id) initWithDict: (Dictionary*)dict
157 _iter = dict->iterate();
178 if (!_iter->hasValue())
182 Key key = _iter->key();
183 return [NSData dataWithBytes: key.bytes length: key.length];