ConvertAll и Transform с доппараметрами - индексами
This commit is contained in:
miks1965 2018-08-09 21:34:26 +03:00
parent 58b89acc0c
commit 1446ca2fba
7 changed files with 66 additions and 4 deletions

View file

@ -15,7 +15,7 @@ internal static class RevisionClass
public const string Major = "3";
public const string Minor = "4";
public const string Build = "0";
public const string Revision = "1733";
public const string Revision = "1734";
public const string MainVersion = Major + "." + Minor;
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;

View file

@ -1,4 +1,4 @@
%COREVERSION%=0
%REVISION%=1733
%MINOR%=4
%REVISION%=1734
%COREVERSION%=0
%MAJOR%=3

View file

@ -1 +1 @@
!define VERSION '3.4.0.1733'
!define VERSION '3.4.0.1734'

View file

@ -9057,6 +9057,13 @@ begin
Self[i] := f(Self[i]);
end;
/// Преобразует элементы массива или списка по заданному правилу
procedure Transform<T>(Self: IList<T>; f: (T,integer)->T); extensionmethod;
begin
for var i := 0 to Self.Count - 1 do
Self[i] := f(Self[i],i);
end;
/// Заполняет элементы массива или списка значениями, вычисляемыми по некоторому правилу
procedure Fill<T>(Self: IList<T>; f: integer->T); extensionmethod;
begin
@ -9448,6 +9455,15 @@ begin
Result[i, j] := converter(Self[i, j]);
end;
/// Преобразует элементы двумерного массива и возвращает преобразованный массив
function ConvertAll<T, T1>(Self: array [,] of T; converter: (T,integer,integer)->T1): array [,] of T1; extensionmethod;
begin
Result := new T1[Self.RowCount, Self.ColCount];
for var i := 0 to Self.RowCount - 1 do
for var j := 0 to Self.ColCount - 1 do
Result[i, j] := converter(Self[i, j],i,j);
end;
/// Преобразует элементы двумерного массива по заданному правилу
procedure Transform<T>(Self: array [,] of T; f: T->T); extensionmethod;
begin
@ -9456,6 +9472,14 @@ begin
Self[i, j] := f(Self[i, j]);
end;
/// Преобразует элементы двумерного массива по заданному правилу
procedure Transform<T>(Self: array [,] of T; f: (T,integer,integer)->T); extensionmethod;
begin
for var i := 0 to Self.RowCount - 1 do
for var j := 0 to Self.ColCount - 1 do
Self[i, j] := f(Self[i, j],i,j);
end;
/// Заполняет элементы двумерного массива значениями, вычисляемыми по некоторому правилу
procedure Fill<T>(Self: array [,] of T; f: (integer,integer) ->T); extensionmethod;
begin
@ -9757,6 +9781,14 @@ begin
Result := System.Array.ConvertAll(self, t -> converter(t));
end;
/// Преобразует элементы массива и возвращает преобразованный массив
function ConvertAll<T, T1>(Self: array of T; converter: (T,integer)->T1): array of T1; extensionmethod;
begin
Result := new T1[Self.Length];
for var i := 0 to Self.Length - 1 do
Result[i] := converter(Self[i],i);
end;
/// Выполняет поиск первого элемента в массиве, удовлетворяющего предикату. Если не найден, возвращается нулевое значение соответствующего типа
function Find<T>(Self: array of T; p: T->boolean): T; extensionmethod;
begin

View file

@ -0,0 +1,7 @@
function f := 123;
begin
var ff: ()->integer := f;
var r: object := ff;
Assert(r.Equals(123));
end.

View file

@ -945,6 +945,8 @@ namespace PascalABCCompiler.TreeRealization
{
if (dii.return_value_type == to)
{
if (ret.first != null) // SSM 09.08.18
ret.first = null;
add_conversion(ret, new convert_types_function_node(convert_delegate_to_return_value_type, true), from, to);
}
else
@ -953,11 +955,15 @@ namespace PascalABCCompiler.TreeRealization
if ((ptcc.first != null) && (ptcc.first.convertion_method != null))
{
delegate_type_converter dtc = new delegate_type_converter(ptcc.first.convertion_method);
if (ret.first != null) // SSM 09.08.18
ret.first = null;
add_conversion(ret, new convert_types_function_node(dtc.convert_delegate_to_return_value_type_with_convertion, false), from, to);
}
if ((ptcc.second != null) && (ptcc.second.convertion_method != null))
{
delegate_type_converter dtc = new delegate_type_converter(ptcc.second.convertion_method);
if (ret.first != null) // SSM 09.08.18
ret.first = null;
add_conversion(ret, new convert_types_function_node(dtc.convert_delegate_to_return_value_type_with_convertion, false), from, to);
}
}

View file

@ -9455,6 +9455,15 @@ begin
Result[i, j] := converter(Self[i, j]);
end;
/// Преобразует элементы двумерного массива и возвращает преобразованный массив
function ConvertAll<T, T1>(Self: array [,] of T; converter: (T,integer,integer)->T1): array [,] of T1; extensionmethod;
begin
Result := new T1[Self.RowCount, Self.ColCount];
for var i := 0 to Self.RowCount - 1 do
for var j := 0 to Self.ColCount - 1 do
Result[i, j] := converter(Self[i, j],i,j);
end;
/// Преобразует элементы двумерного массива по заданному правилу
procedure Transform<T>(Self: array [,] of T; f: T->T); extensionmethod;
begin
@ -9463,6 +9472,14 @@ begin
Self[i, j] := f(Self[i, j]);
end;
/// Преобразует элементы двумерного массива по заданному правилу
procedure Transform<T>(Self: array [,] of T; f: (T,integer,integer)->T); extensionmethod;
begin
for var i := 0 to Self.RowCount - 1 do
for var j := 0 to Self.ColCount - 1 do
Self[i, j] := f(Self[i, j],i,j);
end;
/// Заполняет элементы двумерного массива значениями, вычисляемыми по некоторому правилу
procedure Fill<T>(Self: array [,] of T; f: (integer,integer) ->T); extensionmethod;
begin