www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - How to partially forward properties of struct array member to struct

reply "ParticlePeter" <ParticlePeter gmx.de> writes:
I am working on a struct vector. The data is stored in a member 
static array and I want to be able to forward all array 
properties except length to vector.
Reason is I have free functions f that take vector(s) as 
arguments, such that f(vector) and vector.f via UFCS is possible. 
Using alias array this in the case of length function/array 
property is problematic, as length(vector) obviously uses the 
free function but vector.length the array property.

What would be the simplest way to disable the array.length 
property for the vector struct?

I would prefer not to implement length as a vector member 
function and call it inside the free function as this is 
inconsistent with the other free funcs.
Sep 06 2015
next sibling parent reply "bioinfornatics" <bioinfornatics fedoraproject.org> writes:
On Sunday, 6 September 2015 at 07:34:36 UTC, ParticlePeter wrote:
 I am working on a struct vector. The data is stored in a member 
 static array and I want to be able to forward all array 
 properties except length to vector.
 Reason is I have free functions f that take vector(s) as 
 arguments, such that f(vector) and vector.f via UFCS is 
 possible. Using alias array this in the case of length 
 function/array property is problematic, as length(vector) 
 obviously uses the free function but vector.length the array 
 property.

 What would be the simplest way to disable the array.length 
 property for the vector struct?

 I would prefer not to implement length as a vector member 
 function and call it inside the free function as this is 
 inconsistent with the other free funcs.
Hi, If you are looking for somethin like delegator from ruby: http://ruby-doc.org/stdlib-2.0.0/libdoc/forwardable/rdoc/Forwardable.html they are in D template proxy; Or by using mixin delegates: http://forum.dlang.org/post/jitn9v$20u4$1 digitalmars.com
Sep 06 2015
parent reply "ParticlePeter" <ParticlePeter gmx.de> writes:
On Sunday, 6 September 2015 at 08:48:32 UTC, bioinfornatics wrote:
 On Sunday, 6 September 2015 at 07:34:36 UTC, ParticlePeter 
 wrote:
 I am working on a struct vector. The data is stored in a 
 member static array and I want to be able to forward all array 
 properties except length to vector.
 Reason is I have free functions f that take vector(s) as 
 arguments, such that f(vector) and vector.f via UFCS is 
 possible. Using alias array this in the case of length 
 function/array property is problematic, as length(vector) 
 obviously uses the free function but vector.length the array 
 property.

 What would be the simplest way to disable the array.length 
 property for the vector struct?

 I would prefer not to implement length as a vector member 
 function and call it inside the free function as this is 
 inconsistent with the other free funcs.
Hi, If you are looking for somethin like delegator from ruby: http://ruby-doc.org/stdlib-2.0.0/libdoc/forwardable/rdoc/Forwardable.html
No, not this one. It is O.k. for vector to be implicitly converted to an array, and in such a case array property length should be used.
 Or by using mixin delegates: 
 http://forum.dlang.org/post/jitn9v$20u4$1 digitalmars.com
I think this approach (in particular Jacobs suggestion) would be useful if I would like to forward array member properties for lot of different struct/classes but for now it is sufficient for the vector struct. I took a look at opIndex, opSlice, opIndexAssign and opIndexOpAssign but find the examples very confusing. Also its not clear for me which of these operators I have to implement to have full array functionality on the vector struct. In the end all that I want is "just" to disable access to array.length through vector and alias this array.
Sep 06 2015
parent "Kenji Hara" <k.hara.pg gmail.com> writes:
On Sunday, 6 September 2015 at 10:12:58 UTC, ParticlePeter wrote:
 In the end all that I want is "just" to disable access to 
 array.length through vector and alias this array.
struct Vec(T, size_t n = 3) { T[n] data; alias data this; disable property size_t length() const; } void main() { Vec!int v; v[0] = 1; // ok assert(v[0] == 1); // ok int n = v.length; // error } - Kenji
Sep 08 2015
prev sibling next sibling parent reply "Marc =?UTF-8?B?U2Now7x0eiI=?= <schuetzm gmx.net> writes:
Untested:

     struct Vector(T) {
         T[42] data;

         auto opDispatch(string func, Args...)(Args args)
         if(is(typeof(mixin("data."~func)(Args.init))) && func != 
"length")
         {
             return mixin("data."~func)(Args.init);
         }
     }
Sep 06 2015
parent "ParticlePeter" <ParticlePeter gmx.de> writes:
On Sunday, 6 September 2015 at 10:24:25 UTC, Marc Schütz wrote:
 Untested:

     struct Vector(T) {
         T[42] data;

         auto opDispatch(string func, Args...)(Args args)
         if(is(typeof(mixin("data."~func)(Args.init))) && func 
 != "length")
         {
             return mixin("data."~func)(Args.init);
         }
     }
Unfortunately not working, afaics the built in static array does not have the property opIndex et al. so they cannot be forwarded, right?
Sep 06 2015
prev sibling parent Steven Schveighoffer <schveiguy yahoo.com> writes:
On 9/6/15 3:34 AM, ParticlePeter wrote:
 I am working on a struct vector. The data is stored in a member static
 array and I want to be able to forward all array properties except
 length to vector.
 Reason is I have free functions f that take vector(s) as arguments, such
 that f(vector) and vector.f via UFCS is possible. Using alias array this
 in the case of length function/array property is problematic, as
 length(vector) obviously uses the free function but vector.length the
 array property.

 What would be the simplest way to disable the array.length property for
 the vector struct?

 I would prefer not to implement length as a vector member function and
 call it inside the free function as this is inconsistent with the other
 free funcs.
struct vector(T) { T[] _buf; alias _buf this; auto length() { return .length(this);} } -Steve
Sep 07 2015