Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitf11c636

Browse files
dsymelatkin
authored andcommitted
Add NonStructuralComparison ops
commit 3d64e6c4a6f9b9760e7e77e3031dff7d437169f6Author: latkin <latkin@microsoft.com>Date: Tue Dec 16 14:07:12 2014 -0800 Adding conditional compilation where requiredcommit 8a5a33c99fcc82718adcd78146b59fe8f93321c9Author: latkin <latkin@microsoft.com>Date: Tue Dec 16 13:29:48 2014 -0800 Updating surface area testscommit 6c6925633d5c95bb0d34e16377651f6d62913ee1Author: latkin <latkin@microsoft.com>Date: Tue Dec 16 12:00:45 2014 -0800 Small test changescommit 3b4f1355ca0b5a022e18811a84d1fc6cda04b96eAuthor: latkin <latkin@microsoft.com>Date: Tue Dec 16 11:59:03 2014 -0800 Fix doc commentcommit 321c1abfe00bea20316daccc41bd33a873b50fe5Merge:ecfa21c 979c99dAuthor: latkin <latkin@microsoft.com>Date: Tue Dec 16 11:03:26 2014 -0800 Merge branch 'non-structural-eq-compare' ofhttps://git01.codeplex.com/forks/dsyme/cleanup into comparisoncommit 979c99d6605a7b5b7540d94d0446d734728743c6Author: Don Syme <dsyme@microsoft.com>Date: Tue Dec 2 18:20:07 2014 +0000 fix string comparison and add tests for decimalcommit dc46cc5c9b2871711c22c9f364604361d8a14fefAuthor: Don Syme <dsyme@microsoft.com>Date: Tue Nov 11 12:33:49 2014 +0000 Add HashIdentity.NonStructural and ComparisonIdentity.NonStructuralcommit 5d84b340bd94579388a5394c8138e1cb99433cbcAuthor: Don Syme <dsyme@microsoft.com>Date: Tue Nov 11 11:38:03 2014 +0000 rename to NonStructuralComparisoncommit 768dfb521bf7bd25135e8e1a4603a15b86360903Author: Don Syme <dsyme@microsoft.com>Date: Tue Nov 11 11:35:20 2014 +0000 rename to NonStructuralOperatorscommit 9f919071cd22d8ec994cfad6d7eb0cb209d6e164Author: Don Syme <dsyme@microsoft.com>Date: Tue Nov 11 11:29:21 2014 +0000 add StaticCOmparisonOperators to LeafExpressionConvert for symmetrycommit 9c59edcc43275a7060547df012e97b52c7d08e89Author: Don Syme <dsyme@microsoft.com>Date: Tue Nov 11 11:09:26 2014 +0000 add testing and small fixes for StaticComparisonOperatorscommit 982da7b725a3cd8c25591f40e9a0e3d36d26bc00Author: Don Syme <dsyme@microsoft.com>Date: Mon Nov 10 21:27:29 2014 +0000 fast structural comparison operators
1 parentecfa21c commitf11c636

File tree

10 files changed

+653
-104
lines changed

10 files changed

+653
-104
lines changed

