︙ | | | ︙ | |
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
|
- (id const *)objects
{
OFObject *container;
size_t count;
id *buffer;
container = [[[OFObject alloc] init] autorelease];
count = [self count];
buffer = [container allocMemoryWithSize: sizeof(*buffer)
count: [self count]];
[self getObjects: buffer
inRange: of_range(0, count)];
return buffer;
}
|
|
|
|
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
|
- (id const *)objects
{
OFObject *container;
size_t count;
id *buffer;
container = [[[OFObject alloc] init] autorelease];
count = self.count;
buffer = [container allocMemoryWithSize: sizeof(*buffer)
count: count];
[self getObjects: buffer
inRange: of_range(0, count)];
return buffer;
}
|
︙ | | | ︙ | |
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
|
- (id)valueForKey: (OFString *)key
{
id ret;
if ([key hasPrefix: @"@"]) {
void *pool = objc_autoreleasePoolPush();
key = [key substringWithRange: of_range(1, [key length] - 1)];
ret = [[super valueForKey: key] retain];
objc_autoreleasePoolPop(pool);
return [ret autorelease];
}
ret = [OFMutableArray arrayWithCapacity: [self count]];
for (id object in self) {
id value = [object valueForKey: key];
if (value == nil)
value = [OFNull null];
|
|
|
|
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
|
- (id)valueForKey: (OFString *)key
{
id ret;
if ([key hasPrefix: @"@"]) {
void *pool = objc_autoreleasePoolPush();
key = [key substringWithRange: of_range(1, key.length - 1)];
ret = [[super valueForKey: key] retain];
objc_autoreleasePoolPop(pool);
return [ret autorelease];
}
ret = [OFMutableArray arrayWithCapacity: self.count];
for (id object in self) {
id value = [object valueForKey: key];
if (value == nil)
value = [OFNull null];
|
︙ | | | ︙ | |
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
|
- (void)setValue: (id)value
forKey: (OFString *)key
{
if ([key hasPrefix: @"@"]) {
void *pool = objc_autoreleasePoolPush();
key = [key substringWithRange: of_range(1, [key length] - 1)];
[super setValue: value
forKey: key];
objc_autoreleasePoolPop(pool);
return;
}
|
|
|
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
|
- (void)setValue: (id)value
forKey: (OFString *)key
{
if ([key hasPrefix: @"@"]) {
void *pool = objc_autoreleasePoolPush();
key = [key substringWithRange: of_range(1, key.length - 1)];
[super setValue: value
forKey: key];
objc_autoreleasePoolPop(pool);
return;
}
|
︙ | | | ︙ | |
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
|
- (bool)containsObjectIdenticalTo: (id)object
{
return ([self indexOfObjectIdenticalTo: object] != OF_NOT_FOUND);
}
- (id)firstObject
{
if ([self count] > 0)
return [self objectAtIndex: 0];
return nil;
}
- (id)lastObject
{
size_t count = [self count];
if (count > 0)
return [self objectAtIndex: count - 1];
return nil;
}
- (OFArray *)objectsInRange: (of_range_t)range
{
OFArray *ret;
id *buffer;
if (range.length > SIZE_MAX - range.location ||
range.location + range.length < [self count])
@throw [OFOutOfRangeException exception];
if (![self isKindOfClass: [OFMutableArray class]])
return [OFArray_subarray arrayWithArray: self
range: range];
buffer = [self allocMemoryWithSize: sizeof(*buffer)
|
|
|
|
|
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
|
- (bool)containsObjectIdenticalTo: (id)object
{
return ([self indexOfObjectIdenticalTo: object] != OF_NOT_FOUND);
}
- (id)firstObject
{
if (self.count > 0)
return [self objectAtIndex: 0];
return nil;
}
- (id)lastObject
{
size_t count = self.count;
if (count > 0)
return [self objectAtIndex: count - 1];
return nil;
}
- (OFArray *)objectsInRange: (of_range_t)range
{
OFArray *ret;
id *buffer;
if (range.length > SIZE_MAX - range.location ||
range.location + range.length < self.count)
@throw [OFOutOfRangeException exception];
if (![self isKindOfClass: [OFMutableArray class]])
return [OFArray_subarray arrayWithArray: self
range: range];
buffer = [self allocMemoryWithSize: sizeof(*buffer)
|
︙ | | | ︙ | |
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
|
options: (int)options
{
OFMutableString *ret;
if (separator == nil)
@throw [OFInvalidArgumentException exception];
if ([self count] == 0)
return @"";
if ([self count] == 1) {
OFString *component =
[[self firstObject] performSelector: selector];
if (component == nil)
@throw [OFInvalidArgumentException exception];
return component;
}
ret = [OFMutableString string];
if (options & OF_ARRAY_SKIP_EMPTY) {
for (id object in self) {
void *pool = objc_autoreleasePoolPush();
OFString *component =
[object performSelector: selector];
if (component == nil)
@throw [OFInvalidArgumentException exception];
if ([component length] > 0) {
if ([ret length] > 0)
[ret appendString: separator];
[ret appendString: component];
}
objc_autoreleasePoolPop(pool);
}
} else {
|
|
|
|
|
|
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
|
options: (int)options
{
OFMutableString *ret;
if (separator == nil)
@throw [OFInvalidArgumentException exception];
if (self.count == 0)
return @"";
if (self.count == 1) {
OFString *component =
[[self firstObject] performSelector: selector];
if (component == nil)
@throw [OFInvalidArgumentException exception];
return component;
}
ret = [OFMutableString string];
if (options & OF_ARRAY_SKIP_EMPTY) {
for (id object in self) {
void *pool = objc_autoreleasePoolPush();
OFString *component =
[object performSelector: selector];
if (component == nil)
@throw [OFInvalidArgumentException exception];
if (component.length > 0) {
if (ret.length > 0)
[ret appendString: separator];
[ret appendString: component];
}
objc_autoreleasePoolPop(pool);
}
} else {
|
︙ | | | ︙ | |
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
|
return true;
if (![object isKindOfClass: [OFArray class]])
return false;
otherArray = object;
count = [self count];
if (count != [otherArray count])
return false;
for (size_t i = 0; i < count; i++)
if (![[self objectAtIndex: i] isEqual:
[otherArray objectAtIndex: i]])
return false;
|
|
|
|
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
|
return true;
if (![object isKindOfClass: [OFArray class]])
return false;
otherArray = object;
count = self.count;
if (count != otherArray.count)
return false;
for (size_t i = 0; i < count; i++)
if (![[self objectAtIndex: i] isEqual:
[otherArray objectAtIndex: i]])
return false;
|
︙ | | | ︙ | |
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
|
}
- (OFString *)description
{
void *pool;
OFMutableString *ret;
if ([self count] == 0)
return @"()";
pool = objc_autoreleasePoolPush();
ret = [[self componentsJoinedByString: @",\n"] mutableCopy];
@try {
[ret prependString: @"(\n"];
|
|
|
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
|
}
- (OFString *)description
{
void *pool;
OFMutableString *ret;
if (self.count == 0)
return @"()";
pool = objc_autoreleasePoolPush();
ret = [[self componentsJoinedByString: @",\n"] mutableCopy];
@try {
[ret prependString: @"(\n"];
|
︙ | | | ︙ | |
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
|
if ([self isKindOfClass: [OFMutableArray class]])
element = [OFXMLElement elementWithName: @"OFMutableArray"
namespace: OF_SERIALIZATION_NS];
else
element = [OFXMLElement elementWithName: @"OFArray"
namespace: OF_SERIALIZATION_NS];
for (id object in self) {
void *pool2 = objc_autoreleasePoolPush();
[element addChild: [object XMLElementBySerializing]];
objc_autoreleasePoolPop(pool2);
}
[element retain];
objc_autoreleasePoolPop(pool);
|
|
|
|
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
|
if ([self isKindOfClass: [OFMutableArray class]])
element = [OFXMLElement elementWithName: @"OFMutableArray"
namespace: OF_SERIALIZATION_NS];
else
element = [OFXMLElement elementWithName: @"OFArray"
namespace: OF_SERIALIZATION_NS];
for (id <OFSerialization> object in self) {
void *pool2 = objc_autoreleasePoolPush();
[element addChild: object.XMLElementBySerializing];
objc_autoreleasePoolPop(pool2);
}
[element retain];
objc_autoreleasePoolPop(pool);
|
︙ | | | ︙ | |
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
|
}
- (OFString *)of_JSONRepresentationWithOptions: (int)options
depth: (size_t)depth
{
OFMutableString *JSON = [OFMutableString stringWithString: @"["];
void *pool = objc_autoreleasePoolPush();
size_t i, count = [self count];
if (options & OF_JSON_REPRESENTATION_PRETTY) {
OFMutableString *indentation = [OFMutableString string];
for (i = 0; i < depth; i++)
[indentation appendString: @"\t"];
|
|
|
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
|
}
- (OFString *)of_JSONRepresentationWithOptions: (int)options
depth: (size_t)depth
{
OFMutableString *JSON = [OFMutableString stringWithString: @"["];
void *pool = objc_autoreleasePoolPush();
size_t i, count = self.count;
if (options & OF_JSON_REPRESENTATION_PRETTY) {
OFMutableString *indentation = [OFMutableString string];
for (i = 0; i < depth; i++)
[indentation appendString: @"\t"];
|
︙ | | | ︙ | |
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
|
- (OFData *)messagePackRepresentation
{
OFMutableData *data;
size_t i, count;
void *pool;
data = [OFMutableData data];
count = [self count];
if (count <= 15) {
uint8_t tmp = 0x90 | ((uint8_t)count & 0xF);
[data addItem: &tmp];
} else if (count <= UINT16_MAX) {
uint8_t type = 0xDC;
uint16_t tmp = OF_BSWAP16_IF_LE((uint16_t)count);
|
|
|
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
|
- (OFData *)messagePackRepresentation
{
OFMutableData *data;
size_t i, count;
void *pool;
data = [OFMutableData data];
count = self.count;
if (count <= 15) {
uint8_t tmp = 0x90 | ((uint8_t)count & 0xF);
[data addItem: &tmp];
} else if (count <= UINT16_MAX) {
uint8_t type = 0xDC;
uint16_t tmp = OF_BSWAP16_IF_LE((uint16_t)count);
|
︙ | | | ︙ | |
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
|
for (id object in self) {
void *pool2 = objc_autoreleasePoolPush();
OFData *child;
i++;
child = [object messagePackRepresentation];
[data addItems: [child items]
count: [child count]];
objc_autoreleasePoolPop(pool2);
}
assert(i == count);
[data makeImmutable];
|
|
|
|
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
|
for (id object in self) {
void *pool2 = objc_autoreleasePoolPush();
OFData *child;
i++;
child = [object messagePackRepresentation];
[data addItems: child.items
count: child.count];
objc_autoreleasePoolPop(pool2);
}
assert(i == count);
[data makeImmutable];
|
︙ | | | ︙ | |
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
|
count: (int)count
{
of_range_t range = of_range(state->state, count);
if (range.length > SIZE_MAX - range.location)
@throw [OFOutOfRangeException exception];
if (range.location + range.length > [self count])
range.length = [self count] - range.location;
[self getObjects: objects
inRange: range];
if (range.location + range.length > ULONG_MAX)
@throw [OFOutOfRangeException exception];
|
|
|
|
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
|
count: (int)count
{
of_range_t range = of_range(state->state, count);
if (range.length > SIZE_MAX - range.location)
@throw [OFOutOfRangeException exception];
if (range.location + range.length > self.count)
range.length = self.count - range.location;
[self getObjects: objects
inRange: range];
if (range.location + range.length > ULONG_MAX)
@throw [OFOutOfRangeException exception];
|
︙ | | | ︙ | |
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
|
return ret;
}
#ifdef OF_HAVE_BLOCKS
- (OFArray *)mappedArrayUsingBlock: (of_array_map_block_t)block
{
OFArray *ret;
size_t count = [self count];
id *tmp = [self allocMemoryWithSize: sizeof(id)
count: count];
@try {
[self enumerateObjectsUsingBlock: ^ (id object, size_t idx,
bool *stop) {
tmp[idx] = block(object, idx);
|
|
|
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
|
return ret;
}
#ifdef OF_HAVE_BLOCKS
- (OFArray *)mappedArrayUsingBlock: (of_array_map_block_t)block
{
OFArray *ret;
size_t count = self.count;
id *tmp = [self allocMemoryWithSize: sizeof(id)
count: count];
@try {
[self enumerateObjectsUsingBlock: ^ (id object, size_t idx,
bool *stop) {
tmp[idx] = block(object, idx);
|
︙ | | | ︙ | |
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
|
return ret;
}
- (OFArray *)filteredArrayUsingBlock: (of_array_filter_block_t)block
{
OFArray *ret;
size_t count = [self count];
id *tmp = [self allocMemoryWithSize: sizeof(id)
count: count];
@try {
__block size_t i = 0;
[self enumerateObjectsUsingBlock: ^ (id object, size_t idx,
|
|
|
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
|
return ret;
}
- (OFArray *)filteredArrayUsingBlock: (of_array_filter_block_t)block
{
OFArray *ret;
size_t count = self.count;
id *tmp = [self allocMemoryWithSize: sizeof(id)
count: count];
@try {
__block size_t i = 0;
[self enumerateObjectsUsingBlock: ^ (id object, size_t idx,
|
︙ | | | ︙ | |
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
|
}
return ret;
}
- (id)foldUsingBlock: (of_array_fold_block_t)block
{
size_t count = [self count];
__block id current;
if (count == 0)
return nil;
if (count == 1)
return [[[self firstObject] retain] autorelease];
|
|
|
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
|
}
return ret;
}
- (id)foldUsingBlock: (of_array_fold_block_t)block
{
size_t count = self.count;
__block id current;
if (count == 0)
return nil;
if (count == 1)
return [[[self firstObject] retain] autorelease];
|
︙ | | | ︙ | |