From 7906d73da359b89181c71ab847fe04251ccd9f49 Mon Sep 17 00:00:00 2001 From: Mikhalkovich Stanislav Date: Tue, 3 Dec 2024 14:25:37 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=B5=D0=B1=D0=BE=D0=BB=D1=8C=D1=88?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=B2=20=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D0=B8=20=D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D0=B9=20=D1=81=20=D0=BC=D0=BD=D0=BE=D0=B6=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D0=B2=D0=B0=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Configuration/GlobalAssemblyInfo.cs | 2 +- Configuration/Version.defs | 2 +- Release/pabcversion.txt | 2 +- ReleaseGenerators/PascalABCNET_version.nsh | 2 +- .../CompilationSamples/PABCExtensions.pas | 657 +++++++++++++----- TestSuite/CompilationSamples/PABCSystem.pas | 86 +-- bin/Lib/PABCExtensions.pas | 657 +++++++++++++----- bin/Lib/PABCSystem.pas | 86 +-- bin/PascalABCNET.chw | Bin 143330 -> 143330 bytes 9 files changed, 1030 insertions(+), 464 deletions(-) diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs index 8bc2d70dc..5bd9cd8b3 100644 --- a/Configuration/GlobalAssemblyInfo.cs +++ b/Configuration/GlobalAssemblyInfo.cs @@ -15,7 +15,7 @@ internal static class RevisionClass public const string Major = "3"; public const string Minor = "10"; public const string Build = "1"; - public const string Revision = "3579"; + public const string Revision = "3581"; public const string MainVersion = Major + "." + Minor; public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision; diff --git a/Configuration/Version.defs b/Configuration/Version.defs index bd8549a38..96e2158e8 100644 --- a/Configuration/Version.defs +++ b/Configuration/Version.defs @@ -1,4 +1,4 @@ %MINOR%=10 -%REVISION%=3579 +%REVISION%=3581 %COREVERSION%=1 %MAJOR%=3 diff --git a/Release/pabcversion.txt b/Release/pabcversion.txt index 0b2ff8949..b1ac2081c 100644 --- a/Release/pabcversion.txt +++ b/Release/pabcversion.txt @@ -1 +1 @@ -3.10.1.3579 +3.10.1.3581 diff --git a/ReleaseGenerators/PascalABCNET_version.nsh b/ReleaseGenerators/PascalABCNET_version.nsh index 93a316762..e6142740b 100644 --- a/ReleaseGenerators/PascalABCNET_version.nsh +++ b/ReleaseGenerators/PascalABCNET_version.nsh @@ -1 +1 @@ -!define VERSION '3.10.1.3579' +!define VERSION '3.10.1.3581' diff --git a/TestSuite/CompilationSamples/PABCExtensions.pas b/TestSuite/CompilationSamples/PABCExtensions.pas index 33e65ce49..ca84f0288 100644 --- a/TestSuite/CompilationSamples/PABCExtensions.pas +++ b/TestSuite/CompilationSamples/PABCExtensions.pas @@ -456,18 +456,22 @@ begin end; // Важнейший для новых множеств !!! -{procedure operator:=(var Self: NewSet; st: NewSet); extensionmethod; +{procedure operator:=(var Self: set of T>; st: set of T>); extensionmethod; begin Self._hs := new HashSet(st.hs); end;} -{procedure operator:=(var Self: NewSet; st: NewSetEmpty); extensionmethod; +{procedure operator:=(var Self: set of T>; st: NewSetEmpty); extensionmethod; begin Self._hs := new HashSet(); end;} +// -------------------------------------- // Extension-методы для новых множеств -function operator implicit(n: NewSet): NewSet; extensionmethod; +// -------------------------------------- + +// operator implicit +function operator implicit(n: set of integer): set of byte; extensionmethod; begin foreach var x in n._hs do if (x >= byte.MinValue) and (x <= byte.MaxValue) then @@ -475,7 +479,7 @@ begin else raise new System.ArgumentException(GetTranslation(OUT_OF_TYPE_RANGE_IN_SET_ASSIGNMENT)); end; -function operator implicit(n: NewSet): NewSet; extensionmethod; +function operator implicit(n: set of integer): set of shortint; extensionmethod; begin foreach var x in n._hs do if (x >= shortint.MinValue) and (x <= shortint.MaxValue) then @@ -483,7 +487,7 @@ begin else raise new System.ArgumentException(GetTranslation(OUT_OF_TYPE_RANGE_IN_SET_ASSIGNMENT)); end; -function operator implicit(n: NewSet): NewSet; extensionmethod; +function operator implicit(n: set of integer): set of smallint; extensionmethod; begin foreach var x in n._hs do if (x >= smallint.MinValue) and (x <= smallint.MaxValue) then @@ -491,7 +495,7 @@ begin else raise new System.ArgumentException(GetTranslation(OUT_OF_TYPE_RANGE_IN_SET_ASSIGNMENT)); end; -function operator implicit(n: NewSet): NewSet; extensionmethod; +function operator implicit(n: set of integer): set of word; extensionmethod; begin foreach var x in n._hs do if (x >= word.MinValue) and (x <= word.MaxValue) then @@ -499,7 +503,7 @@ begin else raise new System.ArgumentException(GetTranslation(OUT_OF_TYPE_RANGE_IN_SET_ASSIGNMENT)); end; -function operator implicit(n: NewSet): NewSet; extensionmethod; +function operator implicit(n: set of integer): set of longword; extensionmethod; begin foreach var x in n._hs do if (x >= longword.MinValue) and (x <= longword.MaxValue) then @@ -507,13 +511,13 @@ begin else raise new System.ArgumentException(GetTranslation(OUT_OF_TYPE_RANGE_IN_SET_ASSIGNMENT)); end; -function operator implicit(n: NewSet): NewSet; extensionmethod; +function operator implicit(n: set of integer): set of int64; extensionmethod; begin foreach var x in n._hs do Result._hs.Add(x) end; -function operator implicit(n: NewSet): NewSet; extensionmethod; +function operator implicit(n: set of integer): set of uint64; extensionmethod; begin foreach var x in n._hs do if x >= 0 then @@ -521,15 +525,81 @@ begin else raise new System.ArgumentException(GetTranslation(OUT_OF_TYPE_RANGE_IN_SET_ASSIGNMENT)); end; -function NSToInts(ns: NewSet) := ns._hs.Select(x -> integer(x)); -function NSToInts(ns: NewSet) := ns._hs.Select(x -> integer(x)); -function NSToInts(ns: NewSet) := ns._hs.Select(x -> integer(x)); -function NSToInts(ns: NewSet) := ns._hs.Select(x -> integer(x)); -//function NSToInts(ns: NewSet) := ns._hs.Select(x -> integer(x)); -//function NSToInts(ns: NewSet) := ns._hs.Select(x -> integer(x)); -function NSToInts64(ns: NewSet) := ns._hs.Select(x -> int64(x)); -function NSToInts64(ns: NewSet) := ns._hs.Select(x -> int64(x)); -function NSToBytes(ns: NewSet): sequence of byte; +function operator implicit(a: set of integer): set of BigInteger; extensionmethod; +begin + foreach var x in a do + Result._hs.Add(x); +end; + +//-- operator implicit array of integer -> set of целое +function operator implicit(n: array of integer): set of byte; extensionmethod; +begin + foreach var x in n do + if (x >= byte.MinValue) and (x <= byte.MaxValue) then + Result._hs.Add(x) + else raise new System.ArgumentException(GetTranslation(OUT_OF_TYPE_RANGE_IN_SET_ASSIGNMENT)); +end; + +function operator implicit(n: array of integer): set of shortint; extensionmethod; +begin + foreach var x in n do + if (x >= shortint.MinValue) and (x <= shortint.MaxValue) then + Result._hs.Add(x) + else raise new System.ArgumentException(GetTranslation(OUT_OF_TYPE_RANGE_IN_SET_ASSIGNMENT)); +end; + +function operator implicit(n: array of integer): set of smallint; extensionmethod; +begin + foreach var x in n do + if (x >= smallint.MinValue) and (x <= smallint.MaxValue) then + Result._hs.Add(x) + else raise new System.ArgumentException(GetTranslation(OUT_OF_TYPE_RANGE_IN_SET_ASSIGNMENT)); +end; + +function operator implicit(n: array of integer): set of word; extensionmethod; +begin + foreach var x in n do + if (x >= word.MinValue) and (x <= word.MaxValue) then + Result._hs.Add(x) + else raise new System.ArgumentException(GetTranslation(OUT_OF_TYPE_RANGE_IN_SET_ASSIGNMENT)); +end; + +function operator implicit(n: array of integer): set of longword; extensionmethod; +begin + foreach var x in n do + if (x >= longword.MinValue) and (x <= longword.MaxValue) then + Result._hs.Add(x) + else raise new System.ArgumentException(GetTranslation(OUT_OF_TYPE_RANGE_IN_SET_ASSIGNMENT)); +end; + +function operator implicit(a: array of integer): set of int64; extensionmethod; +begin + foreach var x in a do + Result._hs.Add(x); +end; + +function operator implicit(a: array of integer): set of uint64; extensionmethod; +begin + foreach var x in a do + if x >= 0 then + Result._hs.Add(x) + else raise new System.ArgumentException(GetTranslation(OUT_OF_TYPE_RANGE_IN_SET_ASSIGNMENT)); +end; + +function operator implicit(a: array of integer): set of BigInteger; extensionmethod; +begin + foreach var x in a do + Result._hs.Add(x); +end; + +function NSToInts(ns: set of byte) := ns._hs.Select(x -> integer(x)); +function NSToInts(ns: set of shortint) := ns._hs.Select(x -> integer(x)); +function NSToInts(ns: set of smallint) := ns._hs.Select(x -> integer(x)); +function NSToInts(ns: set of word) := ns._hs.Select(x -> integer(x)); +function NSToInts64(ns: set of byte) := ns._hs.Select(x -> int64(x)); +function NSToInts64(ns: set of integer) := ns._hs.Select(x -> int64(x)); + +function NSToBytes(ns: set of integer): sequence of byte; begin var res := new List; foreach var x in ns._hs do @@ -539,7 +609,7 @@ begin Result := res; end; -function NSToBytes(ns: NewSet): sequence of byte; +function NSToBytes(ns: set of int64): sequence of byte; begin var res := new List; foreach var x in ns._hs do @@ -549,184 +619,455 @@ begin Result := res; end; -// Надо set of integer со всеми -function operator=(a: NewSet; b: NewSet); extensionmethod := a.hs.SetEquals(NSToInts(b)); -function operator=(a: NewSet; b: NewSet): boolean; extensionmethod := b = a; -function operator=(a: NewSet; b: NewSet); extensionmethod := a.hs.SetEquals(NSToInts(b)); -function operator=(a: NewSet; b: NewSet): boolean; extensionmethod := b = a; -function operator=(a: NewSet; b: NewSet); extensionmethod := a.hs.SetEquals(NSToInts(b)); -function operator=(a: NewSet; b: NewSet): boolean; extensionmethod := b = a; -function operator=(a: NewSet; b: NewSet); extensionmethod := a.hs.SetEquals(NSToInts(b)); -function operator=(a: NewSet; b: NewSet): boolean; extensionmethod := b = a; +// operator= для set +// set of integer сравнивается со всеми +function operator=(a: set of integer; b: set of byte); extensionmethod + := (a.Count = b.Count) and b.All(x -> x in a); // x в меньшем диапазоне, поэтому x in a работает верно +function operator=(a: set of byte; b: set of integer): boolean; extensionmethod + := b = a; +function operator=(a: set of integer; b: set of shortint); extensionmethod + := (a.Count = b.Count) and b.All(x -> x in a); +function operator=(a: set of shortint; b: set of integer): boolean; extensionmethod + := b = a; +function operator=(a: set of integer; b: set of smallint); extensionmethod + := (a.Count = b.Count) and b.All(x -> x in a); +function operator=(a: set of smallint; b: set of integer): boolean; extensionmethod + := b = a; +function operator=(a: set of integer; b: set of word); extensionmethod + := (a.Count = b.Count) and b.All(x -> x in a); +function operator=(a: set of word; b: set of integer): boolean; extensionmethod + := b = a; // В этом случае integer и longword не вкладываются друг в друга -function operator=(a: NewSet; b: NewSet): boolean; extensionmethod; -begin - var hsInt64: HashSet; - hsInt64 := new HashSet(b.hs.Select(x -> int64(x))); - Result := hsInt64.SetEquals(a.hs.Select(x -> int64(x))); -end; +function operator=(a: set of integer; b: set of longword): boolean; extensionmethod + := (a.Count = b.Count) and a.All(x -> x >= 0) and a.All(x -> x in b); +function operator=(a: set of longword; b: set of integer): boolean; extensionmethod + := b = a; -function operator=(a: NewSet; b: NewSet): boolean; extensionmethod := b = a; -function operator=(a: NewSet; b: NewSet); extensionmethod := a.hs.SetEquals(NSToInts64(b)); -function operator=(a: NewSet; b: NewSet): boolean; extensionmethod := b = a; +function operator=(a: set of int64; b: set of integer); extensionmethod + := (a.Count = b.Count) and b.All(x -> x in a); +function operator=(a: set of integer; b: set of int64): boolean; extensionmethod + := b = a; // Здесь оба типа нельзя расширить до общего типа, и есть проблема -function operator=(a: NewSet; b: NewSet): boolean; extensionmethod; +function operator=(a: set of integer; b: set of uint64): boolean; extensionmethod + := (a.Count = b.Count) and a.All(x -> x >= 0) and a.All(x -> x in b); +function operator=(a: set of uint64; b: set of integer): boolean; extensionmethod := b = a; + + +// arrays = sets +function operator=(a: array of integer; b: set of byte); extensionmethod + := a.ToSet = b; +function operator=(a: set of byte; b: array of integer): boolean; extensionmethod := b = a; +function operator=(a: array of integer; b: set of shortint); extensionmethod + := a.ToSet = b; +function operator=(a: set of shortint; b: array of integer): boolean; extensionmethod := b = a; +function operator=(a: array of integer; b: set of smallint); extensionmethod + := a.ToSet = b; +function operator=(a: set of smallint; b: array of integer): boolean; extensionmethod := b = a; +function operator=(a: array of integer; b: set of word); extensionmethod + := a.ToSet = b; +function operator=(a: set of word; b: array of integer): boolean; extensionmethod := b = a; +function operator=(a: array of integer; b: set of longword): boolean; extensionmethod + := a.ToSet = b; +function operator=(a: set of longword; b: array of integer): boolean; extensionmethod := b = a; +function operator=(a: array of integer; b: set of int64): boolean; extensionmethod + := a.ToSet = b; +function operator=(a: set of int64; b: array of integer); extensionmethod := b = a; +function operator=(a: array of integer; b: set of uint64): boolean; extensionmethod + := a.ToSet = b; +function operator=(a: set of uint64; b: array of integer): boolean; extensionmethod := b = a; +function operator=(a: array of integer; b: set of integer); extensionmethod + := (a.Count = b.Count) and a.All(x -> x in b); +function operator=(a: set of integer; b: array of integer): boolean; extensionmethod := b = a; + +// operator<> для set +function operator<>(a: set of integer; b: set of byte); extensionmethod := not(a = b); +function operator<>(a: set of byte; b: set of integer); extensionmethod := not(a = b); +function operator<>(a: set of integer; b: set of shortint); extensionmethod := not(a = b); +function operator<>(a: set of shortint; b: set of integer); extensionmethod := not(a = b); +function operator<>(a: set of integer; b: set of smallint); extensionmethod := not(a = b); +function operator<>(a: set of smallint; b: set of integer); extensionmethod := not(a = b); +function operator<>(a: set of integer; b: set of word); extensionmethod := not(a = b); +function operator<>(a: set of word; b: set of integer); extensionmethod := not(a = b); +function operator<>(a: set of integer; b: set of longword); extensionmethod := not(a = b); +function operator<>(a: set of longword; b: set of integer); extensionmethod := not(a = b); +function operator<>(a: set of integer; b: set of int64); extensionmethod := not(a = b); +function operator<>(a: set of int64; b: set of integer); extensionmethod := not(a = b); +function operator<>(a: set of integer; b: set of uint64); extensionmethod := not(a = b); +function operator<>(a: set of uint64; b: set of integer); extensionmethod := not(a = b); + +// set<>array +function operator<>(a: array of integer; b: set of byte); extensionmethod := not(a = b); +function operator<>(a: set of byte; b: array of integer); extensionmethod := not(a = b); +function operator<>(a: array of integer; b: set of shortint); extensionmethod := not(a = b); +function operator<>(a: set of shortint; b: array of integer); extensionmethod := not(a = b); +function operator<>(a: array of integer; b: set of smallint); extensionmethod := not(a = b); +function operator<>(a: set of smallint; b: array of integer); extensionmethod := not(a = b); +function operator<>(a: array of integer; b: set of word); extensionmethod := not(a = b); +function operator<>(a: set of word; b: array of integer); extensionmethod := not(a = b); +function operator<>(a: array of integer; b: set of longword); extensionmethod := not(a = b); +function operator<>(a: set of longword; b: array of integer); extensionmethod := not(a = b); +function operator<>(a: array of integer; b: set of int64); extensionmethod := not(a = b); +function operator<>(a: set of int64; b: array of integer); extensionmethod := not(a = b); +function operator<>(a: array of integer; b: set of uint64); extensionmethod := not(a = b); +function operator<>(a: set of uint64; b: array of integer); extensionmethod := not(a = b); +function operator<>(a: array of integer; b: set of integer); extensionmethod := not(a = b); +function operator<>(a: set of integer; b: array of integer); extensionmethod := not(a = b); + +// operator< для set +function operator<(a: set of integer; b: set of byte); extensionmethod + := (a.Count < b.Count) and a.All(x -> (x >= 0) and (x <= byte.MaxValue) and (x in b)); +function operator<(a: set of byte; b: set of integer); extensionmethod + := (a.Count < b.Count) and a.All(x -> x in b); +function operator<(a: set of integer; b: set of int64); extensionmethod + := (a.Count < b.Count) and a.All(x -> x in b); +function operator<(a: set of int64; b: set of integer); extensionmethod + := (a.Count < b.Count) and a.All(x -> (x >= 0) and (x <= byte.MaxValue) and (x in b)); + +// set < array +function operator<(a: array of integer; b: set of byte); extensionmethod + := a.ToSet < b; +function operator<(a: set of byte; b: array of integer); extensionmethod + := a < b.ToSet; +function operator<(a: array of integer; b: set of int64); extensionmethod + := a.ToSet < b; +function operator<(a: set of int64; b: array of integer); extensionmethod + := a < b.ToSet; +function operator<(a: array of integer; b: set of integer); extensionmethod + := (a.Count < b.Count) and a.All(x -> x in b); +function operator<(a: set of integer; b: array of integer); extensionmethod + := (a.Count < b.Count) and a.All(x -> x in b); + +// operator> для set +function operator>(a: set of integer; b: set of byte); extensionmethod + := b < a; +function operator>(a: set of byte; b: set of integer); extensionmethod + := b < a; +function operator>(a: set of integer; b: set of int64); extensionmethod + := b < a; +function operator>(a: set of int64; b: set of integer); extensionmethod + := b < a; + +// set > array +function operator>(a: array of integer; b: set of byte); extensionmethod + := b < a; +function operator>(a: set of byte; b: array of integer); extensionmethod + := b < a; +function operator>(a: array of integer; b: set of int64); extensionmethod + := b < a; +function operator>(a: set of int64; b: array of integer); extensionmethod + := b < a; +function operator>(a: array of integer; b: set of integer); extensionmethod + := b < a; +function operator>(a: set of integer; b: array of integer); extensionmethod + := b < a; + +// operator<= для set - доделать!!! +function operator<=(a: set of integer; b: set of byte); extensionmethod + := (a.Count <= b.Count) and a.All(x -> (x >= 0) and (x <= byte.MaxValue) and (x in b)); +function operator<=(a: set of byte; b: set of integer); extensionmethod + := (a.Count <= b.Count) and a.All(x -> x in b); +function operator<=(a: set of int64; b: set of integer); extensionmethod + := (a.Count <= b.Count) and a.All(x -> x in b); +function operator<=(a: set of integer; b: set of int64); extensionmethod + := (a.Count <= b.Count) and a.All(x -> (x >= 0) and (x <= byte.MaxValue) and (x in b)); + +// set <= array +function operator<=(a: array of integer; b: set of byte); extensionmethod + := a.ToSet <= b; +function operator<=(a: set of byte; b: array of integer); extensionmethod + := a <= b.ToSet; +function operator<=(a: array of integer; b: set of int64); extensionmethod + := a.ToSet <= b; +function operator<=(a: set of int64; b: array of integer); extensionmethod + := a <= b.ToSet; +function operator<=(a: array of integer; b: set of integer); extensionmethod + := (a.Count <= b.Count) and a.All(x -> x in b); +function operator<=(a: set of integer; b: array of integer); extensionmethod + := (a.Count <= b.Count) and a.All(x -> x in b); + + +// operator>= для set +function operator>=(a: set of integer; b: set of byte); extensionmethod + := b <= a; +function operator>=(a: set of byte; b: set of integer); extensionmethod + := b <= a; +function operator>=(a: set of int64; b: set of integer); extensionmethod + := b <= a; +function operator>=(a: set of integer; b: set of int64); extensionmethod + := b <= a; + +// set >= array +function operator>=(a: array of integer; b: set of byte); extensionmethod + := b <= a; +function operator>=(a: set of byte; b: array of integer); extensionmethod + := b <= a; +function operator>=(a: array of integer; b: set of int64); extensionmethod + := b <= a; +function operator>=(a: set of int64; b: array of integer); extensionmethod + := b <= a; +function operator>=(a: array of integer; b: set of integer); extensionmethod + := b <= a; +function operator>=(a: set of integer; b: array of integer); extensionmethod + := b <= a; + + +// set *= set +procedure operator*=(a: set of byte; b: set of integer); extensionmethod + := a *= NewSet&(b); +procedure operator*=(a: set of word; b: set of integer); extensionmethod + := a *= NewSet&(b); +procedure operator*=(a: set of shortint; b: set of integer); extensionmethod + := a *= NewSet&(b); +procedure operator*=(a: set of smallint; b: set of integer); extensionmethod + := a *= NewSet&(b); +procedure operator*=(a: set of longword; b: set of integer); extensionmethod + := a *= NewSet&(b); +procedure operator*=(a: set of int64; b: set of integer); extensionmethod + := a *= NewSet&(b); +procedure operator*=(a: set of uint64; b: set of integer); extensionmethod + := a *= NewSet&(b); + +// set *= array +procedure operator*=(a: set of byte; b: array of integer); extensionmethod + := a *= NewSet&(b); +procedure operator*=(a: set of word; b: array of integer); extensionmethod + := a *= NewSet&(b); +procedure operator*=(a: set of shortint; b: array of integer); extensionmethod + := a *= NewSet&(b); +procedure operator*=(a: set of smallint; b: array of integer); extensionmethod + := a *= NewSet&(b); +procedure operator*=(a: set of longword; b: array of integer); extensionmethod + := a *= NewSet&(b); +procedure operator*=(a: set of int64; b: array of integer); extensionmethod + := a *= NewSet&(b); +procedure operator*=(a: set of uint64; b: array of integer); extensionmethod + := a *= NewSet&(b); + + +// set += set +procedure operator+=(a: set of byte; b: set of integer); extensionmethod + := a += NewSet&(b); +procedure operator+=(a: set of word; b: set of integer); extensionmethod + := a += NewSet&(b); +procedure operator+=(a: set of shortint; b: set of integer); extensionmethod + := a += NewSet&(b); +procedure operator+=(a: set of smallint; b: set of integer); extensionmethod + := a += NewSet&(b); +procedure operator+=(a: set of longword; b: set of integer); extensionmethod + := a += NewSet&(b); +procedure operator+=(a: set of int64; b: set of integer); extensionmethod + := a += NewSet&(b); +procedure operator+=(a: set of uint64; b: set of integer); extensionmethod + := a += NewSet&(b); + +// set += array +procedure operator+=(a: set of byte; b: array of integer); extensionmethod + := a += NewSet&(b); +procedure operator+=(a: set of word; b: array of integer); extensionmethod + := a += NewSet&(b); +procedure operator+=(a: set of shortint; b: array of integer); extensionmethod + := a += NewSet&(b); +procedure operator+=(a: set of smallint; b: array of integer); extensionmethod + := a += NewSet&(b); +procedure operator+=(a: set of longword; b: array of integer); extensionmethod + := a += NewSet&(b); +procedure operator+=(a: set of int64; b: array of integer); extensionmethod + := a += NewSet&(b); +procedure operator+=(a: set of uint64; b: array of integer); extensionmethod + := a += NewSet&(b); + +// set -= set +procedure operator-=(a: set of byte; b: set of integer); extensionmethod + := a -= NewSet&(b); +procedure operator-=(a: set of word; b: set of integer); extensionmethod + := a -= NewSet&(b); +procedure operator-=(a: set of shortint; b: set of integer); extensionmethod + := a -= NewSet&(b); +procedure operator-=(a: set of smallint; b: set of integer); extensionmethod + := a -= NewSet&(b); +procedure operator-=(a: set of longword; b: set of integer); extensionmethod + := a -= NewSet&(b); +procedure operator-=(a: set of int64; b: set of integer); extensionmethod + := a -= NewSet&(b); +procedure operator-=(a: set of uint64; b: set of integer); extensionmethod + := a -= NewSet&(b); + +// set -= array +procedure operator-=(a: set of byte; b: array of integer); extensionmethod + := a -= NewSet&(b); +procedure operator-=(a: set of word; b: array of integer); extensionmethod + := a -= NewSet&(b); +procedure operator-=(a: set of shortint; b: array of integer); extensionmethod + := a -= NewSet&(b); +procedure operator-=(a: set of smallint; b: array of integer); extensionmethod + := a -= NewSet&(b); +procedure operator-=(a: set of longword; b: array of integer); extensionmethod + := a -= NewSet&(b); +procedure operator-=(a: set of int64; b: array of integer); extensionmethod + := a -= NewSet&(b); +procedure operator-=(a: set of uint64; b: array of integer); extensionmethod + := a -= NewSet&(b); + +// Один из операндов должен быть set of integer (array of integer) +// operator* sets +function operator*(a: set of integer; b: set of byte): set of integer; extensionmethod; begin - Result := True; - foreach var x in a do - if x not in b then - begin - Result := False; - exit - end; -end; - -function operator=(a: NewSet; b: NewSet): boolean; extensionmethod := b = a; - - -function operator<>(a: NewSet; b: NewSet); extensionmethod := not(a = b); -function operator<>(a: NewSet; b: NewSet); extensionmethod := not(a = b); -function operator<>(a: NewSet; b: NewSet); extensionmethod := not(a = b); -function operator<>(a: NewSet; b: NewSet); extensionmethod := not(a = b); -function operator<>(a: NewSet; b: NewSet); extensionmethod := not(a = b); -function operator<>(a: NewSet; b: NewSet); extensionmethod := not(a = b); -function operator<>(a: NewSet; b: NewSet); extensionmethod := not(a = b); -function operator<>(a: NewSet; b: NewSet); extensionmethod := not(a = b); -function operator<>(a: NewSet; b: NewSet); extensionmethod := not(a = b); -function operator<>(a: NewSet; b: NewSet); extensionmethod := not(a = b); -function operator<>(a: NewSet; b: NewSet); extensionmethod := not(a = b); -function operator<>(a: NewSet; b: NewSet); extensionmethod := not(a = b); -function operator<>(a: NewSet; b: NewSet); extensionmethod := not(a = b); -function operator<>(a: NewSet; b: NewSet); extensionmethod := not(a = b); - -(*function operator<(a: NewSet; b: NewSet); extensionmethod := a.hs.IsProperSubsetOf(NSToInts(b)); -function operator<(a: NewSet; b: NewSet); extensionmethod := b > a; -function operator<(a: NewSet; b: NewSet); extensionmethod := a.hs.IsProperSubsetOf(NSToInts64(b)); -function operator<(a: NewSet; b: NewSet); extensionmethod := b > a; -*) -function operator>(a: NewSet; b: NewSet); extensionmethod := a.hs.IsProperSupersetOf(NSToInts(b)); -function operator>(a: NewSet; b: NewSet); extensionmethod := b < a; -function operator>(a: NewSet; b: NewSet); extensionmethod := a.hs.IsProperSupersetOf(NSToInts64(b)); -function operator>(a: NewSet; b: NewSet); extensionmethod := b < a; - -function operator<=(a: NewSet; b: NewSet); extensionmethod := a.hs.IsSubsetOf(NSToInts(b)); -function operator<=(a: NewSet; b: NewSet); extensionmethod := b >= a; -function operator<=(a: NewSet; b: NewSet); extensionmethod := a.hs.IsSubsetOf(NSToInts64(b)); -function operator<=(a: NewSet; b: NewSet); extensionmethod := b >= a; - -function operator>=(a: NewSet; b: NewSet); extensionmethod := a.hs.IsSupersetOf(NSToInts(b)); -function operator>=(a: NewSet; b: NewSet); extensionmethod := b <= a; -function operator>=(a: NewSet; b: NewSet); extensionmethod := a.hs.IsSupersetOf(NSToInts64(b)); -function operator>=(a: NewSet; b: NewSet); extensionmethod := b <= a; - -procedure operator*=(var a: NewSet; b: NewSet); extensionmethod := a.hs.IntersectWith(NSToBytes(b)); -procedure operator*=(var a: NewSet; b: NewSet); extensionmethod := a.hs.IntersectWith(NSToInts(b)); -procedure operator*=(var a: NewSet; b: NewSet); extensionmethod := a.hs.IntersectWith(NSToInts64(b)); -//procedure operator*=(var a: NewSet; b: NewSet); extensionmethod := a.hs.IntersectWith(NSToInts(b)); - -//procedure operator*=(var a: NewSet; b: NewSet); extensionmethod := a.hs.IntersectWith(NSToBytes(b)); -//procedure operator*=(var a: NewSet; b: NewSet); extensionmethod := a.hs.IntersectWith(NSToInts64(b)); - -//procedure operator+=(var a: NewSet; another: NewSet); extensionmethod := a.hs.UnionWith(another.hs); - -procedure operator+=(a: NewSet; b: NewSet); extensionmethod; -begin - var x := a.hs; - var bt := NSToBytes(b); - a.hs.UnionWith(bt); -end; - -procedure operator+=(a: NewSet; b: NewSet); extensionmethod := a.hs.UnionWith(NSToInts(b)); -procedure operator+=(a: NewSet; b: NewSet); extensionmethod := a.hs.UnionWith(NSToInts64(b)); -//procedure operator+=(a: NewSet; b: NewSet); extensionmethod := a.hs.UnionWith(NSToInts(b)); -procedure operator+=(a: NewSet; b: NewSet); extensionmethod := a.hs.UnionWith(NSToBytes(b)); -procedure operator+=(a: NewSet; b: NewSet); extensionmethod := a.hs.UnionWith(NSToInts64(b)); - -procedure operator-=(a: NewSet; b: NewSet); extensionmethod := a.hs.ExceptWith(NSToBytes(b)); -procedure operator-=(a: NewSet; b: NewSet); extensionmethod := a.hs.ExceptWith(NSToInts(b)); -procedure operator-=(a: NewSet; b: NewSet); extensionmethod := a.hs.ExceptWith(NSToInts64(b)); -//procedure operator-=(a: NewSet; b: NewSet); extensionmethod := a.hs.ExceptWith(NSToInts(b)); - - -// Нет операции между set of byte и set of int64. Один из операндов должен быть set of integer -function operator*(a: NewSet; b: NewSet): NewSet; extensionmethod; -begin - Result += a; Result *= b + Result := a; + Result.hs.IntersectWith(b.Select(x -> integer(x))); end; -function operator*(a: NewSet; b: NewSet): NewSet; extensionmethod; +function operator*(a: set of byte; b: set of integer): set of integer; extensionmethod + := b * a; + +function operator*(a: set of integer; b: set of int64): set of int64; extensionmethod; begin - Result += a; Result *= b + Result := b; + Result.hs.IntersectWith(a.Select(x -> int64(x))); end; -function operator*(a: NewSet; b: NewSet): NewSet; extensionmethod; +function operator*(a: set of int64; b: set of integer): set of int64; extensionmethod + := b * a; + +// set * array +function operator*(a: array of integer; b: set of byte): set of integer; extensionmethod; begin - Result += a; Result *= b + Result.hs.UnionWith(a); + Result.hs.IntersectWith(b.Select(x -> integer(x))); end; -function operator*(a: NewSet; b: NewSet): NewSet; extensionmethod; +function operator*(a: set of byte; b: array of integer): set of integer; extensionmethod + := b * a; + +function operator*(a: array of integer; b: set of int64): set of int64; extensionmethod; begin - Result += a; Result *= b -end; -//----- - -function operator+(a: NewSet; b: NewSet): NewSet; extensionmethod; -begin - Result += a; Result += b + Result.hs.UnionWith(b); + Result.hs.IntersectWith(a.Select(x -> int64(x))); end; -function operator+(a: NewSet; b: NewSet): NewSet; extensionmethod; +function operator*(a: set of int64; b: array of integer): set of int64; extensionmethod + := b * a; + +function operator*(a: array of integer; b: set of integer): set of integer; extensionmethod; begin - Result += a; Result += b + Result.hs.UnionWith(a); + Result.hs.IntersectWith(b); end; -function operator+(a: NewSet; b: NewSet): NewSet; extensionmethod; +function operator*(a: set of integer; b: array of integer): set of integer; extensionmethod + := b * a; + + +// operator+ sets +function operator+(a: set of integer; b: set of byte): set of integer; extensionmethod; begin - Result += a; Result += b + Result.hs.UnionWith(a); + Result.hs.UnionWith(b.Select(x -> integer(x))); end; -function operator+(a: NewSet; b: NewSet): NewSet; extensionmethod; +function operator+(a: set of byte; b: set of integer): set of integer; extensionmethod + := b * a; + +function operator+(a: set of integer; b: set of int64): set of int64; extensionmethod; begin - Result += a; Result += b + Result.hs.UnionWith(b); + Result.hs.UnionWith(a.Select(x -> int64(x))); end; -//----- -function operator-(a: NewSet; b: NewSet): NewSet; extensionmethod; +function operator+(a: set of int64; b: set of integer): set of int64; extensionmethod + := b * a; + +// set + array +function operator+(a: array of integer; b: set of byte): set of integer; extensionmethod; begin - Result += a; Result -= b + Result.hs.UnionWith(a); + Result.hs.UnionWith(b.Select(x -> integer(x))); end; -function operator-(a: NewSet; b: NewSet): NewSet; extensionmethod; +function operator+(a: set of byte; b: array of integer): set of integer; extensionmethod + := b * a; + +function operator+(a: array of integer; b: set of int64): set of int64; extensionmethod; begin - Result += a; Result -= b + Result.hs.UnionWith(b); + Result.hs.UnionWith(a.Select(x -> int64(x))); end; -function operator-(a: NewSet; b: NewSet): NewSet; extensionmethod; +function operator+(a: set of int64; b: array of integer): set of int64; extensionmethod + := b * a; + +function operator+(a: set of integer; b: array of integer): set of integer; extensionmethod; begin - Result += a; Result -= b + Result.hs.UnionWith(a); + Result.hs.UnionWith(b); end; -function operator-(a: NewSet; b: NewSet): NewSet; extensionmethod; +function operator+(a: array of integer; b: set of integer): set of integer; extensionmethod + := b * a; + + +// operator- sets +function operator-(a: set of integer; b: set of byte): set of integer; extensionmethod; begin - Result += a; Result -= b + Result.hs.UnionWith(a); + Result.hs.ExceptWith(b.Select(x -> integer(x))); end; -// и для массивов столько же -(*function operator=(a: NewSet; b: array of byte); extensionmethod := a._hs.SetEquals(b.Select(x -> integer(x))); -function operator=(a: array of byte; b: NewSet): boolean; extensionmethod := b = a; -function operator=(a: array of int64; b: NewSet); extensionmethod := a.ToHashSet.SetEquals(NSToInts64(b)); -function operator=(a: NewSet; b: array of int64): boolean; extensionmethod := b = a; -*) -//function operator=(a: NewSet; b: NewSet); extensionmethod := a._hs.SetEquals(NSToInts64(b)); -//function operator=(a: NewSet; b: NewSet): boolean; extensionmethod := a = b; +function operator-(a: set of byte; b: set of integer): set of integer; extensionmethod; +begin + Result.hs.UnionWith(a.Select(x -> integer(x))); + Result.hs.ExceptWith(b); +end; -// Следующие функции предназначены для сравнения массива целых со множеством. -// Массив должен интерпретироваться как множество -// Не пойму - что использовать - эту строку или предыдущие. Все типы массивов сравнивать с NewSet -// или наоборот все типы множеств - с array of integer -function operator=(a: NewSet; b: array of integer): boolean; extensionmethod := NSToInts(a).ToHashSet.SetEquals(b); +function operator-(a: set of integer; b: set of int64): set of int64; extensionmethod; +begin + Result.hs.UnionWith(a.Select(x -> int64(x))); + Result.hs.ExceptWith(b); +end; + +function operator-(a: set of int64; b: set of integer): set of int64; extensionmethod; +begin + Result.hs.UnionWith(a); + Result.hs.ExceptWith(b.Select(x -> int64(x))); +end; + +// set - array +function operator-(a: array of integer; b: set of byte): set of integer; extensionmethod; +begin + Result.hs.UnionWith(a); + Result.hs.ExceptWith(b.Select(x -> integer(x))); +end; + +function operator-(a: set of byte; b: array of integer): set of integer; extensionmethod; +begin + Result.hs.UnionWith(a.Select(x -> integer(x))); + Result.hs.ExceptWith(b); +end; + +function operator-(a: array of integer; b: set of int64): set of int64; extensionmethod; +begin + Result.hs.UnionWith(a.Select(x -> int64(x))); + Result.hs.ExceptWith(b); +end; + +function operator-(a: set of int64; b: array of integer): set of int64; extensionmethod; +begin + Result.hs.UnionWith(a); + Result.hs.ExceptWith(b.Select(x -> int64(x))); +end; + +function operator-(a: array of integer; b: set of integer): set of integer; extensionmethod; +begin + Result.hs.UnionWith(a); + Result.hs.ExceptWith(b); +end; + +function operator-(a: set of integer; b: array of integer): set of integer; extensionmethod; +begin + Result.hs.UnionWith(a); + Result.hs.ExceptWith(b); +end; var __initialized: boolean; diff --git a/TestSuite/CompilationSamples/PABCSystem.pas b/TestSuite/CompilationSamples/PABCSystem.pas index 8aa74d1fa..9c4d637f5 100644 --- a/TestSuite/CompilationSamples/PABCSystem.pas +++ b/TestSuite/CompilationSamples/PABCSystem.pas @@ -504,10 +504,6 @@ type end; function GetEnumerator: IEnumerator := hs.GetEnumerator; function System.Collections.IEnumerable.GetEnumerator: System.Collections.IEnumerator := GetEnumerator; - static function operator implicit(a: array of T): NewSet; - begin - Result._hs := new HashSet(a); - end; /// Преобразовать к строковому представлению function ToString: string; override; /// Количество элементов в множестве @@ -555,6 +551,10 @@ type begin Result.hs.UnionWith(ns); end; + static function operator implicit(a: array of T): NewSet; + begin + Result._hs := new HashSet(a); + end; static function operator implicit(ns: NewSetEmpty): NewSet; begin end; static function operator:=(var s: NewSet; st: NewSet): NewSet; // Эту функцию обязательно здесь определять @@ -2699,7 +2699,7 @@ function HSetInt(params a: array of integer): HashSet; /// Возвращает множество на базе хеш таблицы, заполненное строковыми значениями function HSetStr(params a: array of string): HashSet; /// Возвращает множество, заполненное указанными значениями -function SetOf(params a: array of T): HashSet; +function SetOf(params a: array of T): NewSet; /// Возвращает множество на базе бинарного дерева поиска, заполненное указанными значениями @@ -6097,8 +6097,10 @@ function HSet(a: IntRange): HashSet := new HashSet(a); function HSet(a: CharRange): HashSet := new HashSet(a); -function SetOf(params a: array of T): HashSet := new HashSet(a); - +function SetOf(params a: array of T): NewSet; +begin + Result._hs := new HashSet(a); +end; function Dict(params pairs: array of KeyValuePair): Dictionary; begin @@ -11188,9 +11190,9 @@ begin end; /// Возвращает множество по данной последовательности -function ToSet(Self: sequence of T): HashSet; extensionmethod; +function ToSet(Self: sequence of T): NewSet; extensionmethod; begin - Result := new HashSet(Self); + Result._hs := new HashSet(Self); end; /// Возвращает множество SortedSet по данной последовательности @@ -15067,14 +15069,6 @@ function operator>(Self: (T1, T2, T3, T4,T5,T6,T7); v: (T1 ///-- function operator>=(Self: (T1, T2, T3, T4,T5,T6,T7); v: (T1, T2, T3, T4,T5,T6,T7)); extensionmethod := CompareToTup5(Self, v) >= 0; -{ -///-- -function operator implicit(a: array of T): set of T; extensionmethod; -begin - foreach var x in a do - Include(Result,x); -end; -} {// Определяет, есть ли указанный элемент в массиве function Contains(self: array of T; x: T): boolean; extensionmethod; @@ -15482,60 +15476,7 @@ begin end end; -function operator implicit(a: set of integer): set of BigInteger; extensionmethod; -begin - foreach var x in a do - Result.Add(x); -end; - -//------------------ -function operator implicit(n: array of integer): set of byte; extensionmethod; -begin - foreach var x in n do - Result._hs.Add(x); -end; - -function operator implicit(n: array of integer): set of shortint; extensionmethod; -begin - foreach var x in n do - Result._hs.Add(x); -end; - -function operator implicit(n: array of integer): set of smallint; extensionmethod; -begin - foreach var x in n do - Result._hs.Add(x); -end; - -function operator implicit(n: array of integer): set of word; extensionmethod; -begin - foreach var x in n do - Result._hs.Add(x); -end; - -function operator implicit(n: array of integer): set of longword; extensionmethod; -begin - foreach var x in n do - Result._hs.Add(x); -end; - -function operator implicit(a: array of integer): set of int64; extensionmethod; -begin - foreach var x in a do - Result._hs.Add(x); -end; - -function operator implicit(a: array of integer): set of uint64; extensionmethod; -begin - foreach var x in a do - Result._hs.Add(x); -end; - -function operator implicit(a: array of integer): set of BigInteger; extensionmethod; -begin - foreach var x in a do - Result._hs.Add(x); -end; + //function operator implicit(ns: NewSetEmpty): NewSet; extensionmethod; begin end; @@ -15824,7 +15765,8 @@ begin end; try if (System.Environment.OSVersion.Version.Major >= 6) and (System.Environment.OSVersion.Version.Minor >= 2) then - System.Console.OutputEncoding := Encoding.UTF8; + System.Console.OutputEncoding := new System.Text.UTF8Encoding(false); + //System.Console.OutputEncoding := Encoding.UTF8; except end; rnd := new System.Random; diff --git a/bin/Lib/PABCExtensions.pas b/bin/Lib/PABCExtensions.pas index c8e509461..bd8b7be99 100644 --- a/bin/Lib/PABCExtensions.pas +++ b/bin/Lib/PABCExtensions.pas @@ -456,18 +456,22 @@ begin end; // Важнейший для новых множеств !!! -{procedure operator:=(var Self: NewSet; st: NewSet); extensionmethod; +{procedure operator:=(var Self: set of T>; st: set of T>); extensionmethod; begin Self._hs := new HashSet(st.hs); end;} -{procedure operator:=(var Self: NewSet; st: NewSetEmpty); extensionmethod; +{procedure operator:=(var Self: set of T>; st: NewSetEmpty); extensionmethod; begin Self._hs := new HashSet(); end;} +// -------------------------------------- // Extension-методы для новых множеств -function operator implicit(n: NewSet): NewSet; extensionmethod; +// -------------------------------------- + +// operator implicit +function operator implicit(n: set of integer): set of byte; extensionmethod; begin foreach var x in n._hs do if (x >= byte.MinValue) and (x <= byte.MaxValue) then @@ -475,7 +479,7 @@ begin else raise new System.ArgumentException(GetTranslation(OUT_OF_TYPE_RANGE_IN_SET_ASSIGNMENT)); end; -function operator implicit(n: NewSet): NewSet; extensionmethod; +function operator implicit(n: set of integer): set of shortint; extensionmethod; begin foreach var x in n._hs do if (x >= shortint.MinValue) and (x <= shortint.MaxValue) then @@ -483,7 +487,7 @@ begin else raise new System.ArgumentException(GetTranslation(OUT_OF_TYPE_RANGE_IN_SET_ASSIGNMENT)); end; -function operator implicit(n: NewSet): NewSet; extensionmethod; +function operator implicit(n: set of integer): set of smallint; extensionmethod; begin foreach var x in n._hs do if (x >= smallint.MinValue) and (x <= smallint.MaxValue) then @@ -491,7 +495,7 @@ begin else raise new System.ArgumentException(GetTranslation(OUT_OF_TYPE_RANGE_IN_SET_ASSIGNMENT)); end; -function operator implicit(n: NewSet): NewSet; extensionmethod; +function operator implicit(n: set of integer): set of word; extensionmethod; begin foreach var x in n._hs do if (x >= word.MinValue) and (x <= word.MaxValue) then @@ -499,7 +503,7 @@ begin else raise new System.ArgumentException(GetTranslation(OUT_OF_TYPE_RANGE_IN_SET_ASSIGNMENT)); end; -function operator implicit(n: NewSet): NewSet; extensionmethod; +function operator implicit(n: set of integer): set of longword; extensionmethod; begin foreach var x in n._hs do if (x >= longword.MinValue) and (x <= longword.MaxValue) then @@ -507,13 +511,13 @@ begin else raise new System.ArgumentException(GetTranslation(OUT_OF_TYPE_RANGE_IN_SET_ASSIGNMENT)); end; -function operator implicit(n: NewSet): NewSet; extensionmethod; +function operator implicit(n: set of integer): set of int64; extensionmethod; begin foreach var x in n._hs do Result._hs.Add(x) end; -function operator implicit(n: NewSet): NewSet; extensionmethod; +function operator implicit(n: set of integer): set of uint64; extensionmethod; begin foreach var x in n._hs do if x >= 0 then @@ -521,15 +525,81 @@ begin else raise new System.ArgumentException(GetTranslation(OUT_OF_TYPE_RANGE_IN_SET_ASSIGNMENT)); end; -function NSToInts(ns: NewSet) := ns._hs.Select(x -> integer(x)); -function NSToInts(ns: NewSet) := ns._hs.Select(x -> integer(x)); -function NSToInts(ns: NewSet) := ns._hs.Select(x -> integer(x)); -function NSToInts(ns: NewSet) := ns._hs.Select(x -> integer(x)); -//function NSToInts(ns: NewSet) := ns._hs.Select(x -> integer(x)); -//function NSToInts(ns: NewSet) := ns._hs.Select(x -> integer(x)); -function NSToInts64(ns: NewSet) := ns._hs.Select(x -> int64(x)); -function NSToInts64(ns: NewSet) := ns._hs.Select(x -> int64(x)); -function NSToBytes(ns: NewSet): sequence of byte; +function operator implicit(a: set of integer): set of BigInteger; extensionmethod; +begin + foreach var x in a do + Result._hs.Add(x); +end; + +//-- operator implicit array of integer -> set of целое +function operator implicit(n: array of integer): set of byte; extensionmethod; +begin + foreach var x in n do + if (x >= byte.MinValue) and (x <= byte.MaxValue) then + Result._hs.Add(x) + else raise new System.ArgumentException(GetTranslation(OUT_OF_TYPE_RANGE_IN_SET_ASSIGNMENT)); +end; + +function operator implicit(n: array of integer): set of shortint; extensionmethod; +begin + foreach var x in n do + if (x >= shortint.MinValue) and (x <= shortint.MaxValue) then + Result._hs.Add(x) + else raise new System.ArgumentException(GetTranslation(OUT_OF_TYPE_RANGE_IN_SET_ASSIGNMENT)); +end; + +function operator implicit(n: array of integer): set of smallint; extensionmethod; +begin + foreach var x in n do + if (x >= smallint.MinValue) and (x <= smallint.MaxValue) then + Result._hs.Add(x) + else raise new System.ArgumentException(GetTranslation(OUT_OF_TYPE_RANGE_IN_SET_ASSIGNMENT)); +end; + +function operator implicit(n: array of integer): set of word; extensionmethod; +begin + foreach var x in n do + if (x >= word.MinValue) and (x <= word.MaxValue) then + Result._hs.Add(x) + else raise new System.ArgumentException(GetTranslation(OUT_OF_TYPE_RANGE_IN_SET_ASSIGNMENT)); +end; + +function operator implicit(n: array of integer): set of longword; extensionmethod; +begin + foreach var x in n do + if (x >= longword.MinValue) and (x <= longword.MaxValue) then + Result._hs.Add(x) + else raise new System.ArgumentException(GetTranslation(OUT_OF_TYPE_RANGE_IN_SET_ASSIGNMENT)); +end; + +function operator implicit(a: array of integer): set of int64; extensionmethod; +begin + foreach var x in a do + Result._hs.Add(x); +end; + +function operator implicit(a: array of integer): set of uint64; extensionmethod; +begin + foreach var x in a do + if x >= 0 then + Result._hs.Add(x) + else raise new System.ArgumentException(GetTranslation(OUT_OF_TYPE_RANGE_IN_SET_ASSIGNMENT)); +end; + +function operator implicit(a: array of integer): set of BigInteger; extensionmethod; +begin + foreach var x in a do + Result._hs.Add(x); +end; + +function NSToInts(ns: set of byte) := ns._hs.Select(x -> integer(x)); +function NSToInts(ns: set of shortint) := ns._hs.Select(x -> integer(x)); +function NSToInts(ns: set of smallint) := ns._hs.Select(x -> integer(x)); +function NSToInts(ns: set of word) := ns._hs.Select(x -> integer(x)); +function NSToInts64(ns: set of byte) := ns._hs.Select(x -> int64(x)); +function NSToInts64(ns: set of integer) := ns._hs.Select(x -> int64(x)); + +function NSToBytes(ns: set of integer): sequence of byte; begin var res := new List; foreach var x in ns._hs do @@ -539,7 +609,7 @@ begin Result := res; end; -function NSToBytes(ns: NewSet): sequence of byte; +function NSToBytes(ns: set of int64): sequence of byte; begin var res := new List; foreach var x in ns._hs do @@ -549,184 +619,455 @@ begin Result := res; end; -// Надо set of integer со всеми -function operator=(a: NewSet; b: NewSet); extensionmethod := a.hs.SetEquals(NSToInts(b)); -function operator=(a: NewSet; b: NewSet): boolean; extensionmethod := b = a; -function operator=(a: NewSet; b: NewSet); extensionmethod := a.hs.SetEquals(NSToInts(b)); -function operator=(a: NewSet; b: NewSet): boolean; extensionmethod := b = a; -function operator=(a: NewSet; b: NewSet); extensionmethod := a.hs.SetEquals(NSToInts(b)); -function operator=(a: NewSet; b: NewSet): boolean; extensionmethod := b = a; -function operator=(a: NewSet; b: NewSet); extensionmethod := a.hs.SetEquals(NSToInts(b)); -function operator=(a: NewSet; b: NewSet): boolean; extensionmethod := b = a; +// operator= для set +// set of integer сравнивается со всеми +function operator=(a: set of integer; b: set of byte); extensionmethod + := (a.Count = b.Count) and b.All(x -> x in a); // x в меньшем диапазоне, поэтому x in a работает верно +function operator=(a: set of byte; b: set of integer): boolean; extensionmethod + := b = a; +function operator=(a: set of integer; b: set of shortint); extensionmethod + := (a.Count = b.Count) and b.All(x -> x in a); +function operator=(a: set of shortint; b: set of integer): boolean; extensionmethod + := b = a; +function operator=(a: set of integer; b: set of smallint); extensionmethod + := (a.Count = b.Count) and b.All(x -> x in a); +function operator=(a: set of smallint; b: set of integer): boolean; extensionmethod + := b = a; +function operator=(a: set of integer; b: set of word); extensionmethod + := (a.Count = b.Count) and b.All(x -> x in a); +function operator=(a: set of word; b: set of integer): boolean; extensionmethod + := b = a; // В этом случае integer и longword не вкладываются друг в друга -function operator=(a: NewSet; b: NewSet): boolean; extensionmethod; -begin - var hsInt64: HashSet; - hsInt64 := new HashSet(b.hs.Select(x -> int64(x))); - Result := hsInt64.SetEquals(a.hs.Select(x -> int64(x))); -end; +function operator=(a: set of integer; b: set of longword): boolean; extensionmethod + := (a.Count = b.Count) and a.All(x -> x >= 0) and a.All(x -> x in b); +function operator=(a: set of longword; b: set of integer): boolean; extensionmethod + := b = a; -function operator=(a: NewSet; b: NewSet): boolean; extensionmethod := b = a; -function operator=(a: NewSet; b: NewSet); extensionmethod := a.hs.SetEquals(NSToInts64(b)); -function operator=(a: NewSet; b: NewSet): boolean; extensionmethod := b = a; +function operator=(a: set of int64; b: set of integer); extensionmethod + := (a.Count = b.Count) and b.All(x -> x in a); +function operator=(a: set of integer; b: set of int64): boolean; extensionmethod + := b = a; // Здесь оба типа нельзя расширить до общего типа, и есть проблема -function operator=(a: NewSet; b: NewSet): boolean; extensionmethod; +function operator=(a: set of integer; b: set of uint64): boolean; extensionmethod + := (a.Count = b.Count) and a.All(x -> x >= 0) and a.All(x -> x in b); +function operator=(a: set of uint64; b: set of integer): boolean; extensionmethod := b = a; + + +// arrays = sets +function operator=(a: array of integer; b: set of byte); extensionmethod + := a.ToSet = b; +function operator=(a: set of byte; b: array of integer): boolean; extensionmethod := b = a; +function operator=(a: array of integer; b: set of shortint); extensionmethod + := a.ToSet = b; +function operator=(a: set of shortint; b: array of integer): boolean; extensionmethod := b = a; +function operator=(a: array of integer; b: set of smallint); extensionmethod + := a.ToSet = b; +function operator=(a: set of smallint; b: array of integer): boolean; extensionmethod := b = a; +function operator=(a: array of integer; b: set of word); extensionmethod + := a.ToSet = b; +function operator=(a: set of word; b: array of integer): boolean; extensionmethod := b = a; +function operator=(a: array of integer; b: set of longword): boolean; extensionmethod + := a.ToSet = b; +function operator=(a: set of longword; b: array of integer): boolean; extensionmethod := b = a; +function operator=(a: array of integer; b: set of int64): boolean; extensionmethod + := a.ToSet = b; +function operator=(a: set of int64; b: array of integer); extensionmethod := b = a; +function operator=(a: array of integer; b: set of uint64): boolean; extensionmethod + := a.ToSet = b; +function operator=(a: set of uint64; b: array of integer): boolean; extensionmethod := b = a; +function operator=(a: array of integer; b: set of integer); extensionmethod + := (a.Count = b.Count) and a.All(x -> x in b); +function operator=(a: set of integer; b: array of integer): boolean; extensionmethod := b = a; + +// operator<> для set +function operator<>(a: set of integer; b: set of byte); extensionmethod := not(a = b); +function operator<>(a: set of byte; b: set of integer); extensionmethod := not(a = b); +function operator<>(a: set of integer; b: set of shortint); extensionmethod := not(a = b); +function operator<>(a: set of shortint; b: set of integer); extensionmethod := not(a = b); +function operator<>(a: set of integer; b: set of smallint); extensionmethod := not(a = b); +function operator<>(a: set of smallint; b: set of integer); extensionmethod := not(a = b); +function operator<>(a: set of integer; b: set of word); extensionmethod := not(a = b); +function operator<>(a: set of word; b: set of integer); extensionmethod := not(a = b); +function operator<>(a: set of integer; b: set of longword); extensionmethod := not(a = b); +function operator<>(a: set of longword; b: set of integer); extensionmethod := not(a = b); +function operator<>(a: set of integer; b: set of int64); extensionmethod := not(a = b); +function operator<>(a: set of int64; b: set of integer); extensionmethod := not(a = b); +function operator<>(a: set of integer; b: set of uint64); extensionmethod := not(a = b); +function operator<>(a: set of uint64; b: set of integer); extensionmethod := not(a = b); + +// set<>array +function operator<>(a: array of integer; b: set of byte); extensionmethod := not(a = b); +function operator<>(a: set of byte; b: array of integer); extensionmethod := not(a = b); +function operator<>(a: array of integer; b: set of shortint); extensionmethod := not(a = b); +function operator<>(a: set of shortint; b: array of integer); extensionmethod := not(a = b); +function operator<>(a: array of integer; b: set of smallint); extensionmethod := not(a = b); +function operator<>(a: set of smallint; b: array of integer); extensionmethod := not(a = b); +function operator<>(a: array of integer; b: set of word); extensionmethod := not(a = b); +function operator<>(a: set of word; b: array of integer); extensionmethod := not(a = b); +function operator<>(a: array of integer; b: set of longword); extensionmethod := not(a = b); +function operator<>(a: set of longword; b: array of integer); extensionmethod := not(a = b); +function operator<>(a: array of integer; b: set of int64); extensionmethod := not(a = b); +function operator<>(a: set of int64; b: array of integer); extensionmethod := not(a = b); +function operator<>(a: array of integer; b: set of uint64); extensionmethod := not(a = b); +function operator<>(a: set of uint64; b: array of integer); extensionmethod := not(a = b); +function operator<>(a: array of integer; b: set of integer); extensionmethod := not(a = b); +function operator<>(a: set of integer; b: array of integer); extensionmethod := not(a = b); + +// operator< для set +function operator<(a: set of integer; b: set of byte); extensionmethod + := (a.Count < b.Count) and a.All(x -> (x >= 0) and (x <= byte.MaxValue) and (x in b)); +function operator<(a: set of byte; b: set of integer); extensionmethod + := (a.Count < b.Count) and a.All(x -> x in b); +function operator<(a: set of integer; b: set of int64); extensionmethod + := (a.Count < b.Count) and a.All(x -> x in b); +function operator<(a: set of int64; b: set of integer); extensionmethod + := (a.Count < b.Count) and a.All(x -> (x >= 0) and (x <= byte.MaxValue) and (x in b)); + +// set < array +function operator<(a: array of integer; b: set of byte); extensionmethod + := a.ToSet < b; +function operator<(a: set of byte; b: array of integer); extensionmethod + := a < b.ToSet; +function operator<(a: array of integer; b: set of int64); extensionmethod + := a.ToSet < b; +function operator<(a: set of int64; b: array of integer); extensionmethod + := a < b.ToSet; +function operator<(a: array of integer; b: set of integer); extensionmethod + := (a.Count < b.Count) and a.All(x -> x in b); +function operator<(a: set of integer; b: array of integer); extensionmethod + := (a.Count < b.Count) and a.All(x -> x in b); + +// operator> для set +function operator>(a: set of integer; b: set of byte); extensionmethod + := b < a; +function operator>(a: set of byte; b: set of integer); extensionmethod + := b < a; +function operator>(a: set of integer; b: set of int64); extensionmethod + := b < a; +function operator>(a: set of int64; b: set of integer); extensionmethod + := b < a; + +// set > array +function operator>(a: array of integer; b: set of byte); extensionmethod + := b < a; +function operator>(a: set of byte; b: array of integer); extensionmethod + := b < a; +function operator>(a: array of integer; b: set of int64); extensionmethod + := b < a; +function operator>(a: set of int64; b: array of integer); extensionmethod + := b < a; +function operator>(a: array of integer; b: set of integer); extensionmethod + := b < a; +function operator>(a: set of integer; b: array of integer); extensionmethod + := b < a; + +// operator<= для set - доделать!!! +function operator<=(a: set of integer; b: set of byte); extensionmethod + := (a.Count <= b.Count) and a.All(x -> (x >= 0) and (x <= byte.MaxValue) and (x in b)); +function operator<=(a: set of byte; b: set of integer); extensionmethod + := (a.Count <= b.Count) and a.All(x -> x in b); +function operator<=(a: set of int64; b: set of integer); extensionmethod + := (a.Count <= b.Count) and a.All(x -> x in b); +function operator<=(a: set of integer; b: set of int64); extensionmethod + := (a.Count <= b.Count) and a.All(x -> (x >= 0) and (x <= byte.MaxValue) and (x in b)); + +// set <= array +function operator<=(a: array of integer; b: set of byte); extensionmethod + := a.ToSet <= b; +function operator<=(a: set of byte; b: array of integer); extensionmethod + := a <= b.ToSet; +function operator<=(a: array of integer; b: set of int64); extensionmethod + := a.ToSet <= b; +function operator<=(a: set of int64; b: array of integer); extensionmethod + := a <= b.ToSet; +function operator<=(a: array of integer; b: set of integer); extensionmethod + := (a.Count <= b.Count) and a.All(x -> x in b); +function operator<=(a: set of integer; b: array of integer); extensionmethod + := (a.Count <= b.Count) and a.All(x -> x in b); + + +// operator>= для set +function operator>=(a: set of integer; b: set of byte); extensionmethod + := b <= a; +function operator>=(a: set of byte; b: set of integer); extensionmethod + := b <= a; +function operator>=(a: set of int64; b: set of integer); extensionmethod + := b <= a; +function operator>=(a: set of integer; b: set of int64); extensionmethod + := b <= a; + +// set >= array +function operator>=(a: array of integer; b: set of byte); extensionmethod + := b <= a; +function operator>=(a: set of byte; b: array of integer); extensionmethod + := b <= a; +function operator>=(a: array of integer; b: set of int64); extensionmethod + := b <= a; +function operator>=(a: set of int64; b: array of integer); extensionmethod + := b <= a; +function operator>=(a: array of integer; b: set of integer); extensionmethod + := b <= a; +function operator>=(a: set of integer; b: array of integer); extensionmethod + := b <= a; + + +// set *= set +procedure operator*=(a: set of byte; b: set of integer); extensionmethod + := a *= NewSet&(b); +procedure operator*=(a: set of word; b: set of integer); extensionmethod + := a *= NewSet&(b); +procedure operator*=(a: set of shortint; b: set of integer); extensionmethod + := a *= NewSet&(b); +procedure operator*=(a: set of smallint; b: set of integer); extensionmethod + := a *= NewSet&(b); +procedure operator*=(a: set of longword; b: set of integer); extensionmethod + := a *= NewSet&(b); +procedure operator*=(a: set of int64; b: set of integer); extensionmethod + := a *= NewSet&(b); +procedure operator*=(a: set of uint64; b: set of integer); extensionmethod + := a *= NewSet&(b); + +// set *= array +procedure operator*=(a: set of byte; b: array of integer); extensionmethod + := a *= NewSet&(b); +procedure operator*=(a: set of word; b: array of integer); extensionmethod + := a *= NewSet&(b); +procedure operator*=(a: set of shortint; b: array of integer); extensionmethod + := a *= NewSet&(b); +procedure operator*=(a: set of smallint; b: array of integer); extensionmethod + := a *= NewSet&(b); +procedure operator*=(a: set of longword; b: array of integer); extensionmethod + := a *= NewSet&(b); +procedure operator*=(a: set of int64; b: array of integer); extensionmethod + := a *= NewSet&(b); +procedure operator*=(a: set of uint64; b: array of integer); extensionmethod + := a *= NewSet&(b); + + +// set += set +procedure operator+=(a: set of byte; b: set of integer); extensionmethod + := a += NewSet&(b); +procedure operator+=(a: set of word; b: set of integer); extensionmethod + := a += NewSet&(b); +procedure operator+=(a: set of shortint; b: set of integer); extensionmethod + := a += NewSet&(b); +procedure operator+=(a: set of smallint; b: set of integer); extensionmethod + := a += NewSet&(b); +procedure operator+=(a: set of longword; b: set of integer); extensionmethod + := a += NewSet&(b); +procedure operator+=(a: set of int64; b: set of integer); extensionmethod + := a += NewSet&(b); +procedure operator+=(a: set of uint64; b: set of integer); extensionmethod + := a += NewSet&(b); + +// set += array +procedure operator+=(a: set of byte; b: array of integer); extensionmethod + := a += NewSet&(b); +procedure operator+=(a: set of word; b: array of integer); extensionmethod + := a += NewSet&(b); +procedure operator+=(a: set of shortint; b: array of integer); extensionmethod + := a += NewSet&(b); +procedure operator+=(a: set of smallint; b: array of integer); extensionmethod + := a += NewSet&(b); +procedure operator+=(a: set of longword; b: array of integer); extensionmethod + := a += NewSet&(b); +procedure operator+=(a: set of int64; b: array of integer); extensionmethod + := a += NewSet&(b); +procedure operator+=(a: set of uint64; b: array of integer); extensionmethod + := a += NewSet&(b); + +// set -= set +procedure operator-=(a: set of byte; b: set of integer); extensionmethod + := a -= NewSet&(b); +procedure operator-=(a: set of word; b: set of integer); extensionmethod + := a -= NewSet&(b); +procedure operator-=(a: set of shortint; b: set of integer); extensionmethod + := a -= NewSet&(b); +procedure operator-=(a: set of smallint; b: set of integer); extensionmethod + := a -= NewSet&(b); +procedure operator-=(a: set of longword; b: set of integer); extensionmethod + := a -= NewSet&(b); +procedure operator-=(a: set of int64; b: set of integer); extensionmethod + := a -= NewSet&(b); +procedure operator-=(a: set of uint64; b: set of integer); extensionmethod + := a -= NewSet&(b); + +// set -= array +procedure operator-=(a: set of byte; b: array of integer); extensionmethod + := a -= NewSet&(b); +procedure operator-=(a: set of word; b: array of integer); extensionmethod + := a -= NewSet&(b); +procedure operator-=(a: set of shortint; b: array of integer); extensionmethod + := a -= NewSet&(b); +procedure operator-=(a: set of smallint; b: array of integer); extensionmethod + := a -= NewSet&(b); +procedure operator-=(a: set of longword; b: array of integer); extensionmethod + := a -= NewSet&(b); +procedure operator-=(a: set of int64; b: array of integer); extensionmethod + := a -= NewSet&(b); +procedure operator-=(a: set of uint64; b: array of integer); extensionmethod + := a -= NewSet&(b); + +// Один из операндов должен быть set of integer (array of integer) +// operator* sets +function operator*(a: set of integer; b: set of byte): set of integer; extensionmethod; begin - Result := True; - foreach var x in a do - if x not in b then - begin - Result := False; - exit - end; -end; - -function operator=(a: NewSet; b: NewSet): boolean; extensionmethod := b = a; - - -function operator<>(a: NewSet; b: NewSet); extensionmethod := not(a = b); -function operator<>(a: NewSet; b: NewSet); extensionmethod := not(a = b); -function operator<>(a: NewSet; b: NewSet); extensionmethod := not(a = b); -function operator<>(a: NewSet; b: NewSet); extensionmethod := not(a = b); -function operator<>(a: NewSet; b: NewSet); extensionmethod := not(a = b); -function operator<>(a: NewSet; b: NewSet); extensionmethod := not(a = b); -function operator<>(a: NewSet; b: NewSet); extensionmethod := not(a = b); -function operator<>(a: NewSet; b: NewSet); extensionmethod := not(a = b); -function operator<>(a: NewSet; b: NewSet); extensionmethod := not(a = b); -function operator<>(a: NewSet; b: NewSet); extensionmethod := not(a = b); -function operator<>(a: NewSet; b: NewSet); extensionmethod := not(a = b); -function operator<>(a: NewSet; b: NewSet); extensionmethod := not(a = b); -function operator<>(a: NewSet; b: NewSet); extensionmethod := not(a = b); -function operator<>(a: NewSet; b: NewSet); extensionmethod := not(a = b); - -(*function operator<(a: NewSet; b: NewSet); extensionmethod := a.hs.IsProperSubsetOf(NSToInts(b)); -function operator<(a: NewSet; b: NewSet); extensionmethod := b > a; -function operator<(a: NewSet; b: NewSet); extensionmethod := a.hs.IsProperSubsetOf(NSToInts64(b)); -function operator<(a: NewSet; b: NewSet); extensionmethod := b > a; -*) -function operator>(a: NewSet; b: NewSet); extensionmethod := a.hs.IsProperSupersetOf(NSToInts(b)); -function operator>(a: NewSet; b: NewSet); extensionmethod := b < a; -function operator>(a: NewSet; b: NewSet); extensionmethod := a.hs.IsProperSupersetOf(NSToInts64(b)); -function operator>(a: NewSet; b: NewSet); extensionmethod := b < a; - -function operator<=(a: NewSet; b: NewSet); extensionmethod := a.hs.IsSubsetOf(NSToInts(b)); -function operator<=(a: NewSet; b: NewSet); extensionmethod := b >= a; -function operator<=(a: NewSet; b: NewSet); extensionmethod := a.hs.IsSubsetOf(NSToInts64(b)); -function operator<=(a: NewSet; b: NewSet); extensionmethod := b >= a; - -function operator>=(a: NewSet; b: NewSet); extensionmethod := a.hs.IsSupersetOf(NSToInts(b)); -function operator>=(a: NewSet; b: NewSet); extensionmethod := b <= a; -function operator>=(a: NewSet; b: NewSet); extensionmethod := a.hs.IsSupersetOf(NSToInts64(b)); -function operator>=(a: NewSet; b: NewSet); extensionmethod := b <= a; - -procedure operator*=(var a: NewSet; b: NewSet); extensionmethod := a.hs.IntersectWith(NSToBytes(b)); -procedure operator*=(var a: NewSet; b: NewSet); extensionmethod := a.hs.IntersectWith(NSToInts(b)); -procedure operator*=(var a: NewSet; b: NewSet); extensionmethod := a.hs.IntersectWith(NSToInts64(b)); -//procedure operator*=(var a: NewSet; b: NewSet); extensionmethod := a.hs.IntersectWith(NSToInts(b)); - -//procedure operator*=(var a: NewSet; b: NewSet); extensionmethod := a.hs.IntersectWith(NSToBytes(b)); -//procedure operator*=(var a: NewSet; b: NewSet); extensionmethod := a.hs.IntersectWith(NSToInts64(b)); - -//procedure operator+=(var a: NewSet; another: NewSet); extensionmethod := a.hs.UnionWith(another.hs); - -procedure operator+=(a: NewSet; b: NewSet); extensionmethod; -begin - var x := a.hs; - var bt := NSToBytes(b); - a.hs.UnionWith(bt); -end; - -procedure operator+=(a: NewSet; b: NewSet); extensionmethod := a.hs.UnionWith(NSToInts(b)); -procedure operator+=(a: NewSet; b: NewSet); extensionmethod := a.hs.UnionWith(NSToInts64(b)); -//procedure operator+=(a: NewSet; b: NewSet); extensionmethod := a.hs.UnionWith(NSToInts(b)); -procedure operator+=(a: NewSet; b: NewSet); extensionmethod := a.hs.UnionWith(NSToBytes(b)); -procedure operator+=(a: NewSet; b: NewSet); extensionmethod := a.hs.UnionWith(NSToInts64(b)); - -procedure operator-=(a: NewSet; b: NewSet); extensionmethod := a.hs.ExceptWith(NSToBytes(b)); -procedure operator-=(a: NewSet; b: NewSet); extensionmethod := a.hs.ExceptWith(NSToInts(b)); -procedure operator-=(a: NewSet; b: NewSet); extensionmethod := a.hs.ExceptWith(NSToInts64(b)); -//procedure operator-=(a: NewSet; b: NewSet); extensionmethod := a.hs.ExceptWith(NSToInts(b)); - - -// Нет операции между set of byte и set of int64. Один из операндов должен быть set of integer -function operator*(a: NewSet; b: NewSet): NewSet; extensionmethod; -begin - Result += a; Result *= b + Result := a; + Result.hs.IntersectWith(b.Select(x -> integer(x))); end; -function operator*(a: NewSet; b: NewSet): NewSet; extensionmethod; +function operator*(a: set of byte; b: set of integer): set of integer; extensionmethod + := b * a; + +function operator*(a: set of integer; b: set of int64): set of int64; extensionmethod; begin - Result += a; Result *= b + Result := b; + Result.hs.IntersectWith(a.Select(x -> int64(x))); end; -function operator*(a: NewSet; b: NewSet): NewSet; extensionmethod; +function operator*(a: set of int64; b: set of integer): set of int64; extensionmethod + := b * a; + +// set * array +function operator*(a: array of integer; b: set of byte): set of integer; extensionmethod; begin - Result += a; Result *= b + Result.hs.UnionWith(a); + Result.hs.IntersectWith(b.Select(x -> integer(x))); end; -function operator*(a: NewSet; b: NewSet): NewSet; extensionmethod; +function operator*(a: set of byte; b: array of integer): set of integer; extensionmethod + := b * a; + +function operator*(a: array of integer; b: set of int64): set of int64; extensionmethod; begin - Result += a; Result *= b -end; -//----- - -function operator+(a: NewSet; b: NewSet): NewSet; extensionmethod; -begin - Result += a; Result += b + Result.hs.UnionWith(b); + Result.hs.IntersectWith(a.Select(x -> int64(x))); end; -function operator+(a: NewSet; b: NewSet): NewSet; extensionmethod; +function operator*(a: set of int64; b: array of integer): set of int64; extensionmethod + := b * a; + +function operator*(a: array of integer; b: set of integer): set of integer; extensionmethod; begin - Result += a; Result += b + Result.hs.UnionWith(a); + Result.hs.IntersectWith(b); end; -function operator+(a: NewSet; b: NewSet): NewSet; extensionmethod; +function operator*(a: set of integer; b: array of integer): set of integer; extensionmethod + := b * a; + + +// operator+ sets +function operator+(a: set of integer; b: set of byte): set of integer; extensionmethod; begin - Result += a; Result += b + Result.hs.UnionWith(a); + Result.hs.UnionWith(b.Select(x -> integer(x))); end; -function operator+(a: NewSet; b: NewSet): NewSet; extensionmethod; +function operator+(a: set of byte; b: set of integer): set of integer; extensionmethod + := b * a; + +function operator+(a: set of integer; b: set of int64): set of int64; extensionmethod; begin - Result += a; Result += b + Result.hs.UnionWith(b); + Result.hs.UnionWith(a.Select(x -> int64(x))); end; -//----- -function operator-(a: NewSet; b: NewSet): NewSet; extensionmethod; +function operator+(a: set of int64; b: set of integer): set of int64; extensionmethod + := b * a; + +// set + array +function operator+(a: array of integer; b: set of byte): set of integer; extensionmethod; begin - Result += a; Result -= b + Result.hs.UnionWith(a); + Result.hs.UnionWith(b.Select(x -> integer(x))); end; -function operator-(a: NewSet; b: NewSet): NewSet; extensionmethod; +function operator+(a: set of byte; b: array of integer): set of integer; extensionmethod + := b * a; + +function operator+(a: array of integer; b: set of int64): set of int64; extensionmethod; begin - Result += a; Result -= b + Result.hs.UnionWith(b); + Result.hs.UnionWith(a.Select(x -> int64(x))); end; -function operator-(a: NewSet; b: NewSet): NewSet; extensionmethod; +function operator+(a: set of int64; b: array of integer): set of int64; extensionmethod + := b * a; + +function operator+(a: set of integer; b: array of integer): set of integer; extensionmethod; begin - Result += a; Result -= b + Result.hs.UnionWith(a); + Result.hs.UnionWith(b); end; -function operator-(a: NewSet; b: NewSet): NewSet; extensionmethod; +function operator+(a: array of integer; b: set of integer): set of integer; extensionmethod + := b * a; + + +// operator- sets +function operator-(a: set of integer; b: set of byte): set of integer; extensionmethod; begin - Result += a; Result -= b + Result.hs.UnionWith(a); + Result.hs.ExceptWith(b.Select(x -> integer(x))); end; -// и для массивов столько же -(*function operator=(a: NewSet; b: array of byte); extensionmethod := a._hs.SetEquals(b.Select(x -> integer(x))); -function operator=(a: array of byte; b: NewSet): boolean; extensionmethod := b = a; -function operator=(a: array of int64; b: NewSet); extensionmethod := a.ToHashSet.SetEquals(NSToInts64(b)); -function operator=(a: NewSet; b: array of int64): boolean; extensionmethod := b = a; -*) -//function operator=(a: NewSet; b: NewSet); extensionmethod := a._hs.SetEquals(NSToInts64(b)); -//function operator=(a: NewSet; b: NewSet): boolean; extensionmethod := a = b; +function operator-(a: set of byte; b: set of integer): set of integer; extensionmethod; +begin + Result.hs.UnionWith(a.Select(x -> integer(x))); + Result.hs.ExceptWith(b); +end; -// Следующие функции предназначены для сравнения массива целых со множеством. -// Массив должен интерпретироваться как множество -// Не пойму - что использовать - эту строку или предыдущие. Все типы массивов сравнивать с NewSet -// или наоборот все типы множеств - с array of integer -function operator=(a: NewSet; b: array of integer): boolean; extensionmethod := NSToInts(a).ToHashSet.SetEquals(b); +function operator-(a: set of integer; b: set of int64): set of int64; extensionmethod; +begin + Result.hs.UnionWith(a.Select(x -> int64(x))); + Result.hs.ExceptWith(b); +end; + +function operator-(a: set of int64; b: set of integer): set of int64; extensionmethod; +begin + Result.hs.UnionWith(a); + Result.hs.ExceptWith(b.Select(x -> int64(x))); +end; + +// set - array +function operator-(a: array of integer; b: set of byte): set of integer; extensionmethod; +begin + Result.hs.UnionWith(a); + Result.hs.ExceptWith(b.Select(x -> integer(x))); +end; + +function operator-(a: set of byte; b: array of integer): set of integer; extensionmethod; +begin + Result.hs.UnionWith(a.Select(x -> integer(x))); + Result.hs.ExceptWith(b); +end; + +function operator-(a: array of integer; b: set of int64): set of int64; extensionmethod; +begin + Result.hs.UnionWith(a.Select(x -> int64(x))); + Result.hs.ExceptWith(b); +end; + +function operator-(a: set of int64; b: array of integer): set of int64; extensionmethod; +begin + Result.hs.UnionWith(a); + Result.hs.ExceptWith(b.Select(x -> int64(x))); +end; + +function operator-(a: array of integer; b: set of integer): set of integer; extensionmethod; +begin + Result.hs.UnionWith(a); + Result.hs.ExceptWith(b); +end; + +function operator-(a: set of integer; b: array of integer): set of integer; extensionmethod; +begin + Result.hs.UnionWith(a); + Result.hs.ExceptWith(b); +end; var __initialized: boolean; diff --git a/bin/Lib/PABCSystem.pas b/bin/Lib/PABCSystem.pas index 8aa74d1fa..9c4d637f5 100644 --- a/bin/Lib/PABCSystem.pas +++ b/bin/Lib/PABCSystem.pas @@ -504,10 +504,6 @@ type end; function GetEnumerator: IEnumerator := hs.GetEnumerator; function System.Collections.IEnumerable.GetEnumerator: System.Collections.IEnumerator := GetEnumerator; - static function operator implicit(a: array of T): NewSet; - begin - Result._hs := new HashSet(a); - end; /// Преобразовать к строковому представлению function ToString: string; override; /// Количество элементов в множестве @@ -555,6 +551,10 @@ type begin Result.hs.UnionWith(ns); end; + static function operator implicit(a: array of T): NewSet; + begin + Result._hs := new HashSet(a); + end; static function operator implicit(ns: NewSetEmpty): NewSet; begin end; static function operator:=(var s: NewSet; st: NewSet): NewSet; // Эту функцию обязательно здесь определять @@ -2699,7 +2699,7 @@ function HSetInt(params a: array of integer): HashSet; /// Возвращает множество на базе хеш таблицы, заполненное строковыми значениями function HSetStr(params a: array of string): HashSet; /// Возвращает множество, заполненное указанными значениями -function SetOf(params a: array of T): HashSet; +function SetOf(params a: array of T): NewSet; /// Возвращает множество на базе бинарного дерева поиска, заполненное указанными значениями @@ -6097,8 +6097,10 @@ function HSet(a: IntRange): HashSet := new HashSet(a); function HSet(a: CharRange): HashSet := new HashSet(a); -function SetOf(params a: array of T): HashSet := new HashSet(a); - +function SetOf(params a: array of T): NewSet; +begin + Result._hs := new HashSet(a); +end; function Dict(params pairs: array of KeyValuePair): Dictionary; begin @@ -11188,9 +11190,9 @@ begin end; /// Возвращает множество по данной последовательности -function ToSet(Self: sequence of T): HashSet; extensionmethod; +function ToSet(Self: sequence of T): NewSet; extensionmethod; begin - Result := new HashSet(Self); + Result._hs := new HashSet(Self); end; /// Возвращает множество SortedSet по данной последовательности @@ -15067,14 +15069,6 @@ function operator>(Self: (T1, T2, T3, T4,T5,T6,T7); v: (T1 ///-- function operator>=(Self: (T1, T2, T3, T4,T5,T6,T7); v: (T1, T2, T3, T4,T5,T6,T7)); extensionmethod := CompareToTup5(Self, v) >= 0; -{ -///-- -function operator implicit(a: array of T): set of T; extensionmethod; -begin - foreach var x in a do - Include(Result,x); -end; -} {// Определяет, есть ли указанный элемент в массиве function Contains(self: array of T; x: T): boolean; extensionmethod; @@ -15482,60 +15476,7 @@ begin end end; -function operator implicit(a: set of integer): set of BigInteger; extensionmethod; -begin - foreach var x in a do - Result.Add(x); -end; - -//------------------ -function operator implicit(n: array of integer): set of byte; extensionmethod; -begin - foreach var x in n do - Result._hs.Add(x); -end; - -function operator implicit(n: array of integer): set of shortint; extensionmethod; -begin - foreach var x in n do - Result._hs.Add(x); -end; - -function operator implicit(n: array of integer): set of smallint; extensionmethod; -begin - foreach var x in n do - Result._hs.Add(x); -end; - -function operator implicit(n: array of integer): set of word; extensionmethod; -begin - foreach var x in n do - Result._hs.Add(x); -end; - -function operator implicit(n: array of integer): set of longword; extensionmethod; -begin - foreach var x in n do - Result._hs.Add(x); -end; - -function operator implicit(a: array of integer): set of int64; extensionmethod; -begin - foreach var x in a do - Result._hs.Add(x); -end; - -function operator implicit(a: array of integer): set of uint64; extensionmethod; -begin - foreach var x in a do - Result._hs.Add(x); -end; - -function operator implicit(a: array of integer): set of BigInteger; extensionmethod; -begin - foreach var x in a do - Result._hs.Add(x); -end; + //function operator implicit(ns: NewSetEmpty): NewSet; extensionmethod; begin end; @@ -15824,7 +15765,8 @@ begin end; try if (System.Environment.OSVersion.Version.Major >= 6) and (System.Environment.OSVersion.Version.Minor >= 2) then - System.Console.OutputEncoding := Encoding.UTF8; + System.Console.OutputEncoding := new System.Text.UTF8Encoding(false); + //System.Console.OutputEncoding := Encoding.UTF8; except end; rnd := new System.Random; diff --git a/bin/PascalABCNET.chw b/bin/PascalABCNET.chw index f45317f9359fa9e048ad5ab8f3629ad8961e0580..e6bc8c8d55171f0c91c6ca85a1491c24e8cfb81f 100644 GIT binary patch delta 108 zcmaEKpX1Se4iV3gU^iw428IM61_7USwK5Y$0(cpL>__@cU@?Y?jp7qKgrs;F0uqap z6LTD$oc&xwE__?_5&7I2ZyP zgPk3H>I^SEH0%apNfri%|3ENt%O