All pastes #2126176 Raw Edit

Stuff

public text v1 · immutable
#2126176 ·published 2012-03-08 16:00 UTC
rendered paste body
Macro SubSortStructuredArray(Arr, MainField, SubOptions, SubOffset, SubType)
  Define SubSort_Start, SubSort_I
  
  SubSort_Start = 0
  For SubSort_I = 1 To ArraySize(Arr())
    If Arr(SubSort_Start)\MainField <> Arr(SubSort_I)\MainField
      If SubSort_Start - (SubSort_I - 1) <> 0 ; Performance optimization
        ; Debug Str(SubSort_Start) + ", " + Str(subsort_i-1)
        SortStructuredArray(Arr(), SubOptions, SubOffset, SubType, SubSort_Start, SubSort_I-1)
      EndIf
      SubSort_Start = SubSort_I
    EndIf
  Next
  ; Debug Str(SubSort_Start) + ", " + Str(subsort_i-1)
  SortStructuredArray(Arr(), SubOptions, SubOffset, SubType, SubSort_Start, SubSort_I-1)
EndMacro


;- Example

Structure myABC
  a$
  b$
  c$
EndStructure

Define.i i, tw = 4
#max = 17
Dim myL.myABC(#max)

; Fill array
For i = 0 To #max
  Read.s myL(i)\a$
  Read.s myL(i)\b$
  Read.s myL(i)\c$
Next

; Print before sort
Debug "-- Before Sort --"
Debug LSet("a$", tw) + LSet("b$", tw) + LSet("c$", tw)
Debug LSet("--", tw) + LSet("--", tw) + LSet("--", tw)
For i = 0 To #max
  Debug LSet(myL(i)\a$, tw) + LSet(myL(i)\b$, tw) + LSet(myL(i)\c$, tw)
Next

; Primary sort on b$, secondary sort on c$, tertiary sort on $a
SortStructuredArray(myL(), #PB_Sort_Ascending | #PB_Sort_NoCase, OffsetOf(myABC\b$), #PB_Sort_String)
SubSortStructuredArray(myL, b$, #PB_Sort_Ascending | #PB_Sort_NoCase, OffsetOf(myABC\c$), #PB_Sort_String)
;                           ^ This is the key was previously sorted                  ^ This is the key that should be sorted next
SubSortStructuredArray(myL, c$, #PB_Sort_Ascending | #PB_Sort_NoCase, OffsetOf(myABC\a$), #PB_Sort_String)

; ; Primary sort on c$, secondary sort on b
; SortStructuredArray(myL(), #PB_Sort_Ascending | #PB_Sort_NoCase, OffsetOf(myABC\c$), #PB_Sort_String)
; SubSortStructuredArray(myL, c$, #PB_Sort_Ascending | #PB_Sort_NoCase, OffsetOf(myABC\b$), #PB_Sort_String)
; ;                           ^ This is the key was previously sorted                  ^ This is the key that should be sorted next
; ; Note: due to the nature of the example data, secondary sort on $b after sort on $c does nothing.


; Print after sort
Debug "-- After Sort on $b, $c, $a --"
Debug LSet("a$", tw) + LSet("b$", tw) + LSet("c$", tw)
Debug LSet("--", tw) + LSet("--", tw) + LSet("--", tw)
For i = 0 To #max
  Debug LSet(myL(i)\a$, tw) + LSet(myL(i)\b$, tw) + LSet(myL(i)\c$, tw)
Next

DataSection
  SortThis:
  ;       a$,  b$,  c$
  Data.s "a", "2", "5"
  Data.s "a", "2", "1"
  Data.s "x", "1", "b"
  Data.s "y", "1", "a"
  Data.s "z", "3", "z"
  Data.s "d", "3", "y"
  Data.s "n", "3", "x"
  Data.s "o", "5", "x"
  Data.s "n", "5", "x"
  Data.s "1", "3", "a"
  Data.s "2", "3", "a"
  Data.s "3", "3", "a"
  Data.s "1", "3", "x"
  Data.s "3", "3", "x"
  Data.s "1", "3", "y"
  Data.s "2", "3", "y"
  Data.s "3", "3", "y"
  Data.s "4", "3", "d"
EndDataSection