‎src/fsharp/FSharp.Core.Unittests/SurfaceArea.4.0.fs‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ Microsoft.FSharp.Collections.ArrayModule: Void SortInPlace[T](T[])
205205
Microsoft.FSharp.Collections.ComparisonIdentity: Boolean Equals(System.Object)
206206
Microsoft.FSharp.Collections.ComparisonIdentity: Int32 GetHashCode()
207207
Microsoft.FSharp.Collections.ComparisonIdentity: System.Collections.Generic.IComparer`1[T] FromFunction[T](Microsoft.FSharp.Core.FSharpFunc`2[T,Microsoft.FSharp.Core.FSharpFunc`2[T,System.Int32]])
208+
Microsoft.FSharp.Collections.ComparisonIdentity: System.Collections.Generic.IComparer`1[T] NonStructural[T]()
208209
Microsoft.FSharp.Collections.ComparisonIdentity: System.Collections.Generic.IComparer`1[T] Structural[T]()
209210
Microsoft.FSharp.Collections.ComparisonIdentity: System.String ToString()
210211
Microsoft.FSharp.Collections.ComparisonIdentity: System.Type GetType()
@@ -289,6 +290,7 @@ Microsoft.FSharp.Collections.HashIdentity: Boolean Equals(System.Object)
289290
Microsoft.FSharp.Collections.HashIdentity: Int32 GetHashCode()
290291
Microsoft.FSharp.Collections.HashIdentity: System.Collections.Generic.IEqualityComparer`1[T] FromFunctions[T](Microsoft.FSharp.Core.FSharpFunc`2[T,System.Int32], Microsoft.FSharp.Core.FSharpFunc`2[T,Microsoft.FSharp.Core.FSharpFunc`2[T,System.Boolean]])
291292
Microsoft.FSharp.Collections.HashIdentity: System.Collections.Generic.IEqualityComparer`1[T] LimitedStructural[T](Int32)
293+
Microsoft.FSharp.Collections.HashIdentity: System.Collections.Generic.IEqualityComparer`1[T] NonStructural[T]()
292294
Microsoft.FSharp.Collections.HashIdentity: System.Collections.Generic.IEqualityComparer`1[T] Reference[T]()
293295
Microsoft.FSharp.Collections.HashIdentity: System.Collections.Generic.IEqualityComparer`1[T] Structural[T]()
294296
Microsoft.FSharp.Collections.HashIdentity: System.String ToString()
@@ -2443,6 +2445,20 @@ Microsoft.FSharp.Core.Operators+Checked: UInt16 ToUInt16[T](T)
24432445
Microsoft.FSharp.Core.Operators+Checked: UInt32 ToUInt32[T](T)
24442446
Microsoft.FSharp.Core.Operators+Checked: UInt64 ToUInt64[T](T)
24452447
Microsoft.FSharp.Core.Operators+Checked: UIntPtr ToUIntPtr[T](T)
2448+
Microsoft.FSharp.Core.Operators+NonStructuralComparison: Boolean Equals(System.Object)
2449+
Microsoft.FSharp.Core.Operators+NonStructuralComparison: Boolean op_Equality[T](T, T)
2450+
Microsoft.FSharp.Core.Operators+NonStructuralComparison: Boolean op_GreaterThanOrEqual[T,TResult](T, TResult)
2451+
Microsoft.FSharp.Core.Operators+NonStructuralComparison: Boolean op_GreaterThan[T,TResult](T, TResult)
2452+
Microsoft.FSharp.Core.Operators+NonStructuralComparison: Boolean op_Inequality[T](T, T)
2453+
Microsoft.FSharp.Core.Operators+NonStructuralComparison: Boolean op_LessThanOrEqual[T,TResult](T, TResult)
2454+
Microsoft.FSharp.Core.Operators+NonStructuralComparison: Boolean op_LessThan[T,TResult](T, TResult)
2455+
Microsoft.FSharp.Core.Operators+NonStructuralComparison: Int32 Compare[T](T, T)
2456+
Microsoft.FSharp.Core.Operators+NonStructuralComparison: Int32 GetHashCode()
2457+
Microsoft.FSharp.Core.Operators+NonStructuralComparison: Int32 Hash[T](T)
2458+
Microsoft.FSharp.Core.Operators+NonStructuralComparison: System.String ToString()
2459+
Microsoft.FSharp.Core.Operators+NonStructuralComparison: System.Type GetType()
2460+
Microsoft.FSharp.Core.Operators+NonStructuralComparison: T Max[T](T, T)
2461+
Microsoft.FSharp.Core.Operators+NonStructuralComparison: T Min[T](T, T)
24462462
Microsoft.FSharp.Core.Operators+OperatorIntrinsics: Boolean Equals(System.Object)
24472463
Microsoft.FSharp.Core.Operators+OperatorIntrinsics: Byte PowByte(Byte, Int32)
24482464
Microsoft.FSharp.Core.Operators+OperatorIntrinsics: Double PowDouble(Double, Int32)
@@ -2553,6 +2569,7 @@ Microsoft.FSharp.Core.Operators: Microsoft.FSharp.Core.FSharpOption`1[System.Str
25532569
Microsoft.FSharp.Core.Operators: Microsoft.FSharp.Core.FSharpOption`1[T] TryUnbox[T](System.Object)
25542570
Microsoft.FSharp.Core.Operators: Microsoft.FSharp.Core.FSharpRef`1[T] Ref[T](T)
25552571
Microsoft.FSharp.Core.Operators: Microsoft.FSharp.Core.Operators+Checked
2572+
Microsoft.FSharp.Core.Operators: Microsoft.FSharp.Core.Operators+NonStructuralComparison
25562573
Microsoft.FSharp.Core.Operators: Microsoft.FSharp.Core.Operators+OperatorIntrinsics
25572574
Microsoft.FSharp.Core.Operators: Microsoft.FSharp.Core.Operators+Unchecked
25582575
Microsoft.FSharp.Core.Operators: SByte ToSByte[T](T)

‎src/fsharp/FSharp.Core.Unittests/SurfaceArea.Portable.fs‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@ Microsoft.FSharp.Collections.ArrayModule: Void SortInPlace[T](T[])
199199
Microsoft.FSharp.Collections.ComparisonIdentity: Boolean Equals(System.Object)
200200
Microsoft.FSharp.Collections.ComparisonIdentity: Int32 GetHashCode()
201201
Microsoft.FSharp.Collections.ComparisonIdentity: System.Collections.Generic.IComparer`1[T] FromFunction[T](Microsoft.FSharp.Core.FSharpFunc`2[T,Microsoft.FSharp.Core.FSharpFunc`2[T,System.Int32]])
202+
Microsoft.FSharp.Collections.ComparisonIdentity: System.Collections.Generic.IComparer`1[T] NonStructural[T]()
202203
Microsoft.FSharp.Collections.ComparisonIdentity: System.Collections.Generic.IComparer`1[T] Structural[T]()
203204
Microsoft.FSharp.Collections.ComparisonIdentity: System.String ToString()
204205
Microsoft.FSharp.Collections.ComparisonIdentity: System.Type GetType()
@@ -283,6 +284,7 @@ Microsoft.FSharp.Collections.HashIdentity: Boolean Equals(System.Object)
283284
Microsoft.FSharp.Collections.HashIdentity: Int32 GetHashCode()
284285
Microsoft.FSharp.Collections.HashIdentity: System.Collections.Generic.IEqualityComparer`1[T] FromFunctions[T](Microsoft.FSharp.Core.FSharpFunc`2[T,System.Int32], Microsoft.FSharp.Core.FSharpFunc`2[T,Microsoft.FSharp.Core.FSharpFunc`2[T,System.Boolean]])
285286
Microsoft.FSharp.Collections.HashIdentity: System.Collections.Generic.IEqualityComparer`1[T] LimitedStructural[T](Int32)
287+
Microsoft.FSharp.Collections.HashIdentity: System.Collections.Generic.IEqualityComparer`1[T] NonStructural[T]()
286288
Microsoft.FSharp.Collections.HashIdentity: System.Collections.Generic.IEqualityComparer`1[T] Reference[T]()
287289
Microsoft.FSharp.Collections.HashIdentity: System.Collections.Generic.IEqualityComparer`1[T] Structural[T]()
288290
Microsoft.FSharp.Collections.HashIdentity: System.String ToString()
@@ -2430,6 +2432,20 @@ Microsoft.FSharp.Core.Operators+Checked: UInt16 ToUInt16[T](T)
24302432
Microsoft.FSharp.Core.Operators+Checked: UInt32 ToUInt32[T](T)
24312433
Microsoft.FSharp.Core.Operators+Checked: UInt64 ToUInt64[T](T)
24322434
Microsoft.FSharp.Core.Operators+Checked: UIntPtr ToUIntPtr[T](T)
2435+
Microsoft.FSharp.Core.Operators+NonStructuralComparison: Boolean Equals(System.Object)
2436+
Microsoft.FSharp.Core.Operators+NonStructuralComparison: Boolean op_Equality[T](T, T)
2437+
Microsoft.FSharp.Core.Operators+NonStructuralComparison: Boolean op_GreaterThanOrEqual[T,TResult](T, TResult)
2438+
Microsoft.FSharp.Core.Operators+NonStructuralComparison: Boolean op_GreaterThan[T,TResult](T, TResult)
2439+
Microsoft.FSharp.Core.Operators+NonStructuralComparison: Boolean op_Inequality[T](T, T)
2440+
Microsoft.FSharp.Core.Operators+NonStructuralComparison: Boolean op_LessThanOrEqual[T,TResult](T, TResult)
2441+
Microsoft.FSharp.Core.Operators+NonStructuralComparison: Boolean op_LessThan[T,TResult](T, TResult)
2442+
Microsoft.FSharp.Core.Operators+NonStructuralComparison: Int32 Compare[T](T, T)
2443+
Microsoft.FSharp.Core.Operators+NonStructuralComparison: Int32 GetHashCode()
2444+
Microsoft.FSharp.Core.Operators+NonStructuralComparison: Int32 Hash[T](T)
2445+
Microsoft.FSharp.Core.Operators+NonStructuralComparison: System.String ToString()
2446+
Microsoft.FSharp.Core.Operators+NonStructuralComparison: System.Type GetType()
2447+
Microsoft.FSharp.Core.Operators+NonStructuralComparison: T Max[T](T, T)
2448+
Microsoft.FSharp.Core.Operators+NonStructuralComparison: T Min[T](T, T)
24332449
Microsoft.FSharp.Core.Operators+OperatorIntrinsics: Boolean Equals(System.Object)
24342450
Microsoft.FSharp.Core.Operators+OperatorIntrinsics: Byte PowByte(Byte, Int32)
24352451
Microsoft.FSharp.Core.Operators+OperatorIntrinsics: Double PowDouble(Double, Int32)
@@ -2540,6 +2556,7 @@ Microsoft.FSharp.Core.Operators: Microsoft.FSharp.Core.FSharpOption`1[System.Str
25402556
Microsoft.FSharp.Core.Operators: Microsoft.FSharp.Core.FSharpOption`1[T] TryUnbox[T](System.Object)
25412557
Microsoft.FSharp.Core.Operators: Microsoft.FSharp.Core.FSharpRef`1[T] Ref[T](T)
25422558
Microsoft.FSharp.Core.Operators: Microsoft.FSharp.Core.Operators+Checked
2559+
Microsoft.FSharp.Core.Operators: Microsoft.FSharp.Core.Operators+NonStructuralComparison
25432560
Microsoft.FSharp.Core.Operators: Microsoft.FSharp.Core.Operators+OperatorIntrinsics
25442561
Microsoft.FSharp.Core.Operators: Microsoft.FSharp.Core.Operators+Unchecked
25452562
Microsoft.FSharp.Core.Operators: SByte ToSByte[T](T)

‎src/fsharp/FSharp.Core/Linq.fs‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,13 @@ module LeafExpressionConverter =
233233
let(|LessEqQ|_|)=(|SpecificCallToMethod|_|)(methodhandleof(fun(x,y)-> x<= y))
234234
let(|NotEqQ|_|)=(|SpecificCallToMethod|_|)(methodhandleof(fun(x,y)-> x<> y))
235235

236+
let(|StaticEqualsQ|_|)=(|SpecificCallToMethod|_|)(methodhandleof(fun(x:int,y:int)-> NonStructuralComparison.(=) x y))
237+
let(|StaticGreaterQ|_|)=(|SpecificCallToMethod|_|)(methodhandleof(fun(x:int,y:int)-> NonStructuralComparison.(>) x y))
238+
let(|StaticGreaterEqQ|_|)=(|SpecificCallToMethod|_|)(methodhandleof(fun(x:int,y:int)-> NonStructuralComparison.(>=) x y))
239+
let(|StaticLessQ|_|)=(|SpecificCallToMethod|_|)(methodhandleof(fun(x:int,y:int)-> NonStructuralComparison.(<) x y))
240+
let(|StaticLessEqQ|_|)=(|SpecificCallToMethod|_|)(methodhandleof(fun(x:int,y:int)-> NonStructuralComparison.(<=) x y))
241+
let(|StaticNotEqQ|_|)=(|SpecificCallToMethod|_|)(methodhandleof(fun(x:int,y:int)-> NonStructuralComparison.(<>) x y))
242+
236243
let(|NullableEqualsQ|_|)=(|SpecificCallToMethod|_|)(methodhandleof(fun(x,y)-> NullableOperators.(?=) x y))
237244
let(|NullableNotEqQ|_|)=(|SpecificCallToMethod|_|)(methodhandleof(fun(x,y)-> NullableOperators.(?<>) x y))
238245
let(|NullableGreaterQ|_|)=(|SpecificCallToMethod|_|)(methodhandleof(fun(x,y)-> NullableOperators.(?>) x y))
@@ -487,6 +494,13 @@ module LeafExpressionConverter =
487494
| LessEqQ(_,_,[x1;x2])-> transBinOp envfalse x1 x2false Expression.LessThanOrEqual
488495
| NotQ(_,_,[x1])-> Expression.Not(ConvExprToLinqInContext env x1)|> asExpr
489496

497+
| StaticEqualsQ(_,_,[x1;x2])-> transBinOp envfalse x1 x2false Expression.Equal
498+
| StaticNotEqQ(_,_,[x1;x2])-> transBinOp envfalse x1 x2false Expression.NotEqual
499+
| StaticGreaterQ(_,_,[x1;x2])-> transBinOp envfalse x1 x2false Expression.GreaterThan
500+
| StaticGreaterEqQ(_,_,[x1;x2])-> transBinOp envfalse x1 x2false Expression.GreaterThanOrEqual
501+
| StaticLessQ(_,_,[x1;x2])-> transBinOp envfalse x1 x2false Expression.LessThan
502+
| StaticLessEqQ(_,_,[x1;x2])-> transBinOp envfalse x1 x2false Expression.LessThanOrEqual
503+
490504
| NullableEqualsQ(_,_,[x1;x2])-> transBinOp envfalse x1 x2true Expression.Equal
491505
| NullableNotEqQ(_,_,[x1;x2])-> transBinOp envfalse x1 x2true Expression.NotEqual
492506
| NullableGreaterQ(_,_,[x1;x2])-> transBinOp envfalse x1 x2true Expression.GreaterThan

‎src/fsharp/FSharp.Core/collections.fs‎

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@ namespace Microsoft.FSharp.Collections
2828
memberself.GetHashCode(x)= LanguagePrimitives.PhysicalHash(x)
2929
memberself.Equals(x,y)= LanguagePrimitives.PhysicalEquality x y}
3030

31+
let inlineNonStructural<'Twhen'T:equalityand'T:(static member(=):'T*'T->bool)>=
32+
{new IEqualityComparer< 'T>with
33+
memberself.GetHashCode(x)= NonStructuralComparison.hash x
34+
memberself.Equals(x,y)= NonStructuralComparison.(=) x y}
35+
3136
let inlineFromFunctions hash eq:IEqualityComparer<'T>=
3237
leteq= OptimizedClosures.FSharpFunc<_,_,_>.Adapt(eq)
3338
{new IEqualityComparer<'T>with
@@ -37,10 +42,16 @@ namespace Microsoft.FSharp.Collections
3742

3843
moduleComparisonIdentity=
3944

40-
4145
let inlineStructural<'Twhen'T:comparison>:IComparer<'T>=
4246
LanguagePrimitives.FastGenericComparer<'T>
43-
47+
48+
#if BUILDING_WITH_LKG
49+
#else
50+
let inlineNonStructural<'Twhen'T:(static member(<):'T*'T->bool)and'T:(static member(>):'T*'T->bool)>:IComparer<'T>=
51+
{new IComparer<'T>with
52+
memberself.Compare(x,y)= NonStructuralComparison.compare x y}
53+
#endif
54+
4455
letFromFunction comparer=
4556
letcomparer= OptimizedClosures.FSharpFunc<'T,'T,int>.Adapt(comparer)
4657
{new IComparer<'T>with

‎src/fsharp/FSharp.Core/collections.fsi‎

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,13 @@ namespace Microsoft.FSharp.Collections
1414

1515
/// <summary>Structural comparison. Compare using Operators.compare.</summary>
1616
val inlineStructural<'T>:IComparer<'T>when 'T:comparison
17-
17+
18+
#if BUILDING_WITH_LKG
19+
#else
20+
/// <summary>Non-structural comparison. Compare using NonStructuralComparison.compare.</summary>
21+
val inlineNonStructural<^T>:IComparer<^T>when ^T:(static member(<):^T*^T->bool)and ^T:(static member(>):^T*^T->bool)
22+
#endif
23+
1824
///<summary>Compare using the given comparer function.</summary>
1925
///<param name="comparer">A function to compare two values.</param>
2026
///<returns>An object implementing IComparer using the supplied comparer.</returns>
@@ -24,10 +30,11 @@ namespace Microsoft.FSharp.Collections
2430
module HashIdentity=
2531

2632
///<summary>Structural hashing. Hash using Operators.(=)and Operators.hash.</summary>
27-
28-
// inline justification: allows specialization of structural hash functions based on type
2933
val inline Structural<'T>:IEqualityComparer<'T> when 'T:equality
3034

35+
///<summary>Non-structural hashing. Equality using NonStructuralComparison.(=)and NonStructuralComparison.hash.</summary>
36+
val inline NonStructural<'T>:IEqualityComparer< ^T > when ^T:equality and ^T:(static member(=):^T*^T->bool)
37+
3138
val inline LimitedStructural<'T>:limit:int->IEqualityComparer<'T> when 'T:equality
3239

3340
///<summary>Physical hashing(hash on reference identity of objects,and the contents of value types).

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp