diff --git a/TestSuite/CompilationSamples/PABCSystem.pas b/TestSuite/CompilationSamples/PABCSystem.pas index 6f47bd51e..e126c2345 100644 --- a/TestSuite/CompilationSamples/PABCSystem.pas +++ b/TestSuite/CompilationSamples/PABCSystem.pas @@ -468,6 +468,9 @@ type procedure Erase; /// Переименовывает файл, давая ему имя newname procedure Rename(newname: string); + ///- f.Write(a,b,...) + /// Выводит значения a,b,... в двоичный файл + procedure Write(params vals: array of object); end; // Class for typed files @@ -501,9 +504,6 @@ type function FileSize: int64; /// Устанавливает текущую позицию файлового указателя в бестиповом файле на байт с номером n procedure Seek(n: int64); - ///- f.Write(a,b,...) - /// Выводит значения a,b,... в двоичный файл - procedure Write(params vals: array of object); end; //{{{doc: Начало секции интерфейса для документации }}} @@ -3232,6 +3232,18 @@ begin Result := a.Contains(x); end; +function operator*(a: array of T; n: integer): array of T; extensionmethod; +begin + Result := new T[a.Length*n]; + for var i:=0 to n-1 do + a.CopyTo(Result,a.Length*i); +end; + +function operator*(n: integer; a: array of T): array of T; extensionmethod; +begin + Result := a*n +end; + //------------------------------------------------------------------------------ // Операции для List //------------------------------------------------------------------------------ @@ -3241,6 +3253,12 @@ begin Result := a; end; +function operator+(a, b: List): List; extensionmethod; +begin + Result := new List(a); + Result.AddRange(b); +end; + function operator+=(a: List; x: T): List; extensionmethod; begin a.Add(x); @@ -5174,6 +5192,11 @@ begin PABCSystem.Rename(Self, newname); end; +procedure AbstractBinaryFile.Write(params vals: array of object); +begin + PABCSystem.Write(Self, vals); +end; + // ----------------------------------------------------- // TypedFile & BinaryFile methods // ----------------------------------------------------- @@ -5207,11 +5230,6 @@ begin PABCSystem.Seek(Self, n); end; -procedure BinaryFile.Write(params vals: array of object); -begin - PABCSystem.Write(Self, vals); -end; - // ----------------------------------------------------- // Eoln - Eof // ----------------------------------------------------- @@ -8582,17 +8600,6 @@ end; function SliceListImpl(Self: List; from,step,count: integer): List; begin CorrectCountForSlice(Self.Count,from,step,count); - {if step = 0 then - raise new ArgumentException(GetTranslation(PARAMETER_STEP_MUST_BE_NOT_EQUAL_0)); - - if (from < 0) or (from > Self.Count - 1) then - raise new ArgumentException(GetTranslation(PARAMETER_FROM_OUT_OF_RANGE)); - - var cnt := step > 0 ? Self.Count - from : from + 1; - var cntstep := (cnt-1) div abs(step) + 1; - if count > cntstep then - count := cntstep;} - Result := CreateSliceFromListInternal(Self,from,step,count); end; diff --git a/bin/Lib/PABCExtensions.pas b/bin/Lib/PABCExtensions.pas index 54571bbcd..fb9d4419b 100644 --- a/bin/Lib/PABCExtensions.pas +++ b/bin/Lib/PABCExtensions.pas @@ -5,16 +5,55 @@ unit PABCExtensions; uses PABCSystem; +/// Открывает типизированный файл и возвращает значение для инициализации файловой переменной function OpenBinary(fname: string): file of T; begin PABCSystem.Reset(Result, fname); end; +/// Создаёт или обнуляет типизированный файл и возвращает значение для инициализации файловой переменной function CreateBinary(fname: string): file of T; begin PABCSystem.Rewrite(Result, fname); end; +/// Открывает типизированный файл и возвращает значение для инициализации файловой переменной +function OpenFile(fname: string): file of T; +begin + PABCSystem.Reset(Result, fname); +end; + +/// Создаёт или обнуляет типизированный файл и возвращает значение для инициализации файловой переменной +function CreateFile(fname: string): file of T; +begin + PABCSystem.Rewrite(Result, fname); +end; + +/// Открывает типизированный файл целых и возвращает значение для инициализации файловой переменной +function OpenFileInteger(fname: string): file of integer; +begin + Result := OpenFile&(fname); +end; + +/// Открывает типизированный файл вещественных и возвращает значение для инициализации файловой переменной +function OpenFileReal(fname: string): file of real; +begin + Result := OpenFile&(fname); +end; + +/// Создаёт или обнуляет типизированный файл целых и возвращает значение для инициализации файловой переменной +function CreateFileInteger(fname: string): file of integer; +begin + Result := CreateFile&(fname); +end; + +/// Создаёт или обнуляет типизированный файл вещественных и возвращает значение для инициализации файловой переменной +function CreateFileReal(fname: string): file of real; +begin + Result := CreateFile&(fname); +end; + +/// Возвращает последовательность элементов открытого типизированного файла function Elements(Self: file of T): sequence of T; extensionmethod; begin while not Self.Eof do @@ -25,11 +64,13 @@ begin end; end; +/// Считывает и возвращает следующий элемент типизированного файла function ReadElement(Self: file of T): T; extensionmethod; begin Read(Self, Result); end; +/// Открывает типизированный файл, возвращает последовательность элементов и закрывает его function ReadElements(fname: string): sequence of T; begin var f := OpenBinary&(fname); @@ -41,11 +82,11 @@ begin f.Close end; -procedure Write(Self: file of T; params vals: array of T); extensionmethod; +{procedure Write(Self: file of T; params vals: array of T); extensionmethod; begin foreach var x in vals do PABCSystem.Write(Self, x); -end; +end;} var __initialized: boolean; diff --git a/bin/Lib/PABCRtl.dll b/bin/Lib/PABCRtl.dll index e0241d4ea..22d64df76 100644 Binary files a/bin/Lib/PABCRtl.dll and b/bin/Lib/PABCRtl.dll differ diff --git a/bin/Lib/PABCSystem.pas b/bin/Lib/PABCSystem.pas index f3df83adb..1ebfecdb0 100644 --- a/bin/Lib/PABCSystem.pas +++ b/bin/Lib/PABCSystem.pas @@ -468,6 +468,11 @@ type procedure Erase; /// Переименовывает файл, давая ему имя newname procedure Rename(newname: string); + ///- f.Write(a,b,...) + /// Выводит значения a,b,... в двоичный файл + procedure Write(params vals: array of object); + /// Устанавливает файловый указатель на начало файла + procedure Reset; end; // Class for typed files @@ -501,9 +506,6 @@ type function FileSize: int64; /// Устанавливает текущую позицию файлового указателя в бестиповом файле на байт с номером n procedure Seek(n: int64); - ///- f.Write(a,b,...) - /// Выводит значения a,b,... в двоичный файл - procedure Write(params vals: array of object); end; //{{{doc: Начало секции интерфейса для документации }}} @@ -1523,7 +1525,11 @@ procedure Sort(l: List; less: (T,T)->boolean); /// Изменяет порядок элементов в динамическом массиве на противоположный procedure Reverse(a: array of T); /// Изменяет порядок элементов на противоположный в диапазоне динамического массива длины length начиная с индекса index -procedure Reverse(a: array of T; index,length: integer); +procedure Reverse(a: array of T; index,count: integer); +/// Изменяет порядок элементов в списке на противоположный +procedure Reverse(a: List); +/// Изменяет порядок элементов на противоположный в диапазоне списка длины length начиная с индекса index +procedure Reverse(a: List; index,count: integer); /// Перемешивает динамический массив случайным образом procedure Shuffle(a: array of T); /// Перемешивает список случайным образом @@ -3247,18 +3253,21 @@ end; //------------------------------------------------------------------------------ // Операции для List //------------------------------------------------------------------------------ +///-- function operator+=(a, b: List): List; extensionmethod; begin a.AddRange(b); Result := a; end; +///-- function operator+(a, b: List): List; extensionmethod; begin Result := new List(a); Result.AddRange(b); end; +///-- function operator+=(a: List; x: T): List; extensionmethod; begin a.Add(x); @@ -3271,6 +3280,40 @@ begin Result := Self.Contains(x); end; +///-- +function operator*(a: List; n: integer): List; extensionmethod; +begin + Result := new List(); + for var i := 1 to n do + Result.AddRange(a); +end; + +///-- +function operator*(n: integer; a: List): List; extensionmethod; +begin + Result := a*n; +end; + +//------------------------------------------------------------------------------ +// Операции для Stack +//------------------------------------------------------------------------------ +///-- +function operator+=(s: Stack; x: T): Stack; extensionmethod; +begin + s.Push(x); + Result := s; +end; + +//------------------------------------------------------------------------------ +// Операции для Queue +//------------------------------------------------------------------------------ +///-- +function operator+=(q: Queue; x: T): Queue; extensionmethod; +begin + q.Enqueue(x); + Result := q; +end; + //------------------------------------------------------------------------------ // Операции для HashSet //------------------------------------------------------------------------------ @@ -5192,6 +5235,16 @@ begin PABCSystem.Rename(Self, newname); end; +procedure AbstractBinaryFile.Write(params vals: array of object); +begin + PABCSystem.Write(Self, vals); +end; + +procedure AbstractBinaryFile.Reset; +begin + PABCSystem.Reset(Self); +end; + // ----------------------------------------------------- // TypedFile & BinaryFile methods // ----------------------------------------------------- @@ -5225,11 +5278,6 @@ begin PABCSystem.Seek(Self, n); end; -procedure BinaryFile.Write(params vals: array of object); -begin - PABCSystem.Write(Self, vals); -end; - // ----------------------------------------------------- // Eoln - Eof // ----------------------------------------------------- @@ -7072,11 +7120,22 @@ begin System.Array.Reverse(a); end; -procedure Reverse(a: array of T; index,length: integer); +procedure Reverse(a: array of T; index,count: integer); begin - System.Array.Reverse(a,index,length); + System.Array.Reverse(a,index,count); end; +procedure Reverse(a: List); +begin + a.Reverse +end; + +procedure Reverse(a: List; index,count: integer); +begin + a.Reverse(index,count) +end; + + procedure Shuffle(a: array of T); begin var n := a.Length;