This is MOClassVariable.m in view mode; [Download] [Up]
// MOClassVariable.m
//
// by Mike Ferris
// Part of MOKit
// Copyright 1993, all rights reserved.
// ABOUT MOKit
//
// MOKit is a collection of useful and general objects. Permission is
// granted by the author to use MOKit in your own programs in any way
// you see fit. All other rights to the kit are reserved by the author
// including the right to sell these objects as part of a LIBRARY or as
// SOURCE CODE. In plain English, I wish to retain rights to these
// objects as objects, but allow the use of the objects as pieces in a
// fully functional program. NO WARRANTY is expressed or implied. The author
// will under no circumstances be held responsible for ANY consequences to
// you from the use of these objects. Since you don't have to pay for
// them, and full source is provided, I think this is perfectly fair.
#import "MOKit/MOClassVariable.h"
#import <objc/objc-runtime.h>
#define CLASS_VERSION 0
#define CLASS_NAME "MOClassVariable"
@implementation MOClassVariable
+ initialize
// Set the version.
{
if (self == objc_lookUpClass(CLASS_NAME)) {
[self setVersion:CLASS_VERSION];
}
return self;
}
- init
// Just call the DI.
{
return [self initDoesFreeValues:NO];
}
- initDoesFreeValues:(BOOL)flag
// Designated Initializer.
// Allocate the hashtable used to store the values.
{
[super init];
ht = [[HashTable allocFromZone:[self zone]]
initKeyDesc:"%" valueDesc:"@"];
doesFreeValues = flag;
return self;
}
- free
// Free the hashtable (objects too, if we're supposed to).
{
if (doesFreeValues) [ht freeObjects];
[ht free];
return [super free];
}
- setObject:obj forClass:(Class)class
// The old value for the class (if any) is freed if doesFreeValues is YES,
// otherwise it returns the previous value. Returns nil if doesFreeValues is
// YES.
{
NXAtom className = NXUniqueString([class name]);
id prevVal = nil;
if (obj) {
// insert the new value
prevVal = (id)[ht insertKey:className value:obj];
} else {
// no new value, just remove the old
prevVal = (id)[ht valueForKey:className];
if (prevVal) [ht removeKey:className];
}
if (doesFreeValues) {
if (prevVal) [prevVal free];
return nil;
} else {
return prevVal;
}
}
- getObjectForClass:(Class)class
// Look up the value for the given class. Returns nil if no value has
// been set.
{
NXAtom className = NXUniqueString([class name]);
return (id)[ht valueForKey:className];
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.