QuickSort on ranges

Steven Schveighoffer schveiguy at gmail.com
Mon Oct 5 02:41:42 UTC 2020


On 10/4/20 6:50 AM, jerome wrote:
> Thanks you very much Ali,
> 
> I will try to wrap my head around your inputs, and get a better 
> understanding of ranges in the process. I feel there is a lot of power 
> in D ranges, and like the hammer of Thor, I am not worthy yet :)
> 

Just to elaborate a bit further: Templates work by pattern matching. 
When you say

quickSort(T)(T[] r)

You are saying, match the parameter T[] to what is passed, and if it's a 
match, set T to the part of the parameter that matches. Therefore:

int[] => T = int
ubyte[] => T = ubyte

But if you leave off the array brackets:

quickSort(T)(T r)

Now T matches *any type* that you pass in, including ranges. Most range 
functions use templates because there is no supertype for ranges. They 
are checked by trying to compile the range primitives on them.

How you do more advanced checks other than pattern matching, is to use a 
template constraint, as Ali suggests.

In fact, since you are just using std.algorithm.pivotPartition, you can 
just look at the constraints it uses:

if (isRandomAccessRange!Range && hasLength!Range && hasSlicing!Range && 
hasAssignableElements!Range)

-Steve


More information about the Digitalmars-d-learn mailing list