<<>> <> <> <> <> <<>> DIRECTORY Devices, DeviceClassTypes, DeviceTypes, RefTab; DevicesImpl: CEDAR PROGRAM IMPORTS RefTab EXPORTS Devices, DeviceTypes = BEGIN Device: TYPE = DeviceTypes.Device; DeviceClass: TYPE = DeviceClassTypes.DeviceClass; DeviceClassObj: PUBLIC TYPE = DeviceClassTypes.DeviceClassObj; DeviceState: TYPE = DeviceTypes.DeviceState; globalDevices: RefTab.Ref ¬ RefTab.Create[]; QuaClass: PUBLIC PROC [ref: REF] RETURNS [class: DeviceClass] = { <> WITH ref SELECT FROM dc: DeviceClass => class ¬ dc; ENDCASE => class ¬ NIL; }; <<>> NameOfClass: PUBLIC PROC [class: DeviceClass] RETURNS [name: ATOM] = { name ¬ class.name; }; ClassOfDevice: PUBLIC PROC [device: Device] RETURNS [class: DeviceClass] = { class ¬ device.class; }; RegisterClass: PUBLIC PROC [class: DeviceClass, name: ATOM] = { [] ¬ RefTab.Store[globalDevices, name, class]; }; ClassFromName: PUBLIC PROC [name: ATOM] RETURNS [class: DeviceClass ¬ NIL] = { found: BOOL; val: REF; [found, val] ¬ RefTab.Fetch[globalDevices, name]; IF found THEN class ¬ NARROW[val]; }; InitialDeviceState: PUBLIC PROC [device: Device] RETURNS [DeviceState] = { <> RETURN[device.class.getDeviceState[device]]; }; <<>> END.