From e405dc66e4fbc52d318675cd6b30ef50b2a6ccd4 Mon Sep 17 00:00:00 2001 From: otya128 Date: Fri, 28 Jul 2017 23:08:09 +0900 Subject: [PATCH] Fix RSORT --- SMILEBASIC/TEST.txt | 35 ++++++++++++++++++++++++++++++++++ SMILEBASIC/bg.d | 2 +- SMILEBASIC/builtinfunctions.d | 36 +++++++++++++---------------------- 3 files changed, 49 insertions(+), 24 deletions(-) diff --git a/SMILEBASIC/TEST.txt b/SMILEBASIC/TEST.txt index 2b44b23..d6909b2 100644 --- a/SMILEBASIC/TEST.txt +++ b/SMILEBASIC/TEST.txt @@ -57,6 +57,8 @@ DEF SORTTEST RSORT B$ ASSERT__ B$[3]=="0","RSORT2" SORTTEST2 + STABLESORTTEST + STABLERSORTTEST END DEF SORTTEST2 DIM A[10] @@ -70,6 +72,39 @@ DEF SORTTEST2 ASSERT__ A[8]==-1,"RSORT" ASSERT__ B[8]==12345,"RSORT" END +DEF STABLESORTTEST + DIM A[0],B[0] + PUSH A,2:PUSH B,3 + PUSH A,3:PUSH B,4 + PUSH A,1:PUSH B,1 + PUSH A,1:PUSH B,2 + SORT A,B + ASSERT__ A[0]==1,"STABLESORT" + ASSERT__ A[1]==1,"STABLESORT" + ASSERT__ A[2]==2,"STABLESORT" + ASSERT__ A[3]==3,"STABLESORT" + ASSERT__ B[0]==1,"STABLESORT" + ASSERT__ B[1]==2,"STABLESORT" + ASSERT__ B[2]==3,"STABLESORT" + ASSERT__ B[3]==4,"STABLESORT" +END + +DEF STABLERSORTTEST + DIM A[0],B[0] + PUSH A,2:PUSH B,3 + PUSH A,3:PUSH B,4 + PUSH A,1:PUSH B,1 + PUSH A,1:PUSH B,2 + RSORT A,B + ASSERT__ A[0]==3,"STABLESORT" + ASSERT__ A[1]==2,"STABLESORT" + ASSERT__ A[2]==1,"STABLESORT" + ASSERT__ A[3]==1,"STABLESORT" + ASSERT__ B[0]==4,"STABLESORT" + ASSERT__ B[1]==3,"STABLESORT" + ASSERT__ B[2]==2,"STABLESORT" + ASSERT__ B[3]==1,"STABLESORT" +END ?"SORTTEST" SORTTEST ?"SWAPTEST" diff --git a/SMILEBASIC/bg.d b/SMILEBASIC/bg.d index f91e58f..f0c3d08 100644 --- a/SMILEBASIC/bg.d +++ b/SMILEBASIC/bg.d @@ -237,7 +237,7 @@ class BG for(int i = x; i <= x2; i++) { chip[i + y * width] = BGChip(screendata[index] & 4095); - index = (index + 1) % screendata.length; + index = (index + 1) % cast(int)screendata.length; } } int get(int x, int y, int flag) diff --git a/SMILEBASIC/builtinfunctions.d b/SMILEBASIC/builtinfunctions.d index 601cb82..5e1f028 100644 --- a/SMILEBASIC/builtinfunctions.d +++ b/SMILEBASIC/builtinfunctions.d @@ -3590,42 +3590,32 @@ class BuiltinFunction } static void RSORT(Value[] arg) { + SORT(arg); + import std.range; int start, count; auto args = getSortArgument(arg, start, count); + import std.algorithm; int[] iarray; double[] darray; Array!wchar[] sarray; - if (args[0].type == ValueType.IntegerArray) + foreach (a; args) { - iarray = args[0].integerArray.array[start..start + count]; - } - if (args[0].type == ValueType.DoubleArray) - { - darray = args[0].doubleArray.array[start..start + count]; - } - if (args[0].type == ValueType.StringArray) - { - sarray = args[0].stringArray.array[start..start + count]; - } - if (args.length > 1) - { - mixin(sortGenerator!(8, "\"a[0]>b[0]\"")); - } - else - { - if (args[0].type == ValueType.IntegerArray) + if (a.type == ValueType.IntegerArray) { - sort!("a > b", SwapStrategy.stable)(iarray); + iarray = a.integerArray.array[start..start + count]; + reverse(iarray); } - if (args[0].type == ValueType.DoubleArray) + if (a.type == ValueType.DoubleArray) { - sort!("a > b", SwapStrategy.stable)(darray); + darray = a.doubleArray.array[start..start + count]; + reverse(darray); } - if (args[0].type == ValueType.StringArray) + if (a.type == ValueType.StringArray) { - sort!("a > b", SwapStrategy.stable)(sarray); + sarray = a.stringArray.array[start..start + count]; + reverse(sarray); } } }