"inout return type" and "inout variable"

Hong Wing Hong_member at pathlink.com
Sat Mar 18 03:02:53 PST 2006


Hi, yes! exactly that's the problem for me, I am writing a protein modeling
software and use vector and matrices heavily, and I start to see things like:
*result = (*v1) + (*v2) * (*v3)

notice how all the * * * starts to make things very cluttered.

The problem also came about when I try to use DTL with structs, I cannot find a
way to change a matrix inside a vector efficiently without copying the whole
matrix out and copy it back. minTL supports lookup method to get a pointer to
the struct, on top of it's [] method.

Efficiency is essential for me,

Hong Wing

In article <ops6lufyj923k2f5 at nrage.netwin.co.nz>, Regan Heath says...
>
>On Sat, 18 Mar 2006 23:14:46 +1300, Regan Heath <regan at netwin.co.nz> wrote:
>>> 3. you cannot call operators from pointers, without adding in *  
>>> everywhere.
>
>I should mention that some operators, i.e. += don't work so well either.
>
>So, yeah, there are some problems with the pointer syntax. I think if  
>you're running into these sorts of things you should consider using a  
>class instead of a struct.
>
>Regan
>
>> Partially true, i.e. when you're trying to add two Foo* together,  
>> however you can add the following to the Foo struct to add a Foo* to a  
>> Foo:
>>
>> 	Foo opAdd(Foo rhs)
>> 	{
>> 		Foo n;
>> 		
>> 		n.x = x+rhs.x;
>> 		n.y = y+rhs.y;
>> 		n.z = z+rhs.z;
>> 	}
>> 	
>> 	Foo opAdd(Foo* rhs)
>> 	{
>> 		return opAdd(*rhs);
>> 	}	
>>
>> Regan
>>
>>
>>> In article <ops6i24bii23k2f5 at nrage.netwin.co.nz>, Regan Heath says...
>>>>
>>>> On Thu, 16 Mar 2006 06:34:34 +0000 (UTC), Hong Wing
>>>> <Hong_member at pathlink.com> wrote:
>>>>> Thanks everyone here for your great work in D, especially Walter who
>>>>> makes it
>>>>> all happen.
>>>>> Here I am requesting a feature, which is "inout variable" and "inout
>>>>> return
>>>>> type"
>>>>> Rationale, for the example below,
>>>>>
>>>>> struct Foo
>>>>> {
>>>>> int x, int y, int z;
>>>>> }
>>>>>
>>>>> class Bar
>>>>> {
>>>>> private:
>>>>> Foo m_foo;
>>>>> public:
>>>>> Foo foo() { return m_foo; }
>>>>> Foo foo(Foo value) { return m_foo = value; }
>>>>> }
>>>>>
>>>>> now if i want to change the value of m_foo.x to 5, i have to do
>>>>>
>>>>> Foo foo = bar.foo;
>>>>> foo.x   = 5;
>>>>> bar.foo = foo;
>>>>>
>>>>> it would be nice if I can define a return type as "inout Foo"
>>>>> inout Foo foo() { return m_foo;}
>>>>>
>>>>> To extend it further, one might want to define inout variables as
>>>>> inout Foo foo = bar.foo;
>>>>>
>>>>> Advantages:
>>>>>
>>>>> 1. efficiency, one can directly change the states of the struct  
>>>>> instead
>>>>> of
>>>>> making a copy first, change the copy, and put the result back to the
>>>>> struct
>>>>>
>>>>> 2. less buggy, having to type 3 lines always increases chance of bugs,
>>>>> also,
>>>>> someone might inadvertantly do bar.foo.x = 5 and forgot that he is
>>>>> working on a
>>>>> copy
>>>>>
>>>>> 3. reduce the use of pointers, the above can be achieved using  
>>>>> pointers,
>>>>> but it
>>>>> means defining two versions of the same method every time a struct
>>>>> property is
>>>>> written.
>>>>
>>>> You're essentially asking for the ability to have variables which are
>>>> references to structs (at least during assignment) and to return
>>>> references to structs, all without using the pointer syntax. I think  
>>>> these
>>>> things are un-necessary, and I think what you want can be achieved with
>>>> pointers, without the penalty you mention in #3 above, see:
>>>>
>>>> import std.string;
>>>> import std.stdio;
>>>>
>>>> struct Foo
>>>> {
>>>> 	int x;
>>>> 	int y;
>>>> 	int z;
>>>> 	char[] toString() { return
>>>> "("~std.string.toString(x)~","~std.string.toString(y)~","~std.string.toString(z)~")";
>>>> }
>>>> }
>>>>
>>>> class Bar
>>>> {
>>>> private:
>>>> 	Foo m_foo;
>>>> public:
>>>> 	Foo* foo() { return &m_foo; }
>>>> 	Foo* foo(Foo* value) { m_foo = *value; return foo(); }	
>>>> 	Foo* foo(Foo value)  { m_foo = value;  return foo(); }
>>>> }
>>>>
>>>> void main()
>>>> {
>>>> 	Bar b = new Bar();
>>>> 	Bar c = new Bar();
>>>> 	Foo t;
>>>> 	
>>>> 	b.foo.x = 1;
>>>> 	b.foo.y = 2;
>>>> 	b.foo.z = 3;	
>>>> 	writefln(b.foo.toString());
>>>> 	
>>>> 	c.foo = b.foo;
>>>> 	writefln(c.foo.toString());
>>>> 	
>>>> 	t.x = 4;
>>>> 	t.y = 5;
>>>> 	t.z = 6;
>>>> 	writefln(t.toString());
>>>> 	
>>>> 	b.foo = t;
>>>> 	writefln(b.foo.toString());
>>>> }
>>>>
>>>> Note: The explicit "toString" calls are required because otherwise it
>>>> prints the pointer address.
>>>>
>>>> Regan
>>>
>>>
>>
>





More information about the Digitalmars-d mailing list