
	The generic functions in GCOOPE Version 1.0 initial release.

			by Brian Lee Price

		Released as Public Domain  July, 1994.



I.  The flavors of New,  the following constructors are defined:

    A.  Class constructor

	form of call;

	    1. normal

		newclass=g(New)(Class, classVarSize, instanceVarSize,
			ancestor list terminated by END);


	    2. strong typing

		newclass=NEW(Class)(Class, classVarSize, instanceVarSize,
			ancestor list terminated by END);

	this call creates an instance of Class, ie a new class.
	should only be called from within a CLASS_INSTALL function.



    B.  Other constructors

	form of call;

	    1. normal

		newobject=g(New)(className, initialParameters);

	    2. strong typing

		newobject=NEW(className)(className, initialParameters);

	The form of the parameter list is given in each class description.


II. Other generic functions:

    A. Impossible to prototype generics;

	changeVal and valueOf are pretty much impossible to deal with
	under strong typing.  For valueOf, you can use the return
	value type casts given in gcoope10.h.

	The trouble with changeVal is although it always returns an
	object type and always takes an object type as the first
	parameter, the second parameter is a different type for every
	object class it is defined for.  Still, I'd rather pass by
	value and take my chances with weak typing than go through
	the pains of passing by pointer.

	valueOf has the opposite problem, it always takes only one
	parameter of type object, but its return value changes for
	each object class it is defined for.  In gcoope10.h there
	are some return value method typecasts defined that can
	help you avoid many problems, but you still must know what
	type to expect.

	For both of the above, the primary usage should be by other
	class definitions rather than applications programs, this
	should at least localize any problems.

	Accessing:

	   The above generics should be called in the following
	   manner:

	   1. normal

		returnValue= ((returnTypeCast)g)(genName)(parms);

	   2. strong typing

		returnValue= ((returnTypeCast)g)(GEN(genName))(parms);


    B. Standard format generics;

	The following generic functions have a standardized interface,
	they always return the same type and always take the same
	number and type of parameters regardless of the class definition
	for which they are defined.

	I'm going to show them here as standard function prototypes, but
	bear in mind that you must call them as follows:

	   1. normal

		returnValue= ((returnTypeCast) g)(genName)(parameters);

	   2. strong typing

		returnValue= G(genName)(parameters);


	Here are the generics given as standard prototypes:


		object 	reSize(object, word)
		object 	putElem(object, word, void *)
		void * 	getElem(object, word)
		word    sizeOf(object)
		word	lengthOf(object)
		word	numElems(object)
		object	classOf(object)
		object	ivSize(object)
		object  respondsTo(object, generic)
		object  deepCopy(object)
		object  shallowCopy(object, object)
		object	asString(object)
		object	asHexStr(object)
		object  asShortInt(object)
		object  asLongInt(object)
		object	asUnsigned(object)
		object  asChar(object)
		int  	addUnit(object, void *)
		object  rmvUnit(object, int)
		void *  getUnit(object, int)
		object  compact(object, boolean)
		long	getPos(object)
		object  strmErr(object)
		object  setPos(object, long, int)
		object  putByte(object, byte)
		object  getByte(object)
		object	clrErr(object)
		object  SetBuf(object, char *, int, word)
		object  Flush(object)
		object  Stat(object)
		int	Putc(object, char)
		int  	Getc(object)
		int	UnGet(object, char)
		int	Puts(object, const char *)
		void *  Gets(object, char *, int)
		int	Write(object, const char *, word, word)
		int	Read(object, char *, word, word)
		void *  addressOf(object)

	    Most of these generics should be self explanatory, however
	consult the class definitions for details.  Also note that when
	possible, I have attempted to stay with the standard ANSI C
	function library prototypes.

	    A final reminder, don't try to use the prototypes above
	directly, use either the return type casting as needed or
	the strong typing option with the g or G dispatch call.

	    The above goes to show that if you beat C firmly about the
	neck and shoulders with an appropriately sized sledgehammer, you
	can combine a reasonable degree of static type checking with
	run-time OOP flexibility.


