Thread overview | |||||||
---|---|---|---|---|---|---|---|
|
September 04, 2013 Defining inout returned values for ranges | ||||
---|---|---|---|---|
| ||||
If a range struct (Range) is defined inside another struct (Test), how can the constness or mutability of Test be attributed to the return type of Range.front? I'm running into this problem because I need the range to be iterated, but I need the pointer in T to be marked const when appropriate. Thank you, JC Pseudo-Example: struct Test { static struct T { uint* ptr; } ... auto opSlice() inout { static struct Range { inout(T) front() @property { ... } ... } return Range(); } } |
September 04, 2013 Re: Defining inout returned values for ranges | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jonathan Crapuchettes | On Wednesday, 4 September 2013 at 00:56:39 UTC, Jonathan Crapuchettes wrote: > If a range struct (Range) is defined inside another struct (Test), how > can the constness or mutability of Test be attributed to the return type > of Range.front? I'm running into this problem because I need the range to > be iterated, but I need the pointer in T to be marked const when > appropriate. > > Thank you, > JC > > Pseudo-Example: > struct Test > { > static struct T > { > uint* ptr; > } > ... > > auto opSlice() inout > { > static struct Range > { > inout(T) front() @property > { > ... > } > ... > } > > return Range(); > } > } You can use a Template This Parameter [1] instead of inout: ---- auto opSlice(this This)() { static if(is(This == const)) alias QualifiedT = const T; else alias QualifiedT = T; static struct Range { QualifiedT front() @property { ---- [1] http://dlang.org/template.html#TemplateThisParameter |
September 05, 2013 Re: Defining inout returned values for ranges | ||||
---|---|---|---|---|
| ||||
Posted in reply to anonymous | On Wed, 04 Sep 2013 11:49:41 +0200, anonymous wrote:
> On Wednesday, 4 September 2013 at 00:56:39 UTC, Jonathan Crapuchettes wrote:
>> If a range struct (Range) is defined inside another struct (Test), how can the constness or mutability of Test be attributed to the return type of Range.front? I'm running into this problem because I need the range to be iterated, but I need the pointer in T to be marked const when appropriate.
>>
>> Thank you,
>> JC
>>
>> Pseudo-Example:
>> struct Test {
>> static struct T {
>> uint* ptr;
>> }
>> ...
>>
>> auto opSlice() inout {
>> static struct Range {
>> inout(T) front() @property {
>> ...
>> }
>> ...
>> }
>>
>> return Range();
>> }
>> }
>
>
> You can use a Template This Parameter [1] instead of inout:
> ----
> auto opSlice(this This)()
> {
> static if(is(This == const)) alias QualifiedT = const T;
> else alias QualifiedT = T;
>
> static struct Range {
> QualifiedT front() @property {
> ----
>
> [1] http://dlang.org/template.html#TemplateThisParameter
Thank you for the help. That worked, but now I ran into another similar issue. What if the Range struct is being defined outside of the opSlice method? I have a number of methods in a struct that return the same range type and would rather not have to have duplicate code or need to use mixins.
JC
|
September 05, 2013 Re: Defining inout returned values for ranges | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jonathan Crapuchettes | On Thursday, 5 September 2013 at 19:19:42 UTC, Jonathan Crapuchettes wrote: > On Wed, 04 Sep 2013 11:49:41 +0200, anonymous wrote: [...] >> You can use a Template This Parameter [1] instead of inout: >> ---- >> auto opSlice(this This)() >> { >> static if(is(This == const)) alias QualifiedT = const T; >> else alias QualifiedT = T; >> >> static struct Range { >> QualifiedT front() @property { >> ---- >> >> [1] http://dlang.org/template.html#TemplateThisParameter > > Thank you for the help. That worked, but now I ran into another similar > issue. What if the Range struct is being defined outside of the opSlice > method? I have a number of methods in a struct that return the same range > type and would rather not have to have duplicate code or need to use > mixins. > > JC Templatize Range and pass it This: ---- static struct Range(This) { static if(is(This == const)) alias QualifiedT = const T; else alias QualifiedT = T; QualifiedT front() @property {...} } auto opSlice(this This)() { return Range!This(); } ... more methods in the style of opSlice ... ---- If you need QualifiedT in opSlice, make it a template over This, too. |
September 06, 2013 Re: Defining inout returned values for ranges | ||||
---|---|---|---|---|
| ||||
Posted in reply to anonymous | On Thu, 05 Sep 2013 23:32:10 +0200, anonymous wrote:
> On Thursday, 5 September 2013 at 19:19:42 UTC, Jonathan Crapuchettes wrote:
>> On Wed, 04 Sep 2013 11:49:41 +0200, anonymous wrote:
> [...]
>>> You can use a Template This Parameter [1] instead of inout:
>>> ----
>>> auto opSlice(this This)()
>>> {
>>> static if(is(This == const)) alias QualifiedT = const
>>> T;
>>> else alias QualifiedT = T;
>>>
>>> static struct Range {
>>> QualifiedT front() @property {
>>> ----
>>>
>>> [1] http://dlang.org/template.html#TemplateThisParameter
>>
>> Thank you for the help. That worked, but now I ran into another similar issue. What if the Range struct is being defined outside of the opSlice method? I have a number of methods in a struct that return the same range type and would rather not have to have duplicate code or need to use mixins.
>>
>> JC
>
> Templatize Range and pass it This:
> ----
> static struct Range(This)
> {
> static if(is(This == const)) alias QualifiedT = const T;
> else alias QualifiedT = T;
>
> QualifiedT front() @property {...}
> }
>
> auto opSlice(this This)()
> {
> return Range!This();
> }
>
> ... more methods in the style of opSlice ...
> ----
>
> If you need QualifiedT in opSlice, make it a template over This, too.
Thank you again. It all appears to be working correctly.
JC
|
Copyright © 1999-2021 by the D Language Foundation