Re: Accessing UDA of private field

2013-01-07 Thread Jacob Carlborg

On 2013-01-06 23:33, Philippe Sigaud wrote:


Good thinking. It's not pretty but it works. Thanks.


Maybe it can be hidden inside a template?


Yeah, I'll see what I can do.

--
/Jacob Carlborg


Re: Accessing UDA of private field

2013-01-07 Thread Tove

On Monday, 7 January 2013 at 10:19:45 UTC, Jacob Carlborg wrote:

On 2013-01-06 23:33, Philippe Sigaud wrote:


   Good thinking. It's not pretty but it works. Thanks.


Maybe it can be hidden inside a template?


Yeah, I'll see what I can do.


in which context does private fail? I'm using something like this:

struct my_struct
{
private:
  @(1) int t1;
  @(2) int t2;
  @(3) int t3;
}

foreach(m; __traits(allMembers, my_struct))
  with(my_struct.init)
pragma(msg, __traits(getAttributes, mixin(m)));


Re: Accessing UDA of private field

2013-01-07 Thread Jacob Carlborg

On 2013-01-07 12:59, Tove wrote:


in which context does private fail? I'm using something like this:

struct my_struct
{
private:
   @(1) int t1;
   @(2) int t2;
   @(3) int t3;
}

foreach(m; __traits(allMembers, my_struct))
   with(my_struct.init)
 pragma(msg, __traits(getAttributes, mixin(m)));


Using a mixin works.

--
/Jacob Carlborg


Re: Accessing UDA of private field

2013-01-07 Thread Tove

On Monday, 7 January 2013 at 13:36:47 UTC, Jacob Carlborg wrote:

On 2013-01-07 12:59, Tove wrote:

in which context does private fail? I'm using something like 
this:


struct my_struct
{
private:
  @(1) int t1;
  @(2) int t2;
  @(3) int t3;
}

foreach(m; __traits(allMembers, my_struct))
  with(my_struct.init)
pragma(msg, __traits(getAttributes, mixin(m)));


Using a mixin works.


but this seems to work too?

import std.traits;

struct my_struct
{
private:
  @(1) int t1;
  @(2) int t2;
  @(3) int t3;
}
void main()
{
  foreach(m; __traits(allMembers, my_struct))
pragma(msg, __traits(getAttributes, __traits(getMember, 
my_struct, m)));

}


Re: Accessing UDA of private field

2013-01-07 Thread David Nadlinger

On Monday, 7 January 2013 at 15:37:48 UTC, Tove wrote:

but this seems to work too?

import std.traits;

struct my_struct
{
private:
  @(1) int t1;
  @(2) int t2;
  @(3) int t3;
}
void main()
{
  foreach(m; __traits(allMembers, my_struct))
pragma(msg, __traits(getAttributes, __traits(getMember, 
my_struct, m)));

}


»private« means »accessible from this module« – are you running 
your tests with my_struct defined in a different module?


David


Accessing UDA of private field

2013-01-06 Thread Jacob Carlborg
I'm trying to adapt my serialization library, Orange, to use the new 
UDA's. Currently I have one template, NonSerialized, that I want to 
transfer to an UDA. This template works like:


class Foo
{
int a;
int b;

mixin NonSerialized!(b);
}

When serializing Foo b will not be serialized. What the template does 
is adding a static field to the class, like this:


class Foo
{
int a;
int b;

static enum __nonSerialized = [b];
}

Which I then can extract and use to exclude the fields from serialization.

This works fine to transfer to an UDA except in one case. That is when 
the field is not public. Orange will serialize all fields, regardless of 
the protection they have. I accomplish this by using the tupleof 
property of the class.


The problem is that to access a UDA attached to a field I need to pass a 
symbol to the __traits(getAttributes). With tupleof I can get the 
name, type and value of a field but I cannot get a symbol.


__traits(getMember) can be used to get the symbol but that will only 
work for public fields.


Does anyone have another solution? I had really hoped I could use UDA's 
in Orange.


https://github.com/jacob-carlborg/orange

--
/Jacob Carlborg


Re: Accessing UDA of private field

2013-01-06 Thread Philippe Sigaud
 The problem is that to access a UDA attached to a field I need to pass a
 symbol to the __traits(getAttributes). With tupleof I can get the name,
 type and value of a field but I cannot get a symbol.

 __traits(getMember) can be used to get the symbol but that will only work
 for public fields.


You can use a string mixin:

class Foo
{
int a;
@(3) private int b;
}

void main()
{
writeln(mixin(__traits(getAttributes,  ~ Foo.tupleof[1].stringof ~
))); // - 3
}


Re: Accessing UDA of private field

2013-01-06 Thread d coder
 You can use a string mixin:

 class Foo
 {
 int a;
 @(3) private int b;
 }

 void main()
 {
 writeln(mixin(__traits(getAttributes,  ~ Foo.tupleof[1].stringof ~
 ))); // - 3
 }




Hmm

This works only when main is in the same file (and therefor module) as Foo.

Regards
- Puneet


Re: Accessing UDA of private field

2013-01-06 Thread Philippe Sigaud
On Sun, Jan 6, 2013 at 7:46 PM, d coder dlang.co...@gmail.com wrote:


 You can use a string mixin:

 class Foo
 {
 int a;
 @(3) private int b;
 }

 void main()
 {
 writeln(mixin(__traits(getAttributes,  ~ Foo.tupleof[1].stringof ~
 ))); // - 3
 }




 Hmm

 This works only when main is in the same file (and therefor module) as Foo.


Yes, but the OP question was to get the attributes in a generic way. The
interesting part is the mixin, the rest is just scaffolding to print a
result.
If Jacob adopts this solution, he can insert these mixins where he needs
them.


Re: Accessing UDA of private field

2013-01-06 Thread Jacob Carlborg

On 2013-01-06 18:29, Philippe Sigaud wrote:


You can use a string mixin:

class Foo
{
 int a;
 @(3) private int b;
}

void main()
{
 writeln(mixin(__traits(getAttributes,  ~ Foo.tupleof[1].stringof
~ ))); // - 3
}


Good thinking. It's not pretty but it works. Thanks.

--
/Jacob Carlborg