language-Modula2-0.1: examples/Modula-2_Libraries/C.-Lins_Modula-2_Software_Component_Library/Vol4/maps/mapdsbmi.def
(*
4.2 Discrete Map Interface
This section provides the definition module for the Map abstraction
described in the previous chapter. In this variant, the domain and
range are constrained to discrete values representable using the CHAR
basic data type. Thus, characters and enumerations can be used as either
a domain or range or both. Domains may be further restricted to any
contiguous subrange, for example the capital letters A through Z from
the ASCII character set. The same is true for ranges.
*)
DEFINITION MODULE MapDSBMI;
(*====================================================================
Version : 2.0 16 Sep 1990 C. Lins
Compiler : Generic pc Modula-2
Component: Monolithic Structures - Map (Opaque version)
Discrete Sequential Bounded Managed Iterator
INTRODUCTION
This module provides operations for the discrete map abstract
data type.
REVISION HISTORY
v1.01 04 May 1988 C. Lins
Initial implementation for TML Modula-2.
v2.00 16 Sep 1990 C. Lins
Created generic pc version
(C) Copyright 1990 Charles A. Lins
=====================================================================*)
FROM MapTypes IMPORT
(*--Type*) Exceptions;
FROM ErrorHandling IMPORT
(*--Type*) HandlerProc;
FROM TypeManager IMPORT
(*--Type*) TypeID;
(*-----------------------*)
(*
4.2.1 Type Declarations
*)
TYPE Item = [0 .. 255]; (*-- !! WARNING: Changed from BYTE *)
TYPE Domain = Item;
TYPE Range = Item;
TYPE DomainType = RECORD
dataType : TypeID; (*-- data type id for Domain *)
first : Domain; (*-- first element of Domain *)
last : Domain; (*-- last element of Domain *)
END (*--DomainType*);
TYPE RangeType = RECORD
dataType : TypeID; (*-- data type id for Range *)
first : Range; (*-- first element of Range *)
last : Range; (*-- last element of Range *)
undefined : Range; (*-- undefined element of Range *)
END (*--RangeType*);
TYPE Map;
VAR NullMap : Map;
(*---------------------------------*)
(*-- EXCEPTIONS --*)
CONST ModuleID = 1;
PROCEDURE MapError () : Exceptions (*-- out *);
PROCEDURE GetHandler ( theError : Exceptions (*-- in *))
: HandlerProc (*-- out *);
PROCEDURE SetHandler ( theError : Exceptions (*-- in *);
theHandler : HandlerProc (*-- in *));
(*---------------------------------*)
(*-- CONSTRUCTORS --*)
PROCEDURE Create ( theDomain : DomainType (*-- in *);
theRange : RangeType (*-- in *))
: Map (*-- out *);
PROCEDURE Destroy (VAR theMap : Map (*-- inout *));
PROCEDURE Clear (VAR theMap : Map (*-- inout *));
PROCEDURE Assign ( theMap : Map (*-- in *);
VAR toMap : Map (*-- inout *));
PROCEDURE Bind (VAR theMap : Map (*-- inout *);
theItemIn : Domain (*-- in *);
toItemIn : Range (*-- in *));
PROCEDURE Unbind (VAR theMap : Map (*-- inout *);
theItemIn : Domain (*-- in *));
(*---------------------------------*)
(*-- SELECTORS --*)
PROCEDURE IsDefined ( theMap : Map (*-- in *))
: BOOLEAN (*-- out *);
PROCEDURE IsEmpty ( theMap : Map (*-- in *))
: BOOLEAN (*-- out *);
PROCEDURE IsEqual ( left : Map (*-- in *);
right : Map (*-- in *))
: BOOLEAN (*-- out *);
PROCEDURE ExtentOf ( theMap : Map (*-- in *))
: CARDINAL (*-- out *);
PROCEDURE DomainOf ( theMap : Map (*-- in *);
VAR theDomain : DomainType (*-- out *));
PROCEDURE RangeOf ( theMap : Map (*-- in *);
VAR theRange : RangeType (*-- out *));
PROCEDURE IsBound ( theMap : Map (*-- in *);
theItem : Domain (*-- in *))
: BOOLEAN (*-- out *);
PROCEDURE BoundTo ( theMap : Map (*-- in *);
theItem : Domain (*-- in *))
: Range (*-- out *);
PROCEDURE IsBoundTo ( theMap : Map (*-- in *);
theItem : Domain (*-- in *);
VAR toItem : Range (*-- out *))
: BOOLEAN (*-- out *);
(*---------------------------------*)
(*-- ITERATORS --*)
TYPE LoopAccessProc = PROCEDURE (Domain, Range) : BOOLEAN;
TYPE LoopChangeProc = PROCEDURE (Domain, VAR Range) : BOOLEAN;
PROCEDURE LoopOver ( theMap : Map (*-- in *);
theProcess: LoopAccessProc (*-- in *));
PROCEDURE LoopChange ( theMap : Map (*-- in *);
theProcess: LoopChangeProc (*-- in *));
TYPE AccessProc = PROCEDURE (Domain, Range);
TYPE ChangeProc = PROCEDURE (Domain, VAR Range);
PROCEDURE Traverse ( theMap : Map (*-- in *);
theProcess: AccessProc (*-- in *));
PROCEDURE TravChange ( theMap : Map (*-- in *);
theProcess: ChangeProc (*-- in *));
END MapDSBMI.