This commit is contained in:
Mikhalkovich Stanislav 2019-02-07 09:37:46 +03:00
parent bea912377e
commit 1968242990
6 changed files with 86 additions and 19 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 = "2";
public const string Revision = "1972";
public const string Revision = "1974";
public const string MainVersion = Major + "." + Minor;
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;

View file

@ -1,4 +1,4 @@
%MINOR%=4
%REVISION%=1972
%REVISION%=1974
%COREVERSION%=2
%MAJOR%=3

View file

@ -1 +1 @@
!define VERSION '3.4.2.1972'
!define VERSION '3.4.2.1974'

View file

@ -0,0 +1,13 @@
type
I6<T> = interface end;
I0 = interface end;
I1 = interface(I0) end;
I2 = interface(I1,I6<I2>,I6<object>) end;
t1 = class(I0, I2) end;
t2 = class(I1, I2) end;
t3 = class(I0, I1) end;
begin
Assert(1=1)
end.

View file

@ -12095,6 +12095,10 @@ namespace PascalABCCompiler.TreeConverter
private void check_cycle_interface_inheritance(common_type_node cnode, type_node base_of_cnode, List<common_type_node> interfaces)
{
// Для интерфейсов всё это излишне. Поскольку нельзя использовать предописанные интерфейсы в списке наследования, то
// циклически интерфейс может наследовать только от себя. Поэтому достаточно проверять нерекурсивно свой список ImplementingInterfaces и если там есть этот интерфейс, то ошибка
if (!cnode.IsInterface)
return;
interfaces.Add(cnode);
common_type_node bt = base_of_cnode as common_type_node;
if (bt != null && bt.original_generic != null)

View file

@ -9201,7 +9201,7 @@ begin
end;
/// Возвращает индекс первого минимального элемента начиная с позиции index
function IndexMin<T>(Self: IList<T>; index: integer := 0): integer; extensionmethod; where T: IComparable<T>;
function IndexMin<T>(Self: List<T>; index: integer := 0): integer; extensionmethod; where T: IComparable<T>;
begin
var min := Self[index];
Result := index;
@ -9214,7 +9214,7 @@ begin
end;
/// Возвращает индекс первого максимального элемента начиная с позиции index
function IndexMax<T>(self: IList<T>; index: integer := 0): integer; extensionmethod; where T: System.IComparable<T>;
function IndexMax<T>(Self: List<T>; index: integer := 0): integer; extensionmethod; where T: System.IComparable<T>;
begin
var max := Self[index];
Result := index;
@ -9226,12 +9226,12 @@ begin
end;
end;
/// Возвращает индекс последнего минимального элемента
function LastIndexMin<T>(Self: IList<T>): integer; extensionmethod; where T: System.IComparable<T>;
/// Возвращает индекс первого минимального элемента начиная с позиции index
function IndexMin<T>(Self: array of T; index: integer := 0): integer; extensionmethod; where T: IComparable<T>;
begin
var min := Self[Self.Count - 1];
Result := Self.Count - 1;
for var i := Self.Count - 2 downto 0 do
var min := Self[index];
Result := index;
for var i := index + 1 to Self.Count - 1 do
if Self[i].CompareTo(min) < 0 then
begin
Result := i;
@ -9239,8 +9239,21 @@ begin
end;
end;
/// Возвращает индекс первого максимального элемента начиная с позиции index
function IndexMax<T>(Self: array of T; index: integer := 0): integer; extensionmethod; where T: System.IComparable<T>;
begin
var max := Self[index];
Result := index;
for var i := index + 1 to Self.Count - 1 do
if Self[i].CompareTo(max) > 0 then
begin
Result := i;
max := Self[i];
end;
end;
/// Возвращает индекс последнего минимального элемента в диапазоне [0,index-1]
function LastIndexMin<T>(Self: IList<T>; index: integer): integer; extensionmethod; where T: System.IComparable<T>;
function LastIndexMin<T>(Self: List<T>; index: integer): integer; extensionmethod; where T: System.IComparable<T>;
begin
var min := Self[index];
Result := index;
@ -9252,21 +9265,33 @@ begin
end;
end;
/// Возвращает индекс последнего максимального элемента
function LastIndexMax<T>(Self: IList<T>): integer; extensionmethod; where T: System.IComparable<T>;
/// Возвращает индекс последнего минимального элемента в диапазоне [0,index-1]
function LastIndexMin<T>(Self: array of T; index: integer): integer; extensionmethod; where T: System.IComparable<T>;
begin
var max := Self[Self.Count - 1];
Result := Self.Count - 1;
for var i := Self.Count - 2 downto 0 do
if Self[i].CompareTo(max) > 0 then
var min := Self[index];
Result := index;
for var i := index - 1 downto 0 do
if Self[i].CompareTo(min) < 0 then
begin
Result := i;
max := Self[i];
min := Self[i];
end;
end;
/// Возвращает индекс последнего минимального элемента
function LastIndexMin<T>(Self: List<T>): integer; extensionmethod; where T: System.IComparable<T>;
begin
Result := Self.LastIndexMin(Self.Count - 1);
end;
/// Возвращает индекс последнего минимального элемента
function LastIndexMin<T>(Self: array of T): integer; extensionmethod; where T: System.IComparable<T>;
begin
Result := Self.LastIndexMin(Self.Count - 1);
end;
/// Возвращает индекс последнего минимального элемента в диапазоне [0,index-1]
function LastIndexMax<T>(Self: IList<T>; index: integer): integer; extensionmethod; where T: System.IComparable<T>;
function LastIndexMax<T>(Self: List<T>; index: integer): integer; extensionmethod; where T: System.IComparable<T>;
begin
var max := Self[index];
Result := index;
@ -9278,6 +9303,31 @@ begin
end;
end;
/// Возвращает индекс последнего минимального элемента в диапазоне [0,index-1]
function LastIndexMax<T>(Self: array of T; index: integer): integer; extensionmethod; where T: System.IComparable<T>;
begin
var max := Self[index];
Result := index;
for var i := index - 1 downto 0 do
if Self[i].CompareTo(max) > 0 then
begin
Result := i;
max := Self[i];
end;
end;
/// Возвращает индекс последнего максимального элемента
function LastIndexMax<T>(Self: List<T>): integer; extensionmethod; where T: System.IComparable<T>;
begin
Result := Self.LastIndexMax(Self.Count - 1);
end;
/// Возвращает индекс последнего максимального элемента
function LastIndexMax<T>(Self: array of T): integer; extensionmethod; where T: System.IComparable<T>;
begin
Result := Self.LastIndexMax(Self.Count - 1);
end;
/// Заменяет в массиве или списке все вхождения одного значения на другое
procedure Replace<T>(Self: IList<T>; oldValue, newValue: T); extensionmethod;
begin