digitalmars.D - Object - part of the language, or part of Phobos?
- Steve Teale (18/18) Sep 30 2011 module smem;
- Jonathan M Davis (4/25) Sep 30 2011 Object is part of druntime, so it's in neither the language itself nor P...
- Steve Teale (8/8) Sep 30 2011 Jonathan,
- Jonathan M Davis (8/21) Sep 30 2011 I don't really know the implementation details on that level, which is w...
- Jacob Carlborg (14/22) Oct 01 2011 I'm pretty sure the compiler needs to provide this information, then the...
- Steve Teale (20/20) Oct 01 2011 Jacob,
- Jacob Carlborg (13/33) Oct 01 2011 If you get a tuple of the values you want to set you can just do like th...
- Steve Teale (3/3) Oct 01 2011 Jacob,
- Sean Kelly (10/22) Oct 01 2011 TypeInfo instances are generated by the compiler. The types are simply d...
- Steve Teale (1/1) Sep 30 2011 Hmm - class TypeInfo is hardly implemented at all!
module smem; import std.stdio; struct X { int n; double d; char[] a; } void main() { X x; TypeInfo typeinfo = typeid(x); // or typeid(x) for that matter writefln("%s", typeinfo); // smem.X OffsetTypeInfo[] tia = typeinfo.offTi(); // "Get type information on the contents of the type; null if not available" writeln((tia is null)? "null": ""); // null // Under what circumstances is the OffsetTypeInfo information available? }
Sep 30 2011
On Saturday, October 01, 2011 05:38:45 Steve Teale wrote:module smem; import std.stdio; struct X { int n; double d; char[] a; } void main() { X x; TypeInfo typeinfo = typeid(x); // or typeid(x) for that matter writefln("%s", typeinfo); // smem.X OffsetTypeInfo[] tia = typeinfo.offTi(); // "Get type information on the contents of the type; null if not available" writeln((tia is null)? "null": ""); // null // Under what circumstances is the OffsetTypeInfo information available? }Object is part of druntime, so it's in neither the language itself nor Phobos, but it's fairly closely tied to the language. It's in object_.d in druntime. - Jonathan M Davis
Sep 30 2011
Jonathan, I had a secondary question - under what circumstances is the OffsetTypeInfo available? Since it's not part of the language, I guess whoever implemented the current runtime just chose not to provide it, or it's a bug. I'll check out the code. I want to associate a struct with a database row in my database wrapper, and that information would be very useful. The struct.tupleof goes so far, but the offset information is not accessible unless you know what field to ask for it on. Steve
Sep 30 2011
On Saturday, October 01, 2011 06:20:17 Steve Teale wrote:Jonathan, I had a secondary question - under what circumstances is the OffsetTypeInfo available? Since it's not part of the language, I guess whoever implemented the current runtime just chose not to provide it, or it's a bug. I'll check out the code. I want to associate a struct with a database row in my database wrapper, and that information would be very useful. The struct.tupleof goes so far, but the offset information is not accessible unless you know what field to ask for it on.I don't really know the implementation details on that level, which is why I didn't give more information. It's probably in druntime. There's a set of stuff in druntime (like the GC) which the language depends on but which is part of druntime rather than the compiler, so it's sort of in the language and sort of not. Object is one of those. So, what you're looking for is probably in there, but again, I'm not that familiar with all of the implementation details. - Jonathan M Davis
Sep 30 2011
On 2011-10-01 08:20, Steve Teale wrote:Jonathan, I had a secondary question - under what circumstances is the OffsetTypeInfo available? Since it's not part of the language, I guess whoever implemented the current runtime just chose not to provide it, or it's a bug. I'll check out the code. I want to associate a struct with a database row in my database wrapper, and that information would be very useful. The struct.tupleof goes so far, but the offset information is not accessible unless you know what field to ask for it on. SteveI'm pretty sure the compiler needs to provide this information, then the runtime puts it in OffsetTypeInfo. If it doesn't there's no way to provided that using OffsetTypeInfo. Are you really sure you want to depend on the field offset of a struct? If the order of the fields in the struct change, won't all code the that relies on the offset break? Wouldn't it be much better to depend on the names instead? If you really want to use the offset you should be able to use: Struct.field.offsetof; Documented here: http://www.d-programming-language.org/struct.html Search for "Struct Field Properties". -- /Jacob Carlborg
Oct 01 2011
Jacob, So lets say I've got a result set from a database. I was thinking it would be tidy and convenient if you could dress the result set up as a random access range, and just pop the current row into a user defined struct without having to copy each field, and was wondering if D had sufficient introspection to let me do this in a way that was reasonably robust. If the compiler could tell me the names of the struct fields and the offsets, then I could get the column names and types from the database, and bingo! But it cant. Nonetheless, I was experimenting, and then I noticed that the class TypeInfo OffsetTypeInfo[] offTi() method does not return anything useful. That might be understandable if TypeInfo applied only to classes. Derived classes could make this method do something useful. But it doesn't - you can get an instance for __all types__ via typeid. So the implementation in the runtime should provide some sensible information for structs. Hence this thread. I can get the field types and offsets using templates defined in std.traits and std.typecons, but there's no way to get the names of the fields. However, I may still do it. The situation I'm considering is one where the programmer is in charge and can make the call as to whether the convenience is worth the risk. I can only protect her against type mismatches. Steve
Oct 01 2011
On 2011-10-01 15:26, Steve Teale wrote:Jacob, So lets say I've got a result set from a database. I was thinking it would be tidy and convenient if you could dress the result set up as a random access range, and just pop the current row into a user defined struct without having to copy each field, and was wondering if D had sufficient introspection to let me do this in a way that was reasonably robust. If the compiler could tell me the names of the struct fields and the offsets, then I could get the column names and types from the database, and bingo! But it cant.If you get a tuple of the values you want to set you can just do like this: Struct s; s.tupleof = values;Nonetheless, I was experimenting, and then I noticed that the class TypeInfo OffsetTypeInfo[] offTi() method does not return anything useful. That might be understandable if TypeInfo applied only to classes. Derived classes could make this method do something useful. But it doesn't - you can get an instance for __all types__ via typeid. So the implementation in the runtime should provide some sensible information for structs. Hence this thread. I can get the field types and offsets using templates defined in std.traits and std.typecons, but there's no way to get the names of the fields.You don't need std.typecons or std.traits for that. You can get the field types using: typeof(Struct.tupleof) And you can get the names of the fields using a bit of tupleof and stringof magic. Have a look at: https://github.com/jacob-carlborg/orange/blob/master/orange/util/Reflection.d#L212 You might find some other useful functions in that module as well.However, I may still do it. The situation I'm considering is one where the programmer is in charge and can make the call as to whether the convenience is worth the risk. I can only protect her against type mismatches. Steve-- /Jacob Carlborg
Oct 01 2011
Jacob, Yes, magic - particularly the typeof(Struct.tupleof) bit! Thanks Steve
Oct 01 2011
TypeInfo instances are generated by the compiler. The types are simply defin= ed in druntime. Same with ModuleInfo.=20 Sent from my iPhone On Sep 30, 2011, at 11:20 PM, Steve Teale <steve.teale britseyeview.com> wro= te:Jonathan, =20 I had a secondary question - under what circumstances is the OffsetTypeInf=o available?=20 Since it's not part of the language, I guess whoever implemented the curre=ntruntime just chose not to provide it, or it's a bug. I'll check out the co=de.=20 I want to associate a struct with a database row in my database wrapper, a=nd thatinformation would be very useful. The struct.tupleof goes so far, but the o=ffsetinformation is not accessible unless you know what field to ask for it on.==20 Steve
Oct 01 2011
Hmm - class TypeInfo is hardly implemented at all!
Sep 30 2011