contiguous ranges
Pasqui23 via Digitalmars-d
digitalmars-d at puremagic.com
Fri Feb 20 11:47:22 PST 2015
On Friday, 20 February 2015 at 12:23:49 UTC, Vlad Levenfeld wrote:
> Let me illustrate with an example:
>
> struct AudioClip {
> float[2][] samples;
> uint sampling_rate;
> this (string path) {load (path, samples);}
> void play () {some_C_audio_lib_call (samples.ptr,
> samples.length, sampling_rate);}
> }
>
> // we'll start with an audio clip with contiguous layout in
> memory
> auto ac = AudioClip ("90 minutes of screaming cats.flac");
>
> // now we define two implementations of the same filter
> auto ref declaw_filter1 (R)(R r) if (isContiguousRange!R) {
> // pattern match to get the size of the sample
> static if (is (ElementType!R == float[stride], uint
> stride)) {}
>
> // i know the gsl functions don't work like this, just bear
> with me
> gsl_fft (ptr, stride, r.length);
> gsl_fgemm (/*pretend this is sensible*/);
> gsl_fft_inverse (ptr, stride, r.length);
>
> return r;
> }
>
> auto declaw_filter2 (uint n)(float[n][] slice) {
> // like declaw_filter1 but without the contiguous stuff
> }
>
> // now, we can finish this one of two ways
> // the easy way:
> ac.declaw_filter1.play; // UFCS all day
> // or, if we passed a T[] made from AudioClip or defined
> AudioClip to be implicitly convertible to T[]:
> AudioClip ac2;
> ac2.samples = ac.declaw_filter2;
> ac2.sampling_rate = ac.sampling_rate; // this could
> desynchronize after the code is refactored, opening us up for
> bugs
> ac2.play;
You could have the best of both worlds this way:
R declaw_filter3(R)(R r)if(is(R:float[stride][],size_t stride))
and write
ac.declaw_filter3.play;
More information about the Digitalmars-d
mailing list