Thread overview
Classes and templates
Oct 31, 2016
Hefferman
Oct 31, 2016
Adam D. Ruppe
Oct 31, 2016
Hefferman
Oct 31, 2016
Meta
Oct 31, 2016
Hefferman
Oct 31, 2016
Kapps
Oct 31, 2016
John Colvin
Nov 01, 2016
Hefferman
October 31, 2016
Hello,

I've been trying to implement a class for sorting which accepts arrays which "different" data types. Hard to describe, here's my example (filename sorting.d):

[code]
import std.random;

void main()
{
    immutable uint N = 10_000;

    double[] arr = new double[](N);
    for (uint k = 0; k < N; k++) arr[k] = uniform(0, N);

    BubbleSort b = new BubbleSort();
    b.Sort(arr);
}

public class BubbleSort(T)
{
    private T[] a;
    private uint n;

    public void Sort(T)(T[] a) {
        this.a = a;
        n = a.length;
        bubblesort();
    }

    private void bubblesort() {
        bool sorted;

        do {
            sorted = true;
            for (uint k = 0; k < n; k++) {
                if (a[k] > a[k+1]) {
                    T tmp = a[k];
                    a[k] = a[k+1];
                    a[k+1] = tmp;
                    sorted = false;
                }
            }
            n--;
        } while (!sorted);
    }
}
[/code]

Whenever I try to compile this, it throws an error "class sorting.BubbleSort(T) is used as a type". How do I get a workaround?
October 31, 2016
On Monday, 31 October 2016 at 19:24:46 UTC, Hefferman wrote:
> Whenever I try to compile this, it throws an error "class sorting.BubbleSort(T) is used as a type". How do I get a workaround?

Give a template type when crating it

new BubbleSort!(string)

for example
October 31, 2016
On Monday, 31 October 2016 at 19:43:57 UTC, Adam D. Ruppe wrote:
> On Monday, 31 October 2016 at 19:24:46 UTC, Hefferman wrote:
>
> Give a template type when crating it
>
> new BubbleSort!(string)
>
> for example

Is it possible to create this using "typeof"?
E. g. "BubbleSort b = new BubbleSort!(typeof(arr));"
Compilation fails with that line....
October 31, 2016
On Monday, 31 October 2016 at 20:06:22 UTC, Hefferman wrote:
> On Monday, 31 October 2016 at 19:43:57 UTC, Adam D. Ruppe wrote:
>> On Monday, 31 October 2016 at 19:24:46 UTC, Hefferman wrote:
>>
>> Give a template type when crating it
>>
>> new BubbleSort!(string)
>>
>> for example
>
> Is it possible to create this using "typeof"?
> E. g. "BubbleSort b = new BubbleSort!(typeof(arr));"
> Compilation fails with that line....

You can't use an un-instantiated template as a type anyway, unlike Java. There the above is illegal because of `BubbleSort b = ...`. The symbol BubbleSort by itself is not a type; you have to instantiate it with template arguments to create a type. So you *could* do it like this:

BubbleSort!(typeof(arr)) b = new BubbleSort!(typeof(arr));

But that's too verbose. There's need need to repeat ourselves. You can instead use `auto` and omit the type of `b`, which will be inferred from the right hand side:

auto b = new BubbleSort!(typeof(arr));
October 31, 2016
On Monday, 31 October 2016 at 20:20:09 UTC, Meta wrote:
> [...]
>
> You can't use an un-instantiated template as a type anyway, unlike Java. There the above is illegal because of `BubbleSort b = ...`. The symbol BubbleSort by itself is not a type; you have to instantiate it with template arguments to create a type. So you *could* do it like this:
>
> BubbleSort!(typeof(arr)) b = new BubbleSort!(typeof(arr));
>
> But that's too verbose. There's need need to repeat ourselves. You can instead use `auto` and omit the type of `b`, which will be inferred from the right hand side:
>
> auto b = new BubbleSort!(typeof(arr));

Thanks! This compiled just fine...

[code]
import std.random;
import std.stdio;

void main()
{
    immutable uint N = 10_000;

    double[] arr = new double[](N);
    for (uint k = 0; k < N; k++) arr[k] = uniform(0, N);

    auto b = new BubbleSort!(typeof(arr));
    b.Sort(arr);
}

public class BubbleSort(T)
{
    private T[] a;
    private uint n;

    public void Sort(T)(T[] a) {
        n = a.length;
        bubblesort();
    }

    private void bubblesort() {
        bool sorted;

        do {
            sorted = true;
            for (uint k = 1; k < n; k++) {
                if (a[k-1] > a[k]) {
                    T tmp = a[k];
                    a[k] = a[k+1];
                    a[k+1] = tmp;
                    sorted = false;
                }
            }
            n--;
        } while (!sorted);
    }
}
[/code]

It gives a Range Violation upon executing, but I guess it's part of the algorithm....
October 31, 2016
On Monday, 31 October 2016 at 20:25:18 UTC, Hefferman wrote:
>             for (uint k = 1; k < n; k++) {
>                 if (a[k-1] > a[k]) {
>                     T tmp = a[k];
>                     a[k] = a[k+1];
>                     a[k+1] = tmp;
>                     sorted = false;
>                 }
>             }
>             n--;
>         } while (!sorted);
>     }
> }
> [/code]
>
> It gives a Range Violation upon executing, but I guess it's part of the algorithm....

The value of n is array length, so k reaches (n - 1), therefore k+1 gives you n which is out of bounds.
October 31, 2016
On Monday, 31 October 2016 at 19:24:46 UTC, Hefferman wrote:
> Hello,
>
> I've been trying to implement a class for sorting which accepts arrays which "different" data types. Hard to describe, here's my example (filename sorting.d):
>
> [...]

Glad to see you're getting helpful responses here, but just an FYI: https://forum.dlang.org/group/learn would be a more appropriate forum for questions like this.
November 01, 2016
On Monday, 31 October 2016 at 22:33:11 UTC, John Colvin wrote:
> On Monday, 31 October 2016 at 19:24:46 UTC, Hefferman wrote:
>> Hello,
>>
>> I've been trying to implement a class for sorting which accepts arrays which "different" data types. Hard to describe, here's my example (filename sorting.d):
>>
>> [...]
>
> Glad to see you're getting helpful responses here, but just an FYI: https://forum.dlang.org/group/learn would be a more appropriate forum for questions like this.

Thanks to all for replying!

@J.C.: I'll keep it in mind for the next time.