Sorting function with callback

Got an idea for enhancing PureBasic? New command(s) you'd like to see?
NilsH
New User
New User
Posts: 8
Joined: Sun Apr 16, 2017 8:46 pm
Location: Germany

Sorting function with callback

Post by NilsH »

Hi!
I think PureBasic could really use sorting functions that make use of a user-defined callback function to determine the sorting order.

The functions would look as follows:

Code: Select all

SortArrayCallback(ArrayToSort(), @Callback())
SortListCallback(ListToSort(), @Callback())
They accept the list or array to be sorted and the address of the callback function as parameters.

The callback function would be defined as follows:

Code: Select all

Procedure.i Callback(*Greater, *Lesser)
EndProcedure
It accepts two pointers to the elements to be compared. It should return #True if *Greater is greater (belongs closer to the end of list) than *Lesser or #False otherwise. By passing pointers instead of values to the callback, it is possible to use the same sorting function for native-typed as well as structured lists.

One use for this function is to sort a list by multiple criteria, like it can be done in SQL with "ORDER BY a, b, c".

Code: Select all

Structure People
  Name.s
  YearOfGraduation.i
EndStructure

NewList People.People()

AddElement(People())
People()\Name = "Bernard Einstein"
People()\YearOfGraduation = 1921

AddElement(People())
People()\Name = "Horst Schlämmer"
People()\YearOfGraduation = 1985

AddElement(People())
People()\Name = "Albert Einstein"
People()\YearOfGraduation = 1921

; Sort by year of graduation, sort people with same values by name
; like SQL "ORDER BY YearOfGraduation, Name"

Procedure Callback(*Greater.People, *Lesser.People)
  If *Greater\YearOfGraduation > *Lesser\YearOfGraduation Or
     (*Greater\YearOfGraduation = *Lesser\YearOfGraduation And *Greater\Name > *Lesser\Name)
    ProcedureReturn #True
  EndIf
  ProcedureReturn #False
EndProcedure

SortListCallback(People(), @Callback())
This code would sort People() by their year of graduation, and people with the same year of graduation would be sorted alphabetically by their names.

Another use is to sort a list by values that are not stored in the list elements themselves, but in other memory locations that are referenced by pointers inside the elements.

Code: Select all

Structure Engine
  Name.s
  Thrust.d
EndStructure

Structure Plane
  Name.s
  *Engine.Engine
  NumberOfEngines.i
EndStructure

; Engines

With Pratt.Engine
  \Name = "Pratt & Whitney TF30-P-412A"
  \Thrust = 68000
EndWith

With Tumanski.Engine
  \Name = "Tumanski R-95Sh"
  \Thrust = 40170
EndWith

; Planes

NewList Plane.Plane()

AddElement(Plane())
Plane()\Name = "Grumman F-14A"
Plane()\Engine = @Pratt
Plane()\NumberOfEngines = 2

AddElement(Plane())
Plane()\Name = "Sukhoi Su-25K"
Plane()\Engine = @Tumanski
Plane()\NumberOfEngines = 2

; Sort by total thrust

Procedure Callback(*Greater.Plane, *Lesser.Plane)
  If (*Greater\Engine\Thrust * *Greater\NumberOfEngines) > (*Lesser\Engine\Thrust * *Lesser\NumberOfEngines)
    ProcedureReturn #True
  EndIf
  ProcedureReturn #False
EndProcedure

SortListCallback(Plane(), @Callback())
This code would sort the planes by their total thrust, which is the number of engines (stored in the Plane structure) multiplied by the thrust of a single engine (stored in the Engine structure, referenced by the Plane structure).

Furthermore it would be useful if the sorting function accepts a *CallbackData parameter that is passed to the callback, allowing to (re-)configure the callback for different tasks, preventing the need for many different callbacks for each task.
This would look as follows:

Code: Select all

SortListCallback(ListToSort(), @Callback(), *CallbackData)
Procedure.i Callback(*Greater, *Lesser, *CallbackData)
EndProcedure
I hope my use cases demonstrate the usefulness of such sorting functions, so there is a chance they will be implemented.

Nils
User avatar
STARGÅTE
Addict
Addict
Posts: 2089
Joined: Thu Jan 10, 2008 1:30 pm
Location: Germany, Glienicke
Contact:

Re: Sorting function with callback

Post by STARGÅTE »

at the moment, you can use my CustomSortList http://www.purebasic.fr/english/viewtop ... =3&t=43230,
it do exactly what you wish, but the sort algorithm is only a bubble sort.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Lizard - Script language for symbolic calculations and moreTypeface - Sprite-based font include/module
User avatar
skywalk
Addict
Addict
Posts: 3999
Joined: Wed Dec 23, 2009 10:14 pm
Location: Boston, MA

Re: Sorting function with callback

Post by skywalk »

I use qsort() with custom callback comparison procedures for my structures.
The nice thing about standards is there are so many to choose from. ~ Andrew Tanenbaum
NilsH
New User
New User
Posts: 8
Joined: Sun Apr 16, 2017 8:46 pm
Location: Germany

Re: Sorting function with callback

Post by NilsH »

skywalk wrote:I use qsort() with custom callback comparison procedures for my structures.
This works only for arrays, not for lists. Also it relies on undocumented behavior (Import "" <- empty string).
STARGÅTE wrote:at the moment, you can use my CustomSortList http://www.purebasic.fr/english/viewtop ... =3&t=43230,
it do exactly what you wish, but the sort algorithm is only a bubble sort.
I already considered to implement my own sorting functions, but the problem is that PureBasic does not allow lists with undefined type as parameters. So I would have to define a custom sorting function for every type. The only workaround is using macros instead of procedures, like in STARGÅTE's code, but that's pretty inelegant. And implementing a more efficient algorithm like mergesort without using procedures sounds like a pain in the [human lower rear part], but I didn't try it.

I also considered to write a userlib to get around this limitation, but given the fact that I constantly hit the limitations of PureBasic lists and maps, I rather should get rid of the builtin lists completely and make my own linked lists using AllocateStructure(). I already partly did this because I needed lists with variable-typed elements. Or maybe I should port my whole project to C or C++ and do everything on my own.

Thanks anyway for your answers!

Nils
wilbert
PureBasic Expert
PureBasic Expert
Posts: 3870
Joined: Sun Aug 08, 2004 5:21 am
Location: Netherlands

Re: Sorting function with callback

Post by wilbert »

Here's another way of working around the problem but it still isn't very pretty :(

Code: Select all

; >>> Sort list by list pointer <<<

Macro CopyListPointer(t, p)
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
    !mov eax, [t]
    !mov [p], eax
  CompilerElse
    !mov rax, [t]
    !mov [p], rax
  CompilerEndIf
EndMacro

Prototype.i proto_cmp(*pointer, *pointer2)

Procedure SortListCallback_(List Elements(), *comparator.proto_cmp)
  Protected *e1, *e1_, *e2, *c
  ForEach Elements()
    *e2 = @Elements() : *e1_ = *e2 : *e1 = PreviousElement(Elements()) : *c = *e1
    While *e1 And *comparator(*e1, *e2) > 0
      *e1_ = *e1 : *e1 = PreviousElement(Elements())
    Wend
    ChangeCurrentElement(Elements(), *e2)
    If *e2 <> *e1_
      MoveElement(Elements(), #PB_List_Before, *e1_)
      ChangeCurrentElement(Elements(), *c)
    EndIf
  Next
EndProcedure

Prototype SortListCallback_proto(*list, *comparator)

Global SortListCallback.SortListCallback_proto = @SortListCallback_()

Code: Select all

; >>> Test sort list by list pointer <<<

Structure People
  Name.s
  YearOfGraduation.i
EndStructure

NewList People.People()
Define *PeopleList
CopyListPointer(t_People, p_PeopleList)

AddElement(People())
People()\Name = "Bernard Einstein"
People()\YearOfGraduation = 1921

AddElement(People())
People()\Name = "Horst Schlämmer"
People()\YearOfGraduation = 1985

AddElement(People())
People()\Name = "Albert Einstein"
People()\YearOfGraduation = 1921

; Sort by year of graduation, sort people with same values by name
; like SQL "ORDER BY YearOfGraduation, Name"

Procedure Callback(*Greater.People, *Lesser.People)
  If *Greater\YearOfGraduation > *Lesser\YearOfGraduation Or
     (*Greater\YearOfGraduation = *Lesser\YearOfGraduation And *Greater\Name > *Lesser\Name)
    ProcedureReturn #True
  EndIf
  ProcedureReturn #False
EndProcedure

SortListCallback(*PeopleList, @Callback())

ForEach People()
  Debug People()\Name
Next
Windows (x64)
Raspberry Pi OS (Arm64)
User avatar
skywalk
Addict
Addict
Posts: 3999
Joined: Wed Dec 23, 2009 10:14 pm
Location: Boston, MA

Re: Sorting function with callback

Post by skywalk »

NilsH wrote:
skywalk wrote:I use qsort() with custom callback comparison procedures for my structures.
This works only for arrays, not for lists. Also it relies on undocumented behavior (Import "" <- empty string).
You are correct.
The ImportC can be explicit if you like.
ImportC "msvcrt.lib"

While I would welcome the callback you propose, we do have the in memory SLQLite database for almost any config you can think of.
The nice thing about standards is there are so many to choose from. ~ Andrew Tanenbaum
NilsH
New User
New User
Posts: 8
Joined: Sun Apr 16, 2017 8:46 pm
Location: Germany

Re: Sorting function with callback

Post by NilsH »

I just wrote a user lib that does what I wanted. I just wanted to see if I can get it working, so I simply copied the bubblesort algorithm from Stargate's thread.

See below for the files. If you want to try it, copy PureLib\PBUserLib to your UserLibraries directory and run the .pb files. I compiled it on a 64-bit machine, so it most likely won't work on x86. If you wish to recompile it, install Pelles C, open the .ppj project file, compile it, run MakePureLib.bat and copy the new userlib to your UserLibraries directory!

Because the forum doesn't allow attachments, here's a base64-encoded ZIP file containing the user lib, its source files and a test program:

Code: Select all

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
AAEAIAAAABUEAABQQlVzZXJMaWIvUEJVc2VyTGliLmhQSwECFAAUAAIACACrDtxKiVyICkICAAAk
BQAAFwAAAAAAAAAAACAAAAC6BAAAUEJVc2VyTGliL1BCVXNlckxpYi5saWJQSwECFAAUAAIACAAz
u9tKTbtF8OgBAACUAwAAFwAAAAAAAAABACAAAAAxBwAAUEJVc2VyTGliL1BCVXNlckxpYi5wcGpQ
SwECFAAUAAIACAAzu9tKhp0E1jYAAABCAAAAFwAAAAAAAAABACAAAABOCQAAUEJVc2VyTGliL1BC
VXNlckxpYi5wcHhQSwECFAAUAAIACACrDtxK3CPV24MCAAAAFAAAFwAAAAAAAAAAACAAAAC5CQAA
UEJVc2VyTGliL1BCVXNlckxpYi50YWdQSwECFAAKAAAAAACsDtxKAAAAAAAAAAAAAAAAEgAAAAAA
AAAAABAAAABxDAAAUEJVc2VyTGliL1B1cmVMaWIvUEsBAhQAFAACAAgArA7cSvVoRR4tAgAANQIA
ABsAAAAAAAAAAAAgAAAAoQwAAFBCVXNlckxpYi9QdXJlTGliL1BCVXNlckxpYlBLAQIUABQAAgAI
ADYO3EpXNlwloQAAAN4AAAAgAAAAAAAAAAEAIAAAAAcPAABQQlVzZXJMaWIvUHVyZUxpYi9QQlVz
ZXJMaWIuZGVzY1BLAQIUABQAAgAIAKwO3Eqhib30PAAAAFwAAAAgAAAAAAAAAAEAIAAAAOYPAABQ
QlVzZXJMaWIvUHVyZUxpYnJhcmllc01ha2VyLmxvZ1BLAQIUABQAAgAIAFMN3EpDPeb5+wEAAIcE
AAAVAAAAAAAAAAEAIAAAAGAQAABQQlVzZXJMaWIvc29ydHRlc3QucGJQSwECFAAUAAIACAD7CtxK
bMHAkjMBAAD9AQAAEQAAAAAAAAABACAAAACOEgAAUEJVc2VyTGliL3Rlc3QucGJQSwUGAAAAABAA
EABLBAAA8BMAAAAA
Nils
Little John
Addict
Addict
Posts: 4527
Joined: Thu Jun 07, 2007 3:25 pm
Location: Berlin, Germany

Re: Sorting function with callback

Post by Little John »

+1 also from me for this feature request!
NilsH wrote:I already considered to implement my own sorting functions, but the problem is that PureBasic does not allow lists with undefined type as parameters. So I would have to define a custom sorting function for every type.
I wrote a Custom sort for Linked Lists module that utilizes a fast stable hybrid algorithm (MergeSort + InsertionSort).
But I hope that this important feature will be implemented in PureBasic soon.
Post Reply