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

Commit57f4f68

Browse files
dsymelatkin
authored andcommitted
Fixdotnet#163 - Array2d.* don't work on non-zero-based arrays
fixesdotnet#163closesdotnet#172commit1d8b42eAuthor: Don Syme <dsyme@microsoft.com>Date: Thu Jan 29 10:15:54 2015 +0000 NOP commit to run appveyorcommit290c154Author: Don Syme <dsyme@microsoft.com>Date: Thu Jan 29 01:13:14 2015 +0000 minor update to fixcommit210201dAuthor: Don Syme <dsyme@microsoft.com>Date: Thu Jan 29 01:06:30 2015 +0000FIxdotnet#163 - Array2d.* don't work on non-zero-based arrays
1 parent9ca869d commit57f4f68

File tree

2 files changed

+114
-42
lines changed

2 files changed

+114
-42
lines changed

‎src/fsharp/FSharp.Core/prim-types.fs‎

Lines changed: 63 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -865,7 +865,6 @@ namespace Microsoft.FSharp.Core
865865
SetArray3D dst(src1+i)(src2+j)(src3+k)(GetArray3D src i j k)
866866

867867

868-
869868
let inlineGetArray4D(arr:'T[,,,])(n1:int)(n2:int)(n3:int)(n4:int)=(#"ldelem.multi 4 !0" type('T) arr n1 n2 n3 n4: 'T #)
870869
let inlineSetArray4D(arr:'T[,,,])(n1:int)(n2:int)(n3:int)(n4:int)(x:'T)=(#"stelem.multi 4 !0" type('T) arr n1 n2 n3 n4 x #)
871870
let inlineArray4DLength1(arr:'T[,,,])=(#"ldlen.multi 4 0" arr: int #)
@@ -5359,16 +5358,16 @@ namespace Microsoft.FSharp.Core
53595358
[<CodeAnalysis.SuppressMessage("Microsoft.Naming","CA1709:IdentifiersShouldBeCasedCorrectly"); CodeAnalysis.SuppressMessage("Microsoft.Naming","CA1704:IdentifiersShouldBeSpelledCorrectly")>]
53605359
letPowGeneric(one,mul,x:'T,n)= ComputePowerGenericInlined one mul x n
53615360

5362-
let inlineComputeSlice start finish length=
5361+
let inlineComputeSliceboundstart finish length=
53635362
match start, finishwith
5364-
| None, None->0, length-1
5365-
| None, Some nwhen n>=0->0, n
5366-
| Some m, Nonewhen m<= length-> m, length-1
5363+
| None, None->bound, bound+ length-1
5364+
| None, Some nwhen n>=bound->bound, n
5365+
| Some m, Nonewhen m<=bound+length-> m, bound+ length-1
53675366
| Some m, Some n-> m, n
53685367
|_-> raise(System.IndexOutOfRangeException())
53695368

53705369
let inlineGetArraySlice(arr:_[])start finish=
5371-
letstart,finish= ComputeSlice start finish arr.Length
5370+
letstart,finish= ComputeSlice0start finish arr.Length
53725371
GetArraySub arr start(finish- start+1)
53735372

53745373
let inlineSetArraySlice(dst:_[])start finish(src:_[])=
@@ -5377,91 +5376,113 @@ namespace Microsoft.FSharp.Core
53775376
SetArraySub dst start(finish- start+1) src
53785377

53795378
letGetArraySlice2D(arr:_[,])start1 finish1 start2 finish2=
5380-
letstart1,finish1= ComputeSlice start1 finish1(GetArray2DLength1 arr)
5381-
letstart2,finish2= ComputeSlice start2 finish2(GetArray2DLength2 arr)
5379+
letbound1= arr.GetLowerBound(0)
5380+
letbound2= arr.GetLowerBound(1)
5381+
letstart1,finish1= ComputeSlice bound1 start1 finish1(GetArray2DLength1 arr)
5382+
letstart2,finish2= ComputeSlice bound2 start2 finish2(GetArray2DLength2 arr)
53825383
letlen1=(finish1- start1+1)
53835384
letlen2=(finish2- start2+1)
53845385
GetArray2DSub arr start1 start2 len1 len2
53855386

53865387
let inlineGetArraySlice2DFixed1(arr:_[,])fixed1 start2 finish2=
5387-
letstart2,finish2= ComputeSlice start2 finish2(GetArray2DLength2 arr)
5388+
letbound2= arr.GetLowerBound(1)
5389+
letstart2,finish2= ComputeSlice bound2 start2 finish2(GetArray2DLength2 arr)
53885390
letlen2=(finish2- start2+1)
53895391
letdst= zeroCreate(if len2<0then0else len2)
53905392
for j=0to len2-1do
53915393
SetArray dst j(GetArray2D arr fixed1(start2+j))
53925394
dst
53935395

53945396
let inlineGetArraySlice2DFixed2(arr:_[,])start1 finish1 fixed2=
5395-
letstart1,finish1= ComputeSlice start1 finish1(GetArray2DLength1 arr)
5397+
letbound1= arr.GetLowerBound(0)
5398+
letstart1,finish1= ComputeSlice bound1 start1 finish1(GetArray2DLength1 arr)
53965399
letlen1=(finish1- start1+1)
53975400
letdst= zeroCreate(if len1<0then0else len1)
53985401
for i=0to len1-1do
53995402
SetArray dst i(GetArray2D arr(start1+i) fixed2)
54005403
dst
54015404

54025405
let inlineSetArraySlice2DFixed1(dst:_[,])fixed1 start2 finish2(src:_[])=
5403-
letstart2=(match start2with None->0| Some n-> n)
5404-
letfinish2=(match finish2with None-> GetArray2DLength2 dst-1| Some n-> n)
5406+
letbound2= dst.GetLowerBound(1)
5407+
letstart2=(match start2with None-> bound2| Some n-> n)
5408+
letfinish2=(match finish2with None-> bound2+ GetArray2DLength2 dst-1| Some n-> n)
54055409
letlen2=(finish2- start2+1)
54065410
for j=0to len2-1do
5407-
SetArray2D dst fixed1(start2+j)(GetArray src j)
5411+
SetArray2D dst fixed1(bound2+start2+j)(GetArray src j)
54085412

54095413
let inlineSetArraySlice2DFixed2(dst:_[,])start1 finish1 fixed2(src:_[])=
5410-
letstart1=(match start1with None->0| Some n-> n)
5411-
letfinish1=(match finish1with None-> GetArray2DLength1 dst-1| Some n-> n)
5414+
letbound1= dst.GetLowerBound(0)
5415+
letstart1=(match start1with None-> bound1| Some n-> n)
5416+
letfinish1=(match finish1with None-> bound1+ GetArray2DLength1 dst-1| Some n-> n)
54125417
letlen1=(finish1- start1+1)
54135418
for i=0to len1-1do
5414-
SetArray2D dst(start1+i) fixed2(GetArray src i)
5419+
SetArray2D dst(bound1+start1+i) fixed2(GetArray src i)
54155420

54165421
letSetArraySlice2D(dst:_[,])start1 finish1 start2 finish2(src:_[,])=
5417-
letstart1=(match start1with None->0| Some n-> n)
5418-
letstart2=(match start2with None->0| Some n-> n)
5419-
letfinish1=(match finish1with None-> GetArray2DLength1 dst-1| Some n-> n)
5420-
letfinish2=(match finish2with None-> GetArray2DLength2 dst-1| Some n-> n)
5422+
letbound1= dst.GetLowerBound(0)
5423+
letbound2= dst.GetLowerBound(1)
5424+
letstart1=(match start1with None-> bound1| Some n-> n)
5425+
letstart2=(match start2with None-> bound2| Some n-> n)
5426+
letfinish1=(match finish1with None-> bound1+ GetArray2DLength1 dst-1| Some n-> n)
5427+
letfinish2=(match finish2with None-> bound2+ GetArray2DLength2 dst-1| Some n-> n)
54215428
SetArray2DSub dst start1 start2(finish1- start1+1)(finish2- start2+1) src
54225429

54235430
letGetArraySlice3D(arr:_[,,])start1 finish1 start2 finish2 start3 finish3=
5424-
letstart1,finish1= ComputeSlice start1 finish1(GetArray3DLength1 arr)
5425-
letstart2,finish2= ComputeSlice start2 finish2(GetArray3DLength2 arr)
5426-
letstart3,finish3= ComputeSlice start3 finish3(GetArray3DLength3 arr)
5431+
letbound1= arr.GetLowerBound(0)
5432+
letbound2= arr.GetLowerBound(1)
5433+
letbound3= arr.GetLowerBound(2)
5434+
letstart1,finish1= ComputeSlice bound1 start1 finish1(GetArray3DLength1 arr)
5435+
letstart2,finish2= ComputeSlice bound2 start2 finish2(GetArray3DLength2 arr)
5436+
letstart3,finish3= ComputeSlice bound3 start3 finish3(GetArray3DLength3 arr)
54275437
letlen1=(finish1- start1+1)
54285438
letlen2=(finish2- start2+1)
54295439
letlen3=(finish3- start3+1)
54305440
GetArray3DSub arr start1 start2 start3 len1 len2 len3
54315441

54325442
letSetArraySlice3D(dst:_[,,])start1 finish1 start2 finish2 start3 finish3(src:_[,,])=
5433-
letstart1=(match start1with None->0| Some n-> n)
5434-
letstart2=(match start2with None->0| Some n-> n)
5435-
letstart3=(match start3with None->0| Some n-> n)
5436-
letfinish1=(match finish1with None-> GetArray3DLength1 dst-1| Some n-> n)
5437-
letfinish2=(match finish2with None-> GetArray3DLength2 dst-1| Some n-> n)
5438-
letfinish3=(match finish3with None-> GetArray3DLength3 dst-1| Some n-> n)
5443+
letbound1= dst.GetLowerBound(0)
5444+
letbound2= dst.GetLowerBound(1)
5445+
letbound3= dst.GetLowerBound(2)
5446+
letstart1=(match start1with None-> bound1| Some n-> n)
5447+
letstart2=(match start2with None-> bound2| Some n-> n)
5448+
letstart3=(match start3with None-> bound3| Some n-> n)
5449+
letfinish1=(match finish1with None-> bound1+ GetArray3DLength1 dst-1| Some n-> n)
5450+
letfinish2=(match finish2with None-> bound2+ GetArray3DLength2 dst-1| Some n-> n)
5451+
letfinish3=(match finish3with None-> bound3+ GetArray3DLength3 dst-1| Some n-> n)
54395452
SetArray3DSub dst start1 start2 start3(finish1- start1+1)(finish2- start2+1)(finish3- start3+1) src
54405453

54415454
letGetArraySlice4D(arr:_[,,,])start1 finish1 start2 finish2 start3 finish3 start4 finish4=
5442-
letstart1,finish1= ComputeSlice start1 finish1(Array4DLength1 arr)
5443-
letstart2,finish2= ComputeSlice start2 finish2(Array4DLength2 arr)
5444-
letstart3,finish3= ComputeSlice start3 finish3(Array4DLength3 arr)
5445-
letstart4,finish4= ComputeSlice start4 finish4(Array4DLength4 arr)
5455+
letbound1= arr.GetLowerBound(0)
5456+
letbound2= arr.GetLowerBound(1)
5457+
letbound3= arr.GetLowerBound(2)
5458+
letbound4= arr.GetLowerBound(3)
5459+
letstart1,finish1= ComputeSlice bound1 start1 finish1(Array4DLength1 arr)
5460+
letstart2,finish2= ComputeSlice bound2 start2 finish2(Array4DLength2 arr)
5461+
letstart3,finish3= ComputeSlice bound3 start3 finish3(Array4DLength3 arr)
5462+
letstart4,finish4= ComputeSlice bound4 start4 finish4(Array4DLength4 arr)
54465463
letlen1=(finish1- start1+1)
54475464
letlen2=(finish2- start2+1)
54485465
letlen3=(finish3- start3+1)
54495466
letlen4=(finish4- start4+1)
54505467
GetArray4DSub arr start1 start2 start3 start4 len1 len2 len3 len4
54515468

54525469
letSetArraySlice4D(dst:_[,,,])start1 finish1 start2 finish2 start3 finish3 start4 finish4(src:_[,,,])=
5453-
letstart1=(match start1with None->0| Some n-> n)
5454-
letstart2=(match start2with None->0| Some n-> n)
5455-
letstart3=(match start3with None->0| Some n-> n)
5456-
letstart4=(match start4with None->0| Some n-> n)
5457-
letfinish1=(match finish1with None-> Array4DLength1 dst-1| Some n-> n)
5458-
letfinish2=(match finish2with None-> Array4DLength2 dst-1| Some n-> n)
5459-
letfinish3=(match finish3with None-> Array4DLength3 dst-1| Some n-> n)
5460-
letfinish4=(match finish4with None-> Array4DLength4 dst-1| Some n-> n)
5470+
letbound1= dst.GetLowerBound(0)
5471+
letbound2= dst.GetLowerBound(1)
5472+
letbound3= dst.GetLowerBound(2)
5473+
letbound4= dst.GetLowerBound(3)
5474+
letstart1=(match start1with None-> bound1| Some n-> n)
5475+
letstart2=(match start2with None-> bound2| Some n-> n)
5476+
letstart3=(match start3with None-> bound3| Some n-> n)
5477+
letstart4=(match start4with None-> bound4| Some n-> n)
5478+
letfinish1=(match finish1with None-> bound1+ Array4DLength1 dst-1| Some n-> n)
5479+
letfinish2=(match finish2with None-> bound2+ Array4DLength2 dst-1| Some n-> n)
5480+
letfinish3=(match finish3with None-> bound3+ Array4DLength3 dst-1| Some n-> n)
5481+
letfinish4=(match finish4with None-> bound4+ Array4DLength4 dst-1| Some n-> n)
54615482
SetArray4DSub dst start1 start2 start3 start4(finish1- start1+1)(finish2- start2+1)(finish3- start3+1)(finish4- start4+1) src
54625483

54635484
let inlineGetStringSlice(str:string)start finish=
5464-
letstart,finish= ComputeSlice start finish str.Length
5485+
letstart,finish= ComputeSlice0start finish str.Length
54655486
letlen= finish-start+1
54665487
if len<=0then String.Empty
54675488
else str.Substring(start, len)

‎tests/fsharp/core/array/test.fsx‎

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -594,14 +594,65 @@ module Array2Tests = begin
594594
//test "a2_sub"
595595
// (Array2D.sub a 1 1 2 2 = b)
596596

597+
597598
Array2D.blit b00 a0022
598599
//test "a2_blit"
599600
// (Array2D.sub a 0 0 2 2 = b)
600601

601602
let_= test_make_get_set_length()
602603

604+
603605
end
604606

607+
#if!Portable
608+
moduleArrayNonZeroBasedTestsSlice=
609+
letrunTest()=
610+
letarr=(Array2D.initBased5432(fun i j->(i,j)))
611+
test"fewoih1"(arr.[6,*]=[|(6,4);(6,5)|])
612+
test"fewoih2"(arr.[*,*].[1,*]=[|(6,4);(6,5)|])
613+
test"fewoih3"(arr.[*,5]=[|(5,5);(6,5);(7,5)|])
614+
test"fewoih4"(arr.[*,*].[*,1]=[|(5,5);(6,5);(7,5)|])
615+
test"fewoih5"(arr.GetLowerBound(0)=5)
616+
test"fewoih6"(arr.GetLowerBound(1)=4)
617+
test"fewoih7"(arr.[*,*].GetLowerBound(0)=0)
618+
test"fewoih8"(arr.[*,*].GetLowerBound(1)=0)
619+
test"fewoih9"(arr.[*,*].[0..,1]=[|(5,5);(6,5);(7,5)|])
620+
test"fewoih10"(arr.[*,*].[1..,1]=[|(6,5);(7,5)|])
621+
letarr2d=
622+
letarr= Array2D.zeroCreateBased5432
623+
for iin5..7dofor jin4..5do arr.[i,j]<-(i,j)
624+
arr
625+
letarr2d2=
626+
letarr= Array2D.zeroCreate32
627+
for iin0..2dofor jin0..1do arr.[i,j]<-(j,i)
628+
arr
629+
test"fewoih11"(arr2d.[6..6,5]=[|(6,5)|])
630+
test"fewoih11"(arr2d.[..6,5]=[|(5,5);(6,5)|])
631+
test"fewoih11"(arr2d.[6..,5]=[|(6,5);(7,5)|])
632+
test"fewoih12"(arr2d.[*,*].[1..,1]=[|(6,5);(7,5)|])
633+
arr2d.[*,*]<- arr2d2
634+
test"fewoih13"(arr2d.[*,*].[0..0,1]=[|(1,0)|])
635+
test"fewoih13"(arr2d.[*,*].[1..,1]=[|(1,1);(1,2)|])
636+
test"fewoih13"(arr2d.[*,*].[1,1..]=[|(1,1)|])
637+
test"fewoih13"(arr2d.[*,*].[1,0..0]=[|(0,1)|])
638+
letarr3d=
639+
letarr= System.Array.CreateInstance(typeof<int*int*int>,[|3;2;1|],[|5;4;3|]):?>(int*int*int)[,,]
640+
for iin5..7dofor jin4..5dofor kin3..3do arr.[i,j,k]<-(i,j,k)
641+
arr
642+
letarr3d2=
643+
letarr= System.Array.CreateInstance(typeof<int*int*int>,[|3;2;1|]):?>(int*int*int)[,,]
644+
for iin0..2dofor jin0..1dofor kin0..0do arr.[i,j,k]<-(k,j,i)
645+
arr
646+
647+
test"fewoih14"(arr3d.[5,4,3]=(5,4,3))
648+
test"fewoih15"(arr3d.[*,*,*].[0,0,0]=(5,4,3))
649+
arr3d.[*,*,*]<- arr3d2
650+
test"fewoih16"(arr3d.[5,4,3]=(0,0,0))
651+
test"fewoih16"(arr3d.[5,5,3]=(0,1,0))
652+
test"fewoih16"(arr3d.[6,5,3]=(0,1,1))
653+
let_= runTest()
654+
#endif
655+
605656
moduleArray3Tests=begin
606657

607658
lettest_make_get_set_length()=

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp