ValueArray.m
author Jens Alfke <jens@mooseyard.com>
Thu Mar 20 09:05:58 2008 -0700 (2008-03-20)
changeset 1 e55a17cdabd2
child 11 e5976864dfe9
permissions -rw-r--r--
Configurable logging (LogTo).
Added "my_" prefix to category method names.
Added MurmurHash.
Added UniqueWindowController.
Bug fixes.
jens@0
     1
//
jens@0
     2
//  ValueArray.m
jens@0
     3
//  MYUtilities
jens@0
     4
//
jens@0
     5
//  Copyright 2008 Jens Alfke. All rights reserved.
jens@0
     6
//
jens@0
     7
jens@0
     8
#import "ValueArray.h"
jens@0
     9
jens@0
    10
jens@0
    11
@implementation ValueArray
jens@0
    12
jens@0
    13
jens@0
    14
- (id) initWithCount: (unsigned)count valueSize: (size_t)valueSize
jens@0
    15
{
jens@0
    16
    self = [super init];
jens@0
    17
    if( self ) {
jens@0
    18
        _count = count;
jens@0
    19
        _valueSize = valueSize;
jens@0
    20
    }
jens@0
    21
    return self;
jens@0
    22
}
jens@0
    23
jens@0
    24
+ (ValueArray*) valueArrayWithCount: (unsigned)count valueSize: (size_t)valueSize
jens@0
    25
{
jens@0
    26
    return [[(ValueArray*)NSAllocateObject(self,count*valueSize,nil)
jens@0
    27
                            initWithCount: count valueSize: valueSize] 
jens@0
    28
                                autorelease];
jens@0
    29
}
jens@0
    30
jens@0
    31
- (unsigned) count      {return _count;}
jens@0
    32
- (size_t) valueSize    {return _valueSize;}
jens@0
    33
jens@0
    34
- (const void*) valueAtIndex: (unsigned)i
jens@0
    35
{
jens@0
    36
    NSParameterAssert(i<_count);
jens@0
    37
    return (const char*)object_getIndexedIvars(self) + i*_valueSize;
jens@0
    38
}
jens@0
    39
jens@0
    40
- (void) getValue: (void*)value atIndex: (unsigned)i
jens@0
    41
{
jens@0
    42
    NSParameterAssert(i<_count);
jens@0
    43
    NSParameterAssert(value!=NULL);
jens@0
    44
    memcpy(value, object_getIndexedIvars(self) + i*_valueSize, _valueSize);
jens@0
    45
}
jens@0
    46
jens@0
    47
- (void) setValue: (const void*)value atIndex: (unsigned)i
jens@0
    48
{
jens@0
    49
    NSParameterAssert(i<_count);
jens@0
    50
    NSParameterAssert(value!=NULL);
jens@0
    51
    memcpy(object_getIndexedIvars(self) + i*_valueSize, value, _valueSize);
jens@0
    52
}
jens@0
    53
jens@0
    54
jens@0
    55
jens@0
    56
- (id)initWithCoder:(NSCoder *)decoder
jens@0
    57
{
jens@0
    58
    NSParameterAssert([decoder allowsKeyedCoding]);
jens@0
    59
    NSKeyedUnarchiver *arch = (NSKeyedUnarchiver*)decoder;
jens@0
    60
    unsigned count = [arch decodeIntForKey: @"count"];
jens@0
    61
    size_t valueSize = [arch decodeIntForKey: @"valueSize"];
jens@0
    62
    
jens@0
    63
    [super release];
jens@0
    64
    self = [[[self class] valueArrayWithCount: count valueSize: valueSize] retain];
jens@0
    65
    if( self ) {
jens@0
    66
        unsigned nBytes;
jens@0
    67
        const void *bytes = [arch decodeBytesForKey: @"values" returnedLength: &nBytes];
jens@0
    68
        NSAssert(nBytes==count*valueSize,@"Value size mismatch");
jens@0
    69
        memcpy( object_getIndexedIvars(self), bytes, nBytes );
jens@0
    70
    }
jens@0
    71
    return self;
jens@0
    72
}
jens@0
    73
jens@0
    74
jens@0
    75
- (void)encodeWithCoder:(NSCoder *)coder
jens@0
    76
{
jens@0
    77
    NSParameterAssert([coder allowsKeyedCoding]);
jens@0
    78
    NSKeyedArchiver *arch = (NSKeyedArchiver*)coder;
jens@0
    79
    
jens@0
    80
    [arch encodeInt: _count forKey: @"count"];
jens@0
    81
    [arch encodeInt: _valueSize forKey: @"valueSize"];
jens@0
    82
    [arch encodeBytes: object_getIndexedIvars(self)
jens@0
    83
               length: _count*_valueSize
jens@0
    84
               forKey: @"values"];
jens@0
    85
}    
jens@0
    86
jens@0
    87
jens@0
    88
@end
jens@0
    89
jens@0
    90
jens@0
    91
ImplementValueArrayOf(Int,int)
jens@0
    92
jens@0
    93
ImplementValueArrayOf(Double,double)