2017-02-09 23:33:33 +03:00
|
|
|
|
// Copyright (c) Ivan Bondarev, Stanislav Mihalkovich (for details please see \doc\copyright.txt)
|
|
|
|
|
|
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
|
|
|
|
|
|
///--
|
|
|
|
|
|
unit PABCExtensions;
|
|
|
|
|
|
|
|
|
|
|
|
uses PABCSystem;
|
|
|
|
|
|
|
2017-02-17 12:03:32 +03:00
|
|
|
|
/// Открывает типизированный файл и возвращает значение для инициализации файловой переменной
|
2017-02-09 23:33:33 +03:00
|
|
|
|
function OpenBinary<T>(fname: string): file of T;
|
|
|
|
|
|
begin
|
|
|
|
|
|
PABCSystem.Reset(Result, fname);
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
2017-02-17 12:03:32 +03:00
|
|
|
|
/// Создаёт или обнуляет типизированный файл и возвращает значение для инициализации файловой переменной
|
2017-02-15 08:54:25 +03:00
|
|
|
|
function CreateBinary<T>(fname: string): file of T;
|
|
|
|
|
|
begin
|
|
|
|
|
|
PABCSystem.Rewrite(Result, fname);
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
2017-02-17 12:03:32 +03:00
|
|
|
|
/// Открывает типизированный файл и возвращает значение для инициализации файловой переменной
|
|
|
|
|
|
function OpenFile<T>(fname: string): file of T;
|
|
|
|
|
|
begin
|
|
|
|
|
|
PABCSystem.Reset(Result, fname);
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
/// Создаёт или обнуляет типизированный файл и возвращает значение для инициализации файловой переменной
|
|
|
|
|
|
function CreateFile<T>(fname: string): file of T;
|
|
|
|
|
|
begin
|
|
|
|
|
|
PABCSystem.Rewrite(Result, fname);
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
/// Открывает типизированный файл целых и возвращает значение для инициализации файловой переменной
|
|
|
|
|
|
function OpenFileInteger(fname: string): file of integer;
|
|
|
|
|
|
begin
|
|
|
|
|
|
Result := OpenFile&<integer>(fname);
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
/// Открывает типизированный файл вещественных и возвращает значение для инициализации файловой переменной
|
|
|
|
|
|
function OpenFileReal(fname: string): file of real;
|
|
|
|
|
|
begin
|
|
|
|
|
|
Result := OpenFile&<real>(fname);
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
/// Создаёт или обнуляет типизированный файл целых и возвращает значение для инициализации файловой переменной
|
|
|
|
|
|
function CreateFileInteger(fname: string): file of integer;
|
|
|
|
|
|
begin
|
|
|
|
|
|
Result := CreateFile&<integer>(fname);
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
/// Создаёт или обнуляет типизированный файл вещественных и возвращает значение для инициализации файловой переменной
|
|
|
|
|
|
function CreateFileReal(fname: string): file of real;
|
|
|
|
|
|
begin
|
|
|
|
|
|
Result := CreateFile&<real>(fname);
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
2018-01-26 23:37:04 +03:00
|
|
|
|
/// Устанавливает текущую позицию файлового указателя в типизированном файле на элемент с номером n
|
|
|
|
|
|
function Seek<T>(Self: file of T; n: int64): file of T; extensionmethod;
|
2017-02-09 23:45:00 +03:00
|
|
|
|
begin
|
2018-01-26 23:37:04 +03:00
|
|
|
|
PABCSystem.Seek(Self, n);
|
|
|
|
|
|
Result := Self;
|
2017-02-09 23:45:00 +03:00
|
|
|
|
end;
|
|
|
|
|
|
|
2017-02-17 12:03:32 +03:00
|
|
|
|
/// Считывает и возвращает следующий элемент типизированного файла
|
2018-01-26 23:37:04 +03:00
|
|
|
|
function Read<T>(Self: file of T): T; extensionmethod;
|
2017-02-09 23:33:33 +03:00
|
|
|
|
begin
|
2018-01-26 23:37:04 +03:00
|
|
|
|
PABCSystem.Read(Self, Result);
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
/// Считывает и возвращает два следующих элемента типизированного файла в виде кортежа
|
|
|
|
|
|
function Read2<T>(Self: file of T): (T,T); extensionmethod;
|
|
|
|
|
|
begin
|
|
|
|
|
|
var a,b: T;
|
|
|
|
|
|
PABCSystem.Read(Self, a);
|
|
|
|
|
|
PABCSystem.Read(Self, b);
|
|
|
|
|
|
Result := (a,b);
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
/// Считывает и возвращает три следующих элемента типизированного файла в виде кортежа
|
|
|
|
|
|
function Read3<T>(Self: file of T): (T,T,T); extensionmethod;
|
|
|
|
|
|
begin
|
|
|
|
|
|
var a,b,c: T;
|
|
|
|
|
|
PABCSystem.Read(Self, a);
|
|
|
|
|
|
PABCSystem.Read(Self, b);
|
|
|
|
|
|
PABCSystem.Read(Self, c);
|
|
|
|
|
|
Result := (a,b,c);
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
/// Возвращает последовательность элементов открытого типизированного файла от текущего элемента до конечного
|
|
|
|
|
|
function ReadElements<T>(Self: file of T): sequence of T; extensionmethod;
|
|
|
|
|
|
begin
|
|
|
|
|
|
while not Self.Eof do
|
|
|
|
|
|
begin
|
|
|
|
|
|
var x := Self.Read;
|
|
|
|
|
|
yield x;
|
|
|
|
|
|
end;
|
2017-02-09 23:33:33 +03:00
|
|
|
|
end;
|
|
|
|
|
|
|
2018-01-26 23:37:04 +03:00
|
|
|
|
/// Открывает типизированный файл, возвращает последовательность его элементов и закрывает его
|
2017-02-09 23:33:33 +03:00
|
|
|
|
function ReadElements<T>(fname: string): sequence of T;
|
|
|
|
|
|
begin
|
|
|
|
|
|
var f := OpenBinary&<T>(fname);
|
|
|
|
|
|
while not f.Eof do
|
|
|
|
|
|
begin
|
2018-01-26 23:37:04 +03:00
|
|
|
|
var x := f.Read;
|
2017-02-09 23:33:33 +03:00
|
|
|
|
yield x;
|
|
|
|
|
|
end;
|
|
|
|
|
|
f.Close
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
2018-01-26 23:37:04 +03:00
|
|
|
|
/// Открывает типизированный файл, возвращает последовательность его элементов и закрывает его
|
|
|
|
|
|
procedure WriteElements<T>(fname: string; ss: sequence of T);
|
|
|
|
|
|
begin
|
|
|
|
|
|
var f := CreateBinary&<T>(fname);
|
|
|
|
|
|
foreach var x in ss do
|
|
|
|
|
|
f.Write(x);
|
|
|
|
|
|
f.Close
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
/// Записывает данные в типизированный файл
|
|
|
|
|
|
procedure Write<T>(Self: file of T; params vals: array of T); extensionmethod;
|
|
|
|
|
|
begin
|
|
|
|
|
|
foreach var x in vals do
|
|
|
|
|
|
PABCSystem.Write(Self, x);
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
|
2017-02-18 19:27:00 +03:00
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
// Операции для procedure
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
///--
|
|
|
|
|
|
function operator*(p: procedure; n: integer): procedure; extensionmethod;
|
|
|
|
|
|
begin
|
|
|
|
|
|
Result := () -> for var i:=1 to n do p
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
///--
|
|
|
|
|
|
function operator*(n: integer; p: procedure): procedure; extensionmethod;
|
|
|
|
|
|
begin
|
|
|
|
|
|
Result := () -> for var i:=1 to n do p
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
2017-02-09 23:33:33 +03:00
|
|
|
|
var __initialized: boolean;
|
|
|
|
|
|
|
|
|
|
|
|
procedure __InitModule;
|
|
|
|
|
|
begin
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
procedure __InitModule__;
|
|
|
|
|
|
begin
|
|
|
|
|
|
if not __initialized then
|
|
|
|
|
|
begin
|
|
|
|
|
|
__initialized := true;
|
|
|
|
|
|
__InitPABCSystem;
|
|
|
|
|
|
__InitModule;
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
begin
|
|
|
|
|
|
__InitModule;
|
|
|
|
|
|
end.
|