(*
13			The Unbounded Set (continued)

This chapter presents the unbounded, unmanaged implementation of the set abstraction described in
Chapter 11.  As with the other unbounded modules, given previously, the size of the set
structure varies dynamically as items are added and removed.  This particular form has
the properties: Sequential, Unbounded, Unmanaged, and Non-Iterator.  These describe specific
aspects of the implementation as follows:

Sequential:	Can only be used in a non-tasking environment, or by only one task.
Unbounded:	The size of a set varies dynamically as items are added and removed from
		the set.
Unmanaged:	Memory space for objects is returned to the system when no longer needed.
		Note that Items are not managed.
Non-Iterator:	Routines for looping over each of the set items are not provided.

The unbounded set interface follows in Section 13.5 while the actual implementation
appears in Section 13.6.

The TypeManager module is needed for the implementation which uses an ordered list. So
comparison is needed but assignment and disposal are not.



13.5		SetSUUN Interface
*)


DEFINITION MODULE SetSUUN;
(*==========================================================
    Version  : 1.00  30 Apr 1989  C. Lins
    Compiler : TopSpeed Modula-2
    Component: Monolithic Structures - Set
               Sequential Unbounded Unmanaged Non-Iterator

    INTRODUCTION
    This module provides the interface for the unbounded Set
    abstraction for generic Items.

    REVISION HISTORY
    v1.00  30 Apr 1989  C. Lins
      Initial implementation for TopSpeed Modula-2. Derived from
	  SetSUMN module.

    (C) Copyright 1989 Charles A. Lins
==========================================================*)

FROM Items IMPORT
    (*--Type*) Item;

FROM ErrorHandling IMPORT
    (*--Proc*) HandlerProc;

FROM SetEnum IMPORT
    (*--Type*) Exceptions;

FROM TypeManager IMPORT
    (*--Type*) TypeID;

    (*-----------------------*)

TYPE  Set;
CONST NullSet = Set(NIL);


(*
13.5.1			Exceptions
*)

CONST ModuleID = 10;

PROCEDURE SetError    ()             : Exceptions  (*--out  *);

PROCEDURE GetHandler  (    ofError   : Exceptions  (*--in   *))
                                     : HandlerProc (*--out  *);

PROCEDURE SetHandler  (    ofError   : Exceptions  (*--in   *);
                           toHandler : HandlerProc (*--in   *));


(*
13.5.2			Constructors
*)

PROCEDURE Create        (    theType : TypeID (*--in   *))
                                     : Set    (*--out  *);

PROCEDURE Destroy       (VAR theSet  : Set    (*--inout*));

PROCEDURE Clear         (VAR theSet  : Set    (*--inout*));

PROCEDURE Assign        (    theSet  : Set    (*--in   *);
                         VAR toSet   : Set    (*--inout*));

PROCEDURE Include       (    theItem : Item   (*--in   *);
                         VAR inSet   : Set    (*--inout*));

PROCEDURE Exclude       (    theItem : Item   (*--in   *);
                         VAR fromSet : Set    (*--inout*));

PROCEDURE Union         (    left    : Set    (*--in   *);
                             right   : Set    (*--in   *);
                         VAR toSet   : Set    (*--inout*));

PROCEDURE Intersection  (    left    : Set    (*--in   *);
                             right   : Set    (*--in   *);
                         VAR toSet   : Set    (*--inout*));

PROCEDURE Difference    (    left    : Set    (*--in   *);
                             right   : Set    (*--in   *);
                         VAR toSet   : Set    (*--inout*));

PROCEDURE SymDifference (    left    : Set    (*--in   *);
                             right   : Set    (*--in   *);
                         VAR toSet   : Set    (*--inout*));



(*
13.5.3			Selectors
*)

PROCEDURE IsDefined     (    theSet  : Set      (*--in   *))
                                     : BOOLEAN  (*--out  *);

PROCEDURE IsEmpty       (    theSet  : Set      (*--in   *))
                                     : BOOLEAN  (*--out  *);

PROCEDURE TypeOf        (    theSet  : Set      (*--in   *))
                                     : TypeID   (*--out  *);

PROCEDURE IsEqual       (    left    : Set      (*--in   *);
                             right   : Set      (*--in   *))
                                     : BOOLEAN  (*--out  *);

PROCEDURE NumMembers    (    theSet  : Set      (*--in   *))
                                     : CARDINAL (*--out  *);

PROCEDURE IsAMember     (    theItem : Item     (*--in   *);
                             theSet  : Set      (*--in   *))
                                     : BOOLEAN  (*--out  *);

PROCEDURE IsSubset      (    left    : Set      (*--in   *);
                             right   : Set      (*--in   *))
                                     : BOOLEAN  (*--out  *);

PROCEDURE IsProperSubset(    left    : Set      (*--in   *);
                             right   : Set      (*--in   *))
                                     : BOOLEAN  (*--out  *);

END SetSUUN.
