git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@3846 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
richard 1999-03-03 08:37:44 +00:00
parent f297891c86
commit 20144d53db
4 changed files with 0 additions and 787 deletions

View file

@ -1,160 +0,0 @@
@chapter GNU Objective-C Class Library
@c set the vars GNUSTEP-BASE-VERSION and GCC-VERSION
@include version.tmpl.texi
The GNUstep Base Library (libgnustep-base) is a library of
general-purpose, non-graphical Objective C objects written by Andrew
McCallum. What `libg++' is to GNU's C++, `libgnustep-base' is to GNU's
Objective C.
The library features collection objects for maintaining groups of
objects and C types, strings for handling collections of characters,
streams for I/O to various destinations, coders for formating objects
and C types to byte streams, ports for network packet transmission,
distributed objects (remote object messaging), pseudo-random number
generators, and time handling facilities.
@itemize @bullet
@item
The heirarchy of collection objects are similar in spirit to Smalltalk's
collections. A deep inheritance heirarchy provides good uniformity of
method names across different collection classes. All collections can
hold simple C types (such as int's and floats) as well as Objects. The
collection classes include simple collections (Set, Bag), collections
with contents accessible by unordered keys (Dictionary,
MappedCollector), collections with ordered contents (Array, LinkedList,
Stack, Queue, Heap, BinaryTree, RBTree, SplayTree, GapArray). There is
also a DelegatePool object that can forward messages it receives to an
arbitrary number of delegate objects.
@item
String objects...
@item
Stream objects provide a consistent interface for reading and writing
bytes. `StdioStream' objects work with files, file descriptors, FILE
pointers and pipes to/from executables. `MemoryStream' objects work
with memory buffers that grow automatically as needed. For all Stream
objects there are methods for writing/reading arbitrary n-length
buffers, newline-terminated lines, and printf-style strings.
@item
Coders provide a formatted way of writing to Streams. After a coder is
initialized with a stream, the coder can encode/decode Objective C
objects and C types in an architecture-independent way. The currently
available concrete coder classes are `BinaryCoder', for reading and
writing a compact stream of illegible bytes, and `TextCoder', for
reading and writing human-readable structured textual representation
(which you can also process with `perl', `awk', or whatever scripting
language you like).
Coders and streams can be mixed and matched so that programmers can
choose the destination and the format separately.
@item
The distributed object support classes are @samp{Connection},
@samp{Proxy}, @samp{ConnectedCoder}, @samp{Port} and @samp{SocketPort}.
This version of the distributed objects only works with sockets. A Mach
port back-end should be on the way.
[NOTE: The GNU distributed object facilities have the same ease-of-use
as NeXT's; be warned, however, that they are not compatible with each
other. They have different class heirarchies, different instance
variables, different method names, different implementation strategies
and different network message formats. You cannot communicate with a
NeXT NXConnection using a GNU Connection. NXConnection creates NXProxy
objects for local objects as well as remote objects; GNU Connection
doesn't need and doesn't create proxies for local objects. NXProxy asks
it's remote target for the method encoding types and caches the results;
GNU Proxy gets the types directly from the local GNU "typed selector"
mechanism and has no need for querying the remote target or caching
encoding types. The NXProxy for the remote root object always has name
0 and, once set, you cannot change the root object of a NXConnection;
the GNU Proxy for the remote root object has a target address value just
like all other Proxy's, and you can change the root object as many times
as you like. See the "lacking-capabilities" list below for a partial
list of things that NXConnection can do that GNU Connection cannot.]
Here is a partial list of what the current distributed objects system
can do:
@smallexample
* It can pass and return all simple C types, including char*, float
and double, both by value and by reference.
* It can pass structures by value and by reference, return
structures by reference. The structures can contain arrays.
* It obeys all the type qualifiers: oneway, in, out, inout, const.
* It can pass and return objects, either bycopy or with proxies.
An object encoded multiple times in a single message is properly
decoded on the other side.
* Proxies to remote objects are automatically created as they are
returned. Proxies passed back where they came from are decoded
as the correct local object.
* It can wait for an incoming message and timeout after a
specified period.
* A server can handle multiple clients.
* The server will ask its delegate before making new connections.
* The server can make call-back requests of the client, and keep
it all straight even when the server has multiple clients.
* A client will automatically form a connection to another client
if an object from the other client is vended to it. (i.e. Always
make a direct connection rather than forwarding messages twice,
once into the server, from there out to the other client.)
* The server will clean up its connection to a client if the client
says goodbye (i.e. if the client connection is freed).
* When the connection is being freed it will send a invalidation
notification message to those objects that have registered for
such notification.
* Servers and clients can be on different machines of different
architectures; byte-order and all other architecture-dependent
nits are taken care of for you. You can have SPARC, i386, m68k,
and MIPS machines all distributed-object'ing away together in
one big web of client-server connections!
@end smallexample
Here is a partial list of what the current distributed objects system
does *not* do:
@smallexample
* Run multi-threaded.
* Detect port deaths (due to remote application crash, for example)
and do something graceful.
* Send exceptions in the server back to the client.
* Return structures by value.
* Use Mach ports, pass Mach ports, pass Mach virtual memory.
* Send messages more reliably than UDP. It does detect reply
timeouts and message-out-of-order conditions, but it's reaction
is simply to abort.
* Claim to be thoroughly tested.
@end smallexample
@end itemize
@section Getting It, and Compiling It
The library is available by anonymous ftp at URL:
@smallexample
ftp://prep.ai.mit.edu/pub/gnu/libgnustep-base-@value{GNUSTEP-BASE-VERSION}.tar.gz
@end smallexample
Since @samp{prep} is heavily loaded, you are encouraged to use GNU
mirror sites.
The most recent (not necessarily tested) snapshots of the library will
be placed at @samp{ftp://alpha.gnu.ai.mit.edu/gnu}.
@include machines.texi
@section GNUStep
The @samp{libgnustep-base} library already contains many of the GNUStep
common classes: List, HashTable, Storage, NXStringTable. In the future
it will also contain the foundation kit classes for GNUStep. Progress
is already being made on this front.
@section Contact:
@example
Andrew McCallum
mccallum@@gnu.ai.mit.edu
@end example
@bye

View file

@ -1,37 +0,0 @@
@c set the vars GNUSTEP-BASE-VERSION and GNUSTEP-BASE-GCC-VERSION
@include version.tmpl.texi
THIS INFORMATION IS OUT-OF-DATE.
The library requires gcc @value{GCC-VERSION} or higher. The
library does not work with the NEXTSTEP 3.2 compiler because that
version of NeXT's cc cannot handle nested functions. Until a later
release from NeXT, NEXTSTEP users will have to install gcc. See the
@samp{INSTALL} file for more instructions about compiling and installing
the library.
The library has been successfully compiled and tested with the following
configurations:
@smallexample
mips-sgi-irix5.2
@end smallexample
Some previous snapshots of the library worked with these configurations,
but they haven't been tested recently. We are looking for a volunteer
to write a test suite using dejagnu.
@smallexample
sparc-sun-sunos4.1.3
m68k-next-nextstep3.0
rs6000-ibm-aix3.2
sparc-sun-solaris2.3
i386-unknown-linux
i386-sun-solaris2.4
i386-unknown-sysv4.0
mips-dec-ultrix4.2
HP/UX 9.01
@end smallexample
It is known not to work with:
@smallexample
alpha-dec-osf
@end smallexample

388
STATUS
View file

@ -1,388 +0,0 @@
Status Report
*************
Please send corrections to <fedor@gnu.org>.
*Key:*
*[10]*
Complete and tested.
*[8]*
Missing a few non-core methods, definitely usable.
*[6]*
Missing several methods, but core is there, usable.
*[4]*
Begun, but missing core functionality, not usable.
*[2]*
Skeleton.
*[0]*
Nothing there.
*[?]*
Unknown status.
Classes
=======
(Many classes do not raise the proper NSExceptions yet.)
*NSArchiver:: [8]*
Doesn't yet call -awakeAfterUsingCoder:.
*NSArray:: [9]*
*NSAssertionHandler:: [9]*
*NSAttributedString:: [8]*
*NSAutoreleasePool:: [9]*
But not exception- safe
*NSBundle:: [8]*
*NSCalendarDate:: [7]*
*NSCharacterSet:: [8]*
decomposableCharacterSet and illegalCharacter set missing
*NSCoder:: [8]*
Missing class name substitution methods.
*NSConditionLock:: [8]*
*NSConnection:: [7]*
GNU Connection, however, needs:
* to handle retain/release/dealloc properly
* to be integrated with NSInvocation
* to incorporate futzing with low-level TCP-backend for better
speed
* to have UDP-backend work
* to cache ConnectedCoder's for better speed
* Thread-safety overhaul, this is major
*NSCountedSet:: [8]*
*NSData:: [8]*
*NSDate:: [8]*
*NSDeserializer:: [7]*
*NSDictionary:: [8]*
*NSDistantObject:: [7]*
*NSDistributedLock:: [7]*
*NSEnumerator:: [9]*
*NSException:: [9]*
But this needs integration with new, better
*NSFileHandle:: [9]*
*NSFileManager:: [9]*
*NSHashTable:: [8]*
*NSHost:: [8]*
*NSInvocation:: [3]*
*NSLock:: [8]*
*NSMapTable:: [8]*
*NSMethodSignature:: [4]*
*NSMutableArray:: [8]*
*NSMutableCharacterSet:: [7]*
*NSMutableData:: [8]*
*NSMutableDictionary:: [8]*
*NSMutableSet:: [8]*
*NSMutableString:: [8]*
*NSNotification:: [9]*
*NSNotificationCenter:: [9]*
*NSNotificationQueue:: [6]*
Needs integration with NSRunLoop, and efficiency improvements
*NSNumber:: [9]*
*NSObject:: [10]*
*NSProcessInfo:: [9]*
*NSProxy:: [7]*
*NSRecursiveLock:: [8]*
*NSRunLoop:: [8]*
NSTimer's not yet working, but everything else should be
*NSScanner:: [8]*
*NSSerializer:: [7]*
*NSSet:: [8]*
*NSString:: [8]*
Careful, relationship with GNU String is tricky; this could also
use fixing.
*NSTask:: [8]*
*NSThread:: [8]*
*NSTimeZone:: [8]*
*NSTimeZoneDetail:: [8]*
*NSTimer:: [6]*
Working out bugs with returning doubles.
*NSUnarchiver:: [8]*
See NSArchvier
*NSUserDefaults:: [8]*
*NSValue:: [9]*
Cross-Class Projects, or GNU-related foundations for GNUstep classes
====================================================================
*Finish subclasses of Port class: Ports based on UDP, pflocal*
sockets, and shared memory.
*String classes will get some organizational work.*
Protocols
=========
*NSCoding:: [9]*
*NSCopying:: [9]*
*NSLocking:: [9]*
*NSMutableCopying:: [9]*
*NSObjCTypeSerializationCallBack:: [9]*
*NSObject (Protocol):: [9]*
Functions
=========
Memory Allocation Functions
---------------------------
*[8] Get the Virtual Memory Page Size*
`unsigned NSPageSize (void)'
`unsigned NSLogPageSize (void)'
`unsigned NSRoundDownToMultipleOfPageSize (unsigned BYTECOUNT)'
`unsigned NSRoundUpToMultipleOfPageSize (unsigned BYTECOUNT)'
*[2] Get the Amount of Real Memory*
`unsigned NSRealMemoryAvailable (void)'
*[8] Allocate or Free Virtual Memory*
`void *NSAllocateMemoryPages (unsigned BYTECOUNT)'
`void NSDeallocateMemoryPages (void *POINTER, unsigned BYTECOUNT)'
`void NSCopyMemoryPages (const void *SOURCE, void *DESTINATION, unsigned BYTECOUNT)'
*[8] Child and Merge Zones*
void NSMergeZone(NSZone *zonep)
NSZone *NSCreateChildZone(NSZone *parentZone, size_t startSize, size_t granularity, int canFree)
*[9] Get a Zone*
`NSZone *NSCreateZone (unsigned STARTSIZE, unsigned GRANULARITY, BOOL CANFREE)'
`NSZone *NSDefaultMallocZone (void)'
`NSZone *NSZoneFromPointer (void *POINTER)'
*[10] Allocate or Free Memory in a Zone*
`void *NSZoneMalloc (NSZone *ZONE,'
`void *NSZoneCalloc (NSZone *ZONE, unsigned NUMELEMS, unsigned NUMBYTES)'
`void *NSZoneRealloc (NSZone *ZONE, void *POINTER, unsigned SIZE)'
`void NSRecycleZone (NSZone *ZONE)'
`void NSZoneFree (NSZone *ZONE, void *POINTER)'
*[9] Name a Zone*
But the function names are wrong
`void NSSetZoneName (NSZone *ZONE, NSString *name)'
`NSString *NSZoneName (NSZone *ZONE)'
Object Allocation Functions
---------------------------
*[10] Allocate or Free an Object*
`NSObject *NSAllocateObject (Class ACLASS, unsigned EXTRABYTES, NSZone *ZONE)'
`NSObject *NSCopyObject(NSObject *ANOBJECT, unsigned EXTRABYTES, NSZone *ZONE)'
`void NSDeallocateObject (NSObject *ANOBJECT)'
*[9] Decide Whether to Retain an Object*
`BOOL NSShouldRetainWithZone (NSObject *ANOBJECT, NSZone
*REQUESTEDZONE)'
*[9] Modify the Number of References to an Object*
`BOOL NSDecrementExtraRefCountWasZero(id ANOBJECT)'
`void NSIncrementExtraRefCount(id ANOBJECT)'
Error-Handling Functions
------------------------
*[9] Change the Top-level Error Handler*
``NSUncaughtException'Handler *`NSGetUncaughtException'Handler(void)'
`void `NSSetUncaughtException'Handler(`NSUncaughtException'Handler *HANDLER)'
*[9] Macros to Handle an Exception*
`NS_DURING'
`NS_ENDHANDLER'
`NS_HANDLER'
`NS_VALUERETURN(VALUE, TYPE)'
`NS_VOIDRETURN'
*[9] Call the Assertion Handler from the Body of an Objective-C Method*
`NSAssert(BOOL CONDITION, NSString *DESCRIPTION)'
`NSAssert1(BOOL CONDITION, NSString *DESCRIPTION, ARG)'
`NSAssert2(BOOL CONDITION, NSString *DESCRIPTION, ARG1, ARG2)'
`NSAssert3(BOOL CONDITION, NSString *DESCRIPTION, ARG1, ARG2, ARG3)'
`NSAssert4(BOOL CONDITION, NSString *DESCRIPTION, ARG1, ARG2, ARG3, ARG4)'
`NSAssert5(BOOL CONDITION, NSString *DESCRIPTION, ARG1, ARG2, ARG3, ARG4, ARG5)'
*[9] Call the Assertion Handler from the Body of a C Function*
`NSCAssert(BOOL CONDITION, NSString *DESCRIPTION)'
`NSCAssert1(BOOL CONDITION, NSString *DESCRIPTION, ARG)'
`NSCAssert2(BOOL CONDITION, NSString *DESCRIPTION, ARG1, ARG2)'
`NSCAssert3(BOOL CONDITION, NSString *DESCRIPTION, ARG1, ARG2, ARG3)'
`NSCAssert4(BOOL CONDITION, NSString *DESCRIPTION, arg1, ARG2, ARG3, ARG4)'
`NSCAssert5(BOOL CONDITION, NSString *DESCRIPTION, ARG1, ARG2, ARG3, ARG4, ARG5)'
*[9] Validate a Parameter*
`NSParameterAssert(BOOL CONDITION)'
`NSCParameterAssert(BOOL CONDITION)'
Geometric Functions
-------------------
*[10] Create Basic Structures*
`NSPoint NSMakePoint(float X, float Y)'
`NSSize NSMakeSize(float W, float H)'
`NSRect NSMakeRect(float X, float Y, float W, float H)'
`NSRange NSMakeRange(unsigned int LOCATION, unsigned int LENGTH)'
*[10] Get a Rectangle's Coordinates*
`float NSMaxX(NSRect ARECT)'
`float NSMaxY(NSRect ARECT)'
`float NSMidX(NSRect ARECT)'
`float NSMidY(NSRect ARECT)'
`float NSMinX(NSRect ARECT)'
`float NSMinY(NSRect ARECT)'
`float NSWidth(NSRect ARECT)'
`float NSHeight(NSRect ARECT)'
*[10] Modify a Copy of a Rectangle*
`NSRect NSInsetRect(NSRect ARECT, float DX, float DY)'
`NSRect NSOffsetRect(NSRect ARECT, float DX, float DY)'
`void NSDivideRect(NSRect INRECT, NSRect *SLICE, NSRect *REMAINDER, float AMOUNT, NSRectEdge EDGE)'
`NSRect NSIntegralRect(NSRect ARECT)'
*[10] Compute a Third Rectangle from Two Rectangles*
`NSRect NSUnionRect(NSRect ARECT, NSRect BRECT)'
`NSRect NSIntersectionRect(NSRect ARECT, NSRect BRECT)'
*[10] Test Geometric Relationships*
`BOOL NSEqualRects(NSRect ARECT, NSRect BRECT)'
`BOOL NSEqualSizes(NSSize ASIZE, NSSize BSIZE)'
`BOOL NSEqualPoints(NSPoint APOINT, NSPoint BPOINT)'
`BOOL NSIsEmptyRect(NSRect ARECT)'
`BOOL NSMouseInRect(NSPoint APOINT, NSRect ARECT, BOOL FLIPPED)'
`BOOL NSPointInRect(NSPoint APOINT, NSRect ARECT)'
`BOOL NSContainsRect(NSRect ARECT, NSRect BRECT)'
*[10] Get a String Representation*
`NSString *NSStringFromPoint(NSPoint APOINT)'
`NSString *NSStringFromRect(NSRect ARECT)'
`NSString *NSStringFromSize(NSSize ASIZE)'
Range Functions
---------------
*[9] Query a Range*
`BOOL NSEqualRanges(NSRange RANGE1, NSRange RANGE2)'
`unsigned NSMaxRange(NSRange RANGE)'
`BOOL NSLocationInRange(unsigned LOCATION, NSRange RANGE)'
*[9] Compute a Range from Two Other Ranges*
`NSRange NSUnionRange(NSRange RANGE1, NSRange RANGE2)'
`NSRange NSIntersectionRange(NSRange RANGE1, NSRange RANGE2)'
*[9] Get a String Representation*
`NSString *NSStringFromRange(NSRange RANGE)'
Hash Table Functions
--------------------
*[8]*
Create a Table
`NSHashTable * NSCreateHashTable(NSHashTableCallBacks CALLBACKS, unsigned CAPACITY)'
`NSHashTable * NSCreateHashTableWithZone(NSHashTableCallBacks CALLBACKS, unsigned CAPACITY, NSZone * ZONE)'
`NSHashTable * NSCopyHashTableWithZone(NSHashTable * TABLE, NSZone * ZONE)'
Free a Table
`void NSFreeHashTable(NSHashTable * TABLE)'
`void NSResetHashTable(NSHashTable * TABLE)'
Compare Two Tables
`BOOL NSCompareHashTables(NSHashTable * TABLE1, NSHashTable * TABLE2)'
Get the Number of Items
`unsigned NSCountHashTable(NSHashTable * TABLE)'
Returns the number of elements in TABLE.
Retrieve Items
`void * NSHashGet(NSHashTable * TABLE, const void * POINTER)'
`NSArray * NSAllHashTableObjects(NSHashTable * TABLE)'
`NSHashEnumerator NSEnumerateHashTable(NSHashTable * TABLE)'
`void * NSNextHashEnumeratorItem(NSHashEnumerator * ENUMERATOR)'
Add or Remove an Item
`void NSHashInsert(NSHashTable * TABLE, const void * POINTER)'
`void NSHashInsertKnownAbsent(NSHashTable * TABLE, const void * POINTER)'
`void * NSHashInsertIfAbsent(NSHashTable * TABLE, const void * POINTER)'
`void NSHashRemove(NSHashTable * TABLE, const void * POINTER)'
Get a String Representation
`NSString * NSStringFromHashTable(NSHashTable * TABLE)'
Map Table Functions
-------------------
*[8]*
Create a Table
`NSMapTable * NSCreateMapTable(NSMapTableKeyCallBacks KEYCALLBACKS, NSMapTableValueCallBacks VALUECALLBACKS, unsigned CAPACITY)'
`NSMapTable * NSCreateMapTableWithZone(NSMapTableKeyCallBacks KEYCALLBACKS, NSMapTableValueCallBacks VALUECALLBACKS, unsigned CAPACITY,'
`NSMapTable * NSCopyMapTableWithZone(NSMapTable * TABLE, NSZone * ZONE)'
Free a Table
`void NSFreeMapTable(NSMapTable * TABLE)'
`void NSResetMapTable(NSMapTable * TABLE)'
Compare Two Tables:
`BOOL NSCompareMapTables(NSMapTable * TABLE1, NSMapTable * TABLE2)'
Get the Number of Items
`unsigned NSCountMapTable(NSMapTable * TABLE)'
Retrieve Items
`BOOL NSMapMember(NSMapTable * TABLE, const void * KEY, void ** ORIGINALKEY, void ** VALUE)'
`void * NSMapGet(NSMapTable * TABLE,'
`NSMapEnumerator NSEnumerateMapTable(NSMapTable * TABLE)'
`BOOL NSNextMapEnumeratorPair(NSMapEnumerator * ENUMERATOR, void ** KEY, void ** VALUE)'
`NSArray * NSAllMapTableKeys(NSMapTable * TABLE)'
`NSArray * NSAllMapTableValues(NSMapTable * TABLE)'
Add or Remove an Item
`void NSMapInsert(NSMapTable * TABLE, const void * KEY, const void * VALUE)'
`void * NSMapInsertIfAbsent(NSMapTable * TABLE, const void * KEY, const void * VALUE)'
`void NSMapInsertKnownAbsent(NSMapTable * TABLE, const void * KEY, const void * VALUE)'
`void NSMapRemove(NSMapTable * TABLE,'
`NSString *NSStringFromMapTable(NSMapTable *TABLE)'
Miscellaneous Functions
-----------------------
*[7] Get Information about a User*
`NSString *NSUserName(void)'
`NSString *NSHomeDirectory(void)'
`NSString *NSHomeDirectoryForUser(NSString *USERNAME)'
*[9] Log an Error Message*
`void NSLog(NSString *format,...'
`void NSLogv(NSString * FORMAT, va_list ARGS)'
*[8] Get Localized Versions of Strings*
`NSString * NSLocalizedString(NSString * KEY, NSString * COMMENT)'
`NSString * NSLocalizedStringFromTable(NSString * KEY, NSString * TABLENAME, NSString * COMMENT)'
`NSString * NSLocalizedStringFromTableInBundle(NSString * KEY, NSString * TABLENAME, NSBundle * ABUNDLE, NSString * COMMENT)'
*[9] Convert to and from a String*
`Class NSClassFromString(NSString *ACLASSNAME)'
`SEL NSSelectorFromString(NSString *ASELECTORNAME)'
`NSString *NSStringFromClass(Class ACLASS)'
`NSString *NSStringFromSelector(SEL ASELECTOR)'
*[3] Compose a Message To Be Sent Later to an Object*
`NSInvocation *NS_INVOCATION(Class ACLASS, INSTANCEMESSAGE)'
`NSInvocation *NS_MESSAGE(id ANOBJECT, INSTANCEMESSAGE)'

202
TODO
View file

@ -1,202 +0,0 @@
Todo
****
Projects Looking for Volunteers
===============================
If you think you can do one of these projects, please let me know. Your
help is greatly appreciated. Send email to `fedor@gnu.org'.
* Fix NSLog so it conforms to specs. Need to check that write to
stderr went ok, and if not write to syslog. Also need to serealize
output (with threads).
* Simplify NSException and NSAssertionHandler and make sure they
don't cause race conditions (if an exception is raised while
processing an exception.
* Fix all the places marked FIXME or xxx.
* Need to improve the testsuite and actually run it on gstep-base.
* Change all the assert()'s (especially in the archiving code) to
NSAssert()'s. This will help make D.O. servers more safe from bad
clients.
* Make NS... classes raise the NSExceptions they are supposed to.
Change many NSParameterAssert()'s into NSAssert()'s with
explanations.
* Many implementations could be made more efficient. The library
hasn't been efficiency tuned very much. Overridding more methods
in certain classes could make things more efficient (especially
EltNodeCollector). SplayTree's could be done using top-down
splaying. collhash could be completely reimplemented. ...and a
lot more...
* Implement efficient SmallInt and SmallFloat classes in the same
sort of way that Smalltalk does. Talk to me.
mccallum@gnu.ai.mit.edu.
McCallum's To Do's
==================
* Separate core and non-core code in NSDictionary, NSSet, etc, the
same way I did for NSArray.
* Separate Constant and non-Constant collections for the rest of the
GNU connection classes the same way I did for Array.
* Make sure the GNU Archiver/Unarchiver handle
-encodeConditionalObject: and -decodeObject: correctly.
* Reorganize some of the Categories to make a minimal NSObject-using
program smaller. Currently it is huge becuase it pulls in
archiving and therefore many of the collection classes. (But
perhaps this doesn't matter, since we recommend using shared
libraries anyway.)
* Make sure that Encoder's properly release their CStream and
Stream's. It seems that the Stream is not getting -delloc'ed, and
therefore may not be closed, and therefore may be missing data at
the end.
* Do low-level frobbing of TCP to reduce delays.
* Make UdpPort work; make MachPort work.
* Finish NotificationQueue, and make it interoperate with the
RunLoop properly.
* Make the NSTimer's work and interoperate with the RunLoop properly.
* Add Coding methods to all the collection classes.
* Finish Collection heirarchy clean ups. We need non-mutable
version for many of the classes.
* Possibly change implementation of `-(int)compare:anObject' for
Collection. How should non-Indexed collections be ordered?
Questions
=========
I would greatly appreciate your feedback on the questions below.
Please email your thoughts to mccallum@gnu.ai.mit.edu.
* I want to put method names in texinfo indices, but the colons in
the method names are interfering with info's notion of menu item
names and node names. Help. Any ideas? (Kresten?)
* HashTable.m (-initKeyDesc:valueDesc:capacity:) I tried to make it
portable, but I didn't try very hard. Anyone want to send in
fixes?
* I fixed -emptyCopy in all the subclasses, but the -emptyCopy scheme
seems pretty fragile. How about calling -initFoo: inside
-emptyCopy? This way we avoid having yet another method in which
instance vars must be initialized to some consistent state.
-allocCopy would never even get called. <<ObjC insiders: This is
a less well-expressed version of what we've just been discussing
in email.>>
* Does anyone really need the ability to set the collection element
comparison function independent of the -compare: method?
* How about adding flexibity in the method name that a LinkedList
sends a LinkedListNode to get/set the link ivars. This would
enable us to add a node to more than one linked list.
* Something like this needed? - elementDidChange: (elt*)elementPtr;
Currently you have to remove, change, add, for some classes.
Albin's To Do List
==================
I'm sure that there're other things to do, but these are the ones I
know now:
General
-------
* Make thread-safe all of my code that should be.
* Fully annotate all of my headers.
* Document my work and the use of its fruit.
Critical
--------
* Code:
+ (`src/array.m') `objects_array_check'
+ (`src/array.m') `objects_array_map_elements'
+ (`src/cbs-char-p.m') `objects_char_p_describe'
+ (`src/cbs-int-p.m') `objects_int_p_describe'
+ (`src/cbs-int.m') `objects_int_describe'
+ (`src/hash.m') `_objects_hash_hash'
+ (`src/hash.m') `objects_hash_check'
+ (`src/hash.m') `objects_hash_description'
+ (`src/list.m') `objects_list_is_equal_to_list'
+ (`src/map.m') `_objects_map_hash'
+ (`src/map.m') `objects_map_check'
+ (`src/map.m') `objects_map_description'
* Correct:
+ (`src/array.m') `objects_array_dealloc'
+ (`src/cbs-int.m') `_GNUSTEP_BASE_NOT_AN_INT_MARKER'
* Improve the error handling of:
+ (`src/array.m') `_objects_array_insert_bucket'
+ (`src/hash.m') `objects_hash_add_element_known_absent'
+ (`src/list.m') `objects_list_at_index_insert_element'
+ (`src/map.m') `objects_map_at_key_put_value_known_absent'
Not So Critical
---------------
* Strengthen my resolve on the correctness of:
+ (`src/cbs-char-p.m') `_GNUSTEP_BASE_NOT_A_CHAR_P_MARKER'
+ (`src/cbs-id.m') `_GNUSTEP_BASE_NOT_AN_ID_MARKER'
+ (`src/cbs-int-p.m') `_GNUSTEP_BASE_NOT_AN_INT_P_MARKER'
+ (`src/cbs-int-p.m') `objects_int_p_is_equal'
+ (`src/cbs-void-p.m') `_GNUSTEP_BASE_NOT_A_VOID_P_MARKER'
+ (`src/hash.m') `objects_hash_rightsize'
+ (`src/hash.m') `objects_hash_all_elements'
+ (`src/map.m') `objects_map_rightsize'
+ (`src/map.m') `objects_map_all_keys'
+ (`src/map.m') `objects_map_all_values'
* Improve the effeciency of:
+ (`src/array.m') `_objects_array_insert_bucket'
+ (`src/hash.m') `objects_hash_minus_hash'
+ (`src/list.m') `objects_list_at_index_insert_list'