www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - This is probably trivial or impossible Code Introspection...

reply WhatMeWorry <kheaser gmail.com> writes:
given some struct:

writeln("face.glyph.bitmap = ", face.glyph.bitmap);

which displays the following:

face.glyph.bitmap = FT_Bitmap(30, 25, 25, 4105948, 256, 2, 0, 
null)

Is there a way for D to display the variable names within the 
FT_Bitmap?

For instance, the following code snippet outputs:

foreach (i, member; face.glyph.bitmap.tupleof) {
     writefln("Member %s:", i);
     writefln("  type : %s", typeof(member).stringof);
     writefln("  value: %s", member);
}

Member 0:
   type : int
   value: 30
Member 1:
   type : int
   value: 25
// dot...dot...dot
Member 6:
   type : byte
   value: 0
Member 7:
   type : void*
   value: null

So I've got type and value of each member, but I want their 
actual names?

My first naive attempt was to try member.stringof but this just 
returns the string "member".    Thanks.
Sep 19 2015
parent reply Adam D. Ruppe <destructionator gmail.com> writes:
On Saturday, 19 September 2015 at 19:52:56 UTC, WhatMeWorry wrote:
 So I've got type and value of each member, but I want their 
 actual names?
http://dlang.org/phobos/std_traits.html#FieldNameTuple You can also do something like `foo.tupleof[idx]["foo.".length .. $]` for an individual thing but the phobos one should be the nicest.
Sep 19 2015
parent reply WhatMeWorry <kheaser gmail.com> writes:
On Saturday, 19 September 2015 at 19:54:45 UTC, Adam D. Ruppe 
wrote:
 On Saturday, 19 September 2015 at 19:52:56 UTC, WhatMeWorry 
 wrote:
 So I've got type and value of each member, but I want their 
 actual names?
http://dlang.org/phobos/std_traits.html#FieldNameTuple You can also do something like `foo.tupleof[idx]["foo.".length .. $]` for an individual thing but the phobos one should be the nicest.
Thanks. But now I have an even more fundamental problem. I keep getting a FieldNameTuple is not defined. But I've clearly got the import statement. I even copied the example from Phobos verbatim: import std.traits; struct S { int x; float y; } static assert(FieldNameTuple!S == TypeTuple!("x", "y")); But I still get the error. Error: template instance FieldNameTuple!S template 'FieldNameTuple' is not defined I've been working for hours on this stupid thing.
Sep 19 2015
next sibling parent =?UTF-8?Q?Ali_=c3=87ehreli?= <acehreli yahoo.com> writes:
On 09/19/2015 10:21 PM, WhatMeWorry wrote:
 On Saturday, 19 September 2015 at 19:54:45 UTC, Adam D. Ruppe wrote:
 On Saturday, 19 September 2015 at 19:52:56 UTC, WhatMeWorry wrote:
 So I've got type and value of each member, but I want their actual
 names?
http://dlang.org/phobos/std_traits.html#FieldNameTuple You can also do something like `foo.tupleof[idx]["foo.".length .. $]` for an individual thing but the phobos one should be the nicest.
Thanks. But now I have an even more fundamental problem. I keep getting a FieldNameTuple is not defined. But I've clearly got the import statement. I even copied the example from Phobos verbatim: import std.traits; struct S { int x; float y; } static assert(FieldNameTuple!S == TypeTuple!("x", "y")); But I still get the error. Error: template instance FieldNameTuple!S template 'FieldNameTuple' is not defined I've been working for hours on this stupid thing.
This compiles and passes the assert for me with v2.068.2-b1: import std.traits; import std.meta; struct S { int x; float y; } static assert(FieldNameTuple!S == AliasSeq!("x", "y")); void main() {} (std.meta.AliasSeq is the new name for std.typetuple.TypeTuple but TypeTuple still works.) Ali
Sep 19 2015
prev sibling parent reply "H. S. Teoh via Digitalmars-d-learn" <digitalmars-d-learn puremagic.com> writes:
On Sun, Sep 20, 2015 at 05:21:03AM +0000, WhatMeWorry via Digitalmars-d-learn
wrote:
[...]
 Thanks.  But now I have an even more fundamental problem.  I keep
 getting a FieldNameTuple is not defined.  But I've clearly got the
 import statement.  I even copied the example from Phobos verbatim:
 
 import std.traits;
 
 struct S { int x; float y; }
 static assert(FieldNameTuple!S == TypeTuple!("x", "y"));
You need to use is(...) when comparing types: static assert(is(FieldNameTuple!S == TypeTuple!("x", "y"))); HTH, --T
Sep 19 2015
parent reply =?UTF-8?Q?Ali_=c3=87ehreli?= <acehreli yahoo.com> writes:
On 09/19/2015 10:30 PM, H. S. Teoh via Digitalmars-d-learn wrote:
 On Sun, Sep 20, 2015 at 05:21:03AM +0000, WhatMeWorry via Digitalmars-d-learn
wrote:
 [...]
 Thanks.  But now I have an even more fundamental problem.  I keep
 getting a FieldNameTuple is not defined.  But I've clearly got the
 import statement.  I even copied the example from Phobos verbatim:

 import std.traits;

 struct S { int x; float y; }
 static assert(FieldNameTuple!S == TypeTuple!("x", "y"));
You need to use is(...) when comparing types: static assert(is(FieldNameTuple!S == TypeTuple!("x", "y"))); HTH, --T
True but ever-confusingly, they are not types. :) It works without the is expression. Otherwise, we need to add typeofs as well: static assert(is(typeof(FieldNameTuple!S) == typeof(AliasSeq!("x", "y")))); Ali
Sep 19 2015
parent WhatMeWorry <kheaser gmail.com> writes:
On Sunday, 20 September 2015 at 05:50:16 UTC, Ali Çehreli wrote:
 On 09/19/2015 10:30 PM, H. S. Teoh via Digitalmars-d-learn 
 wrote:
 On Sun, Sep 20, 2015 at 05:21:03AM +0000, WhatMeWorry via 
 Digitalmars-d-learn wrote:
 [...]
 Thanks.  But now I have an even more fundamental problem.  I 
 keep
 getting a FieldNameTuple is not defined.  But I've clearly 
 got the
 import statement.  I even copied the example from Phobos 
 verbatim:

 import std.traits;

 struct S { int x; float y; }
 static assert(FieldNameTuple!S == TypeTuple!("x", "y"));
You need to use is(...) when comparing types: static assert(is(FieldNameTuple!S == TypeTuple!("x", "y"))); HTH, --T
True but ever-confusingly, they are not types. :) It works without the is expression. Otherwise, we need to add typeofs as well: static assert(is(typeof(FieldNameTuple!S) == typeof(AliasSeq!("x", "y")))); Ali
Should of tried this earlier, but just for grins I threw in another trait: EnumMembers. import std.traits; struct S { int x; float y; } static assert(FieldNameTuple!S == TypeTuple!("x", "y")); // FAILS enum E : int { a, b, c } int[] abc = cast(int[]) [ EnumMembers!E ]; // WORKS The EnumMembers from traits compiles/links fine. Ergo, it must be I've got an old version of D Lib? I see on the web site that D Lib is now at 2.068.1 Looking at my old folders, I see a dmd-2.066_0-OneClickWindowInstaller folder that I must of used around October 2014 for my initial install. Is there a tool or subsystem that I can use to see the history or FildNameTyple? Now, I need to figure out how to upgrade my D, DMD or Phobos (not sure about terminology) without disturbing my Visual D environment. Wish me luck :) Thanks for helping me with these beginner questions.
Sep 20 2015