GNU Objective-C Class Library To Do list, and Questions.
********************************************************

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 `mccallum@gnu.ai.mit.edu'.

   * Help write a test-suite for the library.  Use dejagnu.  (Contact
     Richard Frith-Macdonald <richard@brainstorm.co.uk>, who has
     volunteered to coordinate these efforts.)

   * Write a proper name server for Port's.  Currently we're just
     hashing the name to a socket port number--we could get unwanted
     hash collisions.  This will also allow us to name a SocketPort
     after it's been created.  (Contact Richard Frith-Macdonald
     <richard@brainstorm.co.uk>, who has volunteered to coordinate these
     efforts.)

   * Improve the code to deal with `%@' in printf-style format strings
     for systems that do not have the GNU C library.  See
     src/NSString.m for the current implementation, which does not
     handle formatting modifiers.  (Those with the GNU C Library can
     just use `register_printf_function'.)

   * Implement efficient SmallInt and SmallFloat classes in the same
     sort of way that Smalltalk does.  Talk to me.
     mccallum@gnu.ai.mit.edu.

   * See
     http://www.cs.rochester.edu/u/mccallum/libobjects/volunteers.html
     for a list of the claimed and unclaimed GNUStep Foundation classes.

McCallum's To Do's
==================

   * Overhaul the string classes.

   * Make sets/dictionaries hashtables/maps copy their keys, not retain
     them.  This is specified in the OpenStep standard.

   * 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.

   * 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 my NS... classes raise the NSExceptions they are supposed to.
     Change many NSParameterAssert()'s into NSAssert()'s with
     explanations.

   * 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.

   * Fix many memory allocation inconsistencies.  Methods that return
     malloc'ed buffers should autorelease those buffers, (like
     readFormat:).  (I think all these are fixed now.)

   * Many code fixes and cleanups, indicated with `xxx' in the source.

   * 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?

   * Finish HashTable.m.  Implement freeKeys:values: (What is this
     supposed to do anyway?).  Handle archiving of atom string, "%",
     keys.

   * Finish Time.m.  Many methods are not yet implemented.

   * 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...

   * Fix all the subclassResponsibility comments in objects/*.h

   * I will finish gnustep-base documentation.

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.>>

   * I created libgnustep-base.texi by copying libg++.texi.  Some of
     the text is taken verbatim.  Is this a problem?

   * If you don't like the organization of the documentation and you
     have suggestions for changes, please say so now, not after it's
     all been written.

   * 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.

   * I've been told that GNU filenames should be 14 chars or less.  I
     don't want to abbreviate my classnames, but I think using .h
     @interface files with names different than the class name is even
     worse.  ** I want to keep my unabbreviated filenames!! **  What to
     do, what to do... I can't believe that *all* GNU classnames will be
     limited to 12 characters forever and ever--disgusting.

   

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'

