TYPE
T* = RECORD
hour* : INTEGER; (* [0..23] *)
min* : INTEGER; (* [0..59] *)
sec* : INTEGER; (* [0..59] *)
msec* : INTEGER; (* [0..TactSEC-1] *)
END;
Stopwatch* = RECORD (T)
start : LONGINT; (* начальное время
в упакованном виде *)
on- : BOOLEAN; (* контроль
состояния: включен ли? *)
END;
PROCEDURE (VAR t: T) Pack* (): LONGINT;
VAR p: LONGINT; (* процедура связана с типом T; это
реализация метода класса *)
BEGIN
ASSERT((t.hour >= 0) & (t.hour <= 23)); (* контрольные
вставки *)
ASSERT((t.min >= 0) & (t.min <= 59));
ASSERT((t.sec >= 0) & (t.sec <= 59));
ASSERT((t.msec >= 0) & (t.msec <= 999));
p := t.hour * 60; (* упаковываем время, переводим
в бинарный вид *)
p := p + t.min; p := p * 60;
p := p + t.sec; p := p * TactSEC;
p := p + t.msec;
RETURN p
END Pack;
PROCEDURE (VAR sw: Stopwatch) Start* ;
VAR t: T;
BEGIN
ASSERT(~sw.on);
sw.on := TRUE; t.Get; sw.start := t.Pack();
END Start;
PROCEDURE (VAR sw: Stopwatch) Stop* ;
VAR t,t2: T; dlt: LONGINT;
BEGIN
ASSERT(sw.on);
sw.on := FALSE; t.Unpack(sw.start); t2.Get;
dlt := t.Delta(t2);
sw.Inc(dlt); sw.start := 0;
END Stop;