Runtime introspection, or how to get class members at runtime Fin D

2018-06-06 Thread Arafel via Digitalmars-d-learn

Hi,

What is the state of runtime introspection in D, specifically for 
classes? Is there any way to get *at runtime* the (public or otherwise 
accessible) members of a class?


I have had a look as TypeInfo_Class [1], but apparently I can only get a 
list of types and offsets... which would be almost good enough, if not 
because the names of the members are missing, or at least I haven't been 
able to find them.


In this case, what I'm trying to do is to serialize / dump / print the 
contents of an object (class instance) without knowing its actual 
runtime type.


Before somebody suggests compile time introspection, the "main" code 
where this routine lives only provides a base class, and it's up to 
dlopen'ed plugins to provide the actual implementation... so I'm sorry 
but no compile-time solution can possibly work.


Also, having each derivative class provide their own dumping information 
is not practical, I'd rather have it automated.


I know it might not be the most idiomatic D, but as somebody with mostly 
a Java background (with some C and just a bit of C++) it seems something 
really straightforward to me: myObject.getClass().getFields() [2].


Also, I know I could add some UDA or even crawl the modules and have 
this information generated automatically at compilation time and added 
to the type itself in a member, and I might even end up doing it, but 
honestly, I think it's something that the language should provide in a 
kind of easy / accessible way.


Powerful as compile-time introspection is, I think runtime shouldn't be 
forgotten either :-)


Thanks,

A.

[1]: https://dlang.org/library/object/type_info__class.html
[2]: 
https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html#getFields--


Re: Runtime introspection, or how to get class members at runtime Fin D

2018-06-06 Thread rikki cattermole via Digitalmars-d-learn

On 07/06/2018 1:28 AM, Arafel wrote:

Hi,

What is the state of runtime introspection in D, specifically for 
classes? Is there any way to get *at runtime* the (public or otherwise 
accessible) members of a class?


No.

I have had a look as TypeInfo_Class [1], but apparently I can only get a 
list of types and offsets... which would be almost good enough, if not 
because the names of the members are missing, or at least I haven't been 
able to find them.


You don't want TypeInfo.

In this case, what I'm trying to do is to serialize / dump / print the 
contents of an object (class instance) without knowing its actual 
runtime type.


Before somebody suggests compile time introspection, the "main" code 
where this routine lives only provides a base class, and it's up to 
dlopen'ed plugins to provide the actual implementation... so I'm sorry 
but no compile-time solution can possibly work.


Also, having each derivative class provide their own dumping information 
is not practical, I'd rather have it automated.


I know it might not be the most idiomatic D, but as somebody with mostly 
a Java background (with some C and just a bit of C++) it seems something 
really straightforward to me: myObject.getClass().getFields() [2].


Doesn't exist.




how to sort the container Array from std.container

2018-06-06 Thread Flaze07 via Digitalmars-d-learn

I know that sort accepts Range( I am correct right ? ), so,
Array!uint arr;
//inserts element to arr
sort( arr.Range );
don't work, it says cannot pass RangeT!(Array!uint) as function 
argument


Re: Runtime introspection, or how to get class members at runtime Fin D

2018-06-06 Thread Arafel via Digitalmars-d-learn

On 06/06/2018 03:30 PM, rikki cattermole wrote:

You don't want TypeInfo.


Why not (genuine question)? There's even myObject.classinfo, and I can 
only assume that there's some reason why it's there...




In this case, what I'm trying to do is to serialize / dump / print the 
contents of an object (class instance) without knowing its actual 
runtime type.


Before somebody suggests compile time introspection, the "main" code 
where this routine lives only provides a base class, and it's up to 
dlopen'ed plugins to provide the actual implementation... so I'm sorry 
but no compile-time solution can possibly work.


Also, having each derivative class provide their own dumping 
information is not practical, I'd rather have it automated.


I know it might not be the most idiomatic D, but as somebody with 
mostly a Java background (with some C and just a bit of C++) it seems 
something really straightforward to me: 
myObject.getClass().getFields() [2].


Doesn't exist.




Well, thanks for the quick and succinct answer... I guess the question 
now would be how realistic it would be to propose such an addition to 
the language... Has it already been discussed? (I tried searching the 
forum, but didn't find anything relevant)


I know it's got a runtime penalty, but realistically speaking, spending 
some bytes for the field names in the TypeInfo of a class shouldn't be 
that much of a problem?




Re: how to sort the container Array from std.container

2018-06-06 Thread Adam D. Ruppe via Digitalmars-d-learn

On Wednesday, 6 June 2018 at 13:44:09 UTC, Flaze07 wrote:

sort( arr.Range );
don't work, it says cannot pass RangeT!(Array!uint) as function 
argument


Range is the type, you want the value

I think you can do

sort(arr[])

maybe


Re: Runtime introspection, or how to get class members at runtime Fin D

2018-06-06 Thread rikki cattermole via Digitalmars-d-learn

On 07/06/2018 1:44 AM, Arafel wrote:

On 06/06/2018 03:30 PM, rikki cattermole wrote:

You don't want TypeInfo.


Why not (genuine question)? There's even myObject.classinfo, and I can 
only assume that there's some reason why it's there...




In this case, what I'm trying to do is to serialize / dump / print 
the contents of an object (class instance) without knowing its actual 
runtime type.


Before somebody suggests compile time introspection, the "main" code 
where this routine lives only provides a base class, and it's up to 
dlopen'ed plugins to provide the actual implementation... so I'm 
sorry but no compile-time solution can possibly work.


Also, having each derivative class provide their own dumping 
information is not practical, I'd rather have it automated.


I know it might not be the most idiomatic D, but as somebody with 
mostly a Java background (with some C and just a bit of C++) it seems 
something really straightforward to me: 
myObject.getClass().getFields() [2].


Doesn't exist.




Well, thanks for the quick and succinct answer... I guess the question 
now would be how realistic it would be to propose such an addition to 
the language... Has it already been discussed? (I tried searching the 
forum, but didn't find anything relevant)


I know it's got a runtime penalty, but realistically speaking, spending 
some bytes for the field names in the TypeInfo of a class shouldn't be 
that much of a problem?


It is not an easy task building a reflection API from scratch. I'm one 
of the many that have tried. There is also push back from those who 
consider it "bloat" and don't need it.


You can't just extend TypeInfo, it was never designed for it.


Re: Runtime introspection, or how to get class members at runtime Fin D

2018-06-06 Thread Adam D. Ruppe via Digitalmars-d-learn

On Wednesday, 6 June 2018 at 13:44:39 UTC, Arafel wrote:
Why not (genuine question)? There's even myObject.classinfo, 
and I can only assume that there's some reason why it's there...


It holds just barely enough info for dynamic casting, GC, and 
other language implementation stuff.


(and then Object.factory for some weird reason, which actually 
causes bloat for so little benefit)


Well, thanks for the quick and succinct answer... I guess the 
question now would be how realistic it would be to propose such 
an addition to the language... Has it already been discussed?


It is possible to add it to the runtime library right now 
(there's a thing called rtInfo in there made to hold it, it is 
just null right now), just people fight over even a few bytes of 
added metadata. So if it is added, it would surely be some opt-in 
thing that will require your thing be recompiled anyway.


If you can recompile the library, you can add a parallel extended 
info thing (MyReflectionInfo[TypeInfo] array perhaps, populated 
by a static this() ctor created via compile time reflection) that 
gives what you need.


But if you can't recompile the library, the field names are 
simply not there


Re: how to sort the container Array from std.container

2018-06-06 Thread Flaze07 via Digitalmars-d-learn

On Wednesday, 6 June 2018 at 13:46:41 UTC, Adam D. Ruppe wrote:

On Wednesday, 6 June 2018 at 13:44:09 UTC, Flaze07 wrote:

sort( arr.Range );
don't work, it says cannot pass RangeT!(Array!uint) as 
function argument


Range is the type, you want the value

I think you can do

sort(arr[])

maybe


I see why it works, so, [] is called slice operator right ?
and in 
https://dlang.org/phobos/std_container_array.html#.Array.opSlice 
it returns range, so that's why it worked


Re: how to sort the container Array from std.container

2018-06-06 Thread rikki cattermole via Digitalmars-d-learn

On 07/06/2018 1:58 AM, Flaze07 wrote:

On Wednesday, 6 June 2018 at 13:46:41 UTC, Adam D. Ruppe wrote:

On Wednesday, 6 June 2018 at 13:44:09 UTC, Flaze07 wrote:

sort( arr.Range );
don't work, it says cannot pass RangeT!(Array!uint) as function argument


Range is the type, you want the value

I think you can do

sort(arr[])

maybe


I see why it works, so, [] is called slice operator right ?
and in https://dlang.org/phobos/std_container_array.html#.Array.opSlice 
it returns range, so that's why it worked


Yes.


Re: Runtime introspection, or how to get class members at runtime Fin D

2018-06-06 Thread Arafel via Digitalmars-d-learn

On 06/06/2018 03:52 PM, Adam D. Ruppe wrote:


It is possible to add it to the runtime library right now (there's a 
thing called rtInfo in there made to hold it, it is just null right 
now), just people fight over even a few bytes of added metadata. So if 
it is added, it would surely be some opt-in thing that will require your 
thing be recompiled anyway.


If I wanted to add it myself, would I need to create a personalised D 
compiler and/or D Runtime? That would be probably way too much for me :) 
Also, it would have to be distributed and used to create the plugins...




If you can recompile the library, you can add a parallel extended info 
thing (MyReflectionInfo[TypeInfo] array perhaps, populated by a static 
this() ctor created via compile time reflection) that gives what you need.




Yeah, I had some ideas in this regard, still I would like it to be 
transparent from the plugin creator point of view, but I don't know if 
it would be possible to contain everything in the base class... so far I 
had though about a base class like this:


```
import std.traits;
import std.meta;

TypeInfo[string][TypeInfo_Class] RTInfo;

class Base {
this(this C)() {
if (typeid(C) in RTInfo)
return;
RTInfo[typeid(C)] = (TypeInfo[string]).init;
static foreach_reverse(Type; AliasSeq!(C, BaseClassesTuple!C)) {
static foreach(string field; FieldNameTuple!Type) {
RTInfo[typeid(Type)][field] = 
typeid(typeof(__traits(getMember, Type, field)));

}
}
}
}

```

But I think children classes can bypass this constructor, so I guess 
it's not so easy, will have to keep trying :-)


A templated static this would be cool, though:

class Base {
static this(this C)() {
// ...
}
}

Apparently it's not possible :-(


Re: how to sort the container Array from std.container

2018-06-06 Thread Flaze07 via Digitalmars-d-learn

On Wednesday, 6 June 2018 at 14:06:54 UTC, rikki cattermole wrote:

On 07/06/2018 1:58 AM, Flaze07 wrote:

On Wednesday, 6 June 2018 at 13:46:41 UTC, Adam D. Ruppe wrote:

On Wednesday, 6 June 2018 at 13:44:09 UTC, Flaze07 wrote:

sort( arr.Range );
don't work, it says cannot pass RangeT!(Array!uint) as 
function argument


Range is the type, you want the value

I think you can do

sort(arr[])

maybe


I see why it works, so, [] is called slice operator right ?
and in 
https://dlang.org/phobos/std_container_array.html#.Array.opSlice it returns range, so that's why it worked


Yes.


hmm, and sorry for asking more, what about removing an element 
from it ? I found no remove operation that can remove from the 
middle ( removeAny and removeBack both removes the latest 
element, linearRemove receive Array!uint...which  don't know how 
to provide )


Re: how to sort the container Array from std.container

2018-06-06 Thread rikki cattermole via Digitalmars-d-learn

On 07/06/2018 2:20 AM, Flaze07 wrote:

On Wednesday, 6 June 2018 at 14:06:54 UTC, rikki cattermole wrote:

On 07/06/2018 1:58 AM, Flaze07 wrote:

On Wednesday, 6 June 2018 at 13:46:41 UTC, Adam D. Ruppe wrote:

On Wednesday, 6 June 2018 at 13:44:09 UTC, Flaze07 wrote:

sort( arr.Range );
don't work, it says cannot pass RangeT!(Array!uint) as function 
argument


Range is the type, you want the value

I think you can do

sort(arr[])

maybe


I see why it works, so, [] is called slice operator right ?
and in 
https://dlang.org/phobos/std_container_array.html#.Array.opSlice it 
returns range, so that's why it worked


Yes.


hmm, and sorry for asking more, what about removing an element from it ? 
I found no remove operation that can remove from the middle ( removeAny 
and removeBack both removes the latest element, linearRemove receive 
Array!uint...which  don't know how to provide )


filter will remove any and all occurrences of whatever you tell it to. 
But only in the range not the origin data structure.


Re: how to sort the container Array from std.container

2018-06-06 Thread Flaze07 via Digitalmars-d-learn

On Wednesday, 6 June 2018 at 14:24:15 UTC, rikki cattermole wrote:

On 07/06/2018 2:20 AM, Flaze07 wrote:
On Wednesday, 6 June 2018 at 14:06:54 UTC, rikki cattermole 
wrote:

On 07/06/2018 1:58 AM, Flaze07 wrote:

[...]


Yes.


hmm, and sorry for asking more, what about removing an element 
from it ? I found no remove operation that can remove from the 
middle ( removeAny and removeBack both removes the latest 
element, linearRemove receive Array!uint...which  don't know 
how to provide )


filter will remove any and all occurrences of whatever you tell 
it to. But only in the range not the origin data structure.


what about removing certain index ?


Re: how to sort the container Array from std.container

2018-06-06 Thread rikki cattermole via Digitalmars-d-learn

On 07/06/2018 2:27 AM, Flaze07 wrote:

On Wednesday, 6 June 2018 at 14:24:15 UTC, rikki cattermole wrote:

On 07/06/2018 2:20 AM, Flaze07 wrote:

On Wednesday, 6 June 2018 at 14:06:54 UTC, rikki cattermole wrote:

On 07/06/2018 1:58 AM, Flaze07 wrote:

[...]


Yes.


hmm, and sorry for asking more, what about removing an element from 
it ? I found no remove operation that can remove from the middle ( 
removeAny and removeBack both removes the latest element, 
linearRemove receive Array!uint...which  don't know how to provide )


filter will remove any and all occurrences of whatever you tell it to. 
But only in the range not the origin data structure.


what about removing certain index ?


Indexes and ranges don't usually go together.


Re: how to sort the container Array from std.container

2018-06-06 Thread Flaze07 via Digitalmars-d-learn

On Wednesday, 6 June 2018 at 14:29:28 UTC, rikki cattermole wrote:

On 07/06/2018 2:27 AM, Flaze07 wrote:
On Wednesday, 6 June 2018 at 14:24:15 UTC, rikki cattermole 
wrote:

On 07/06/2018 2:20 AM, Flaze07 wrote:
On Wednesday, 6 June 2018 at 14:06:54 UTC, rikki cattermole 
wrote:

[...]


hmm, and sorry for asking more, what about removing an 
element from it ? I found no remove operation that can 
remove from the middle ( removeAny and removeBack both 
removes the latest element, linearRemove receive 
Array!uint...which  don't know how to provide )


filter will remove any and all occurrences of whatever you 
tell it to. But only in the range not the origin data 
structure.


what about removing certain index ?


Indexes and ranges don't usually go together.


welp, ok then, thank you


Re: Runtime introspection, or how to get class members at runtime Fin D

2018-06-06 Thread Steven Schveighoffer via Digitalmars-d-learn

On 6/6/18 9:28 AM, Arafel wrote:

Hi,

What is the state of runtime introspection in D, specifically for 
classes? Is there any way to get *at runtime* the (public or otherwise 
accessible) members of a class?


There is very little runtime reflection capability. The position has 
always been that you can *build* runtime reflection given compile-time 
reflection.


object has rtInfo, as Adam says, which is built to be able to extend 
TypeInfo. But at the moment, it's not used for anything, and likely will 
stay that way for a while.


Note, you CAN build runtime reflection using mixins, but other than 
rtInfo, there's no way to instrument modules you don't control. Even 
that's a high bar, since you would then have to have a modified druntime.


-Steve


Re: how to sort the container Array from std.container

2018-06-06 Thread Steven Schveighoffer via Digitalmars-d-learn

On 6/6/18 10:20 AM, Flaze07 wrote:

On Wednesday, 6 June 2018 at 14:06:54 UTC, rikki cattermole wrote:

On 07/06/2018 1:58 AM, Flaze07 wrote:

On Wednesday, 6 June 2018 at 13:46:41 UTC, Adam D. Ruppe wrote:

On Wednesday, 6 June 2018 at 13:44:09 UTC, Flaze07 wrote:

sort( arr.Range );
don't work, it says cannot pass RangeT!(Array!uint) as function 
argument


Range is the type, you want the value

I think you can do

sort(arr[])

maybe


I see why it works, so, [] is called slice operator right ?
and in 
https://dlang.org/phobos/std_container_array.html#.Array.opSlice it 
returns range, so that's why it worked


Yes.


hmm, and sorry for asking more, what about removing an element from it ? 
I found no remove operation that can remove from the middle ( removeAny 
and removeBack both removes the latest element, linearRemove receive 
Array!uint...which  don't know how to provide )


To remove element 5, for example:
arr.linearRemove(arr[5 .. 6]);

-Steve


Re: how to sort the container Array from std.container

2018-06-06 Thread ag0aep6g via Digitalmars-d-learn

On 06/06/2018 04:20 PM, Flaze07 wrote:
hmm, and sorry for asking more, what about removing an element from it ? 
I found no remove operation that can remove from the middle ( removeAny 
and removeBack both removes the latest element, linearRemove receive 
Array!uint...which  don't know how to provide )


I think removeKey would be the container primitive for that. I don't 
know if there's a reason why it isn't implemented for Array. Maybe it's 
just an oversight.


You can use linearRemove like this:


import std.container.array: Array;
import std.stdio: writeln;
void main()
{
Array!int a = [1, 2, 100, 200, 300, 3, 4];
a.linearRemove(a[2 .. 5]);
/* Removes elements at indices 2, 3, and 4. */
writeln(a[]); /* Prints "[1, 2, 3, 4]". */
}



Re: Orange serializer/deserializer

2018-06-06 Thread Jacob Carlborg via Digitalmars-d-learn

On 2018-06-05 20:14, InfiniteDimensional wrote:
I'm also having some issue now when I changed a type from using a class 
to using it's base interface


Unhandled exception: 
orange.serialization.SerializationException.SerializationException The 
object of the static type "const(ItemInterface)" have a different 
runtime type (Item) and therefore needs to either register its type or 
register a serializer for its type "Item". at 
..\..\..\orange\serialization\SerializationException.d(25)


Item inherits from ItemInterface.

I was storing a list of Items and changed it to store ItemInterface

Item[] -> ItemInterface[]

and this is when the error happened.

Of course, I'd expect the interface not being serializable(although, 
maybe @properties should be?) it would be nice if it would store the 
actual type in it's place(an Item). Else, this prevents me from using 
interfaces.


D doesn't support any runtime reflection (or very little). All 
reflection is done at compile time, i.e. getting all the fields. If the 
static type and the dynamic type differs Orange cannot properly 
serialize the dynamic type. For that to work you need to register all 
dynamic types that are expected to be serialized through a base class or 
interface. See this example [1].


[1] 
https://github.com/jacob-carlborg/orange/blob/master/tests/BaseClass.d#L73


--
/Jacob Carlborg


Re: Orange serializer/deserializer

2018-06-06 Thread Jacob Carlborg via Digitalmars-d-learn

On 2018-06-05 19:47, InfiniteDimensional wrote:


Thanks.

I'm having problems preventing void* pointers from not being serialized

..\..\..\orange\serialization\Serializer.d(975): Error: expression 
`*value` is `void` and has no value


..\..\..\orange\serialization\Serializer.d(1491): Error: new can only 
create structs, dynamic arrays or class objects, not `void`'s



and all I've added to my class is

@nonSerialized void* ptr;

It seems that the (de)serializer should just ignore all void's no matter 
what. They can't be serialized to any meaningful thing. Maybe spit a 
warning out if the uda is not added. Usually pointer values are not 
meant to be serialized anyways.


Adding "@nonSerialized" did not help?

--
/Jacob Carlborg


Re: Runtime introspection, or how to get class members at runtime Fin D

2018-06-06 Thread Jacob Carlborg via Digitalmars-d-learn

On 2018-06-06 15:28, Arafel wrote:

Hi,

What is the state of runtime introspection in D, specifically for 
classes? Is there any way to get *at runtime* the (public or otherwise 
accessible) members of a class?


I have had a look as TypeInfo_Class [1], but apparently I can only get a 
list of types and offsets... which would be almost good enough, if not 
because the names of the members are missing, or at least I haven't been 
able to find them.


In this case, what I'm trying to do is to serialize / dump / print the 
contents of an object (class instance) without knowing its actual 
runtime type.


Before somebody suggests compile time introspection, the "main" code 
where this routine lives only provides a base class, and it's up to 
dlopen'ed plugins to provide the actual implementation... so I'm sorry 
but no compile-time solution can possibly work.


Also, having each derivative class provide their own dumping information 
is not practical, I'd rather have it automated.


I know it might not be the most idiomatic D, but as somebody with mostly 
a Java background (with some C and just a bit of C++) it seems something 
really straightforward to me: myObject.getClass().getFields() [2].


Also, I know I could add some UDA or even crawl the modules and have 
this information generated automatically at compilation time and added 
to the type itself in a member, and I might even end up doing it, but 
honestly, I think it's something that the language should provide in a 
kind of easy / accessible way.


Powerful as compile-time introspection is, I think runtime shouldn't be 
forgotten either :-)


The simplest, in my opinion would be to for the subclasses to register 
themselves with the serializer. This is how Orange works to allow 
serializing through base class references [1]. The use compile time 
introspection on the subclass and serialize that as usual.


[1] 
https://github.com/jacob-carlborg/orange/blob/master/tests/BaseClass.d#L73


--
/Jacob Carlborg


Re: Confusion/trying to understand CTFE keywords

2018-06-06 Thread jmh530 via Digitalmars-d-learn

On Monday, 4 June 2018 at 03:18:05 UTC, Jonathan M Davis wrote:

[snip]

If you haven't yet, I'd suggest reading


Would make a good blog series?


Re: Orange serializer/deserializer

2018-06-06 Thread InfiniteDimensional via Digitalmars-d-learn

On Wednesday, 6 June 2018 at 16:34:52 UTC, Jacob Carlborg wrote:

On 2018-06-05 20:14, InfiniteDimensional wrote:
I'm also having some issue now when I changed a type from 
using a class to using it's base interface


Unhandled exception: 
orange.serialization.SerializationException.SerializationException The object of the static type "const(ItemInterface)" have a different runtime type (Item) and therefore needs to either register its type or register a serializer for its type "Item". at ..\..\..\orange\serialization\SerializationException.d(25)


Item inherits from ItemInterface.

I was storing a list of Items and changed it to store 
ItemInterface


Item[] -> ItemInterface[]

and this is when the error happened.

Of course, I'd expect the interface not being 
serializable(although, maybe @properties should be?) it would 
be nice if it would store the actual type in it's place(an 
Item). Else, this prevents me from using interfaces.


D doesn't support any runtime reflection (or very little). All 
reflection is done at compile time, i.e. getting all the 
fields. If the static type and the dynamic type differs Orange 
cannot properly serialize the dynamic type. For that to work 
you need to register all dynamic types that are expected to be 
serialized through a base class or interface. See this example 
[1].


[1] 
https://github.com/jacob-carlborg/orange/blob/master/tests/BaseClass.d#L73



I did register the main derived type and everything seems to 
work. Why do I have to reset the registered types?


I still can't have a void* in my class though ;/ My exact code is

@nonSerialized void* ptr;


commenting out passes, else I get the errors

\orange\serialization\Serializer.d(975): Error: expression 
`*value` is `void` and has no value
\orange\serialization\Serializer.d(1605): Error: template 
instance 
`orange.serialization.Serializer.Serializer.serializePointer!(inout(void)*)` error instantiating
\orange\serialization\Serializer.d(1698):instantiated 
from here: `objectStructSerializeHelper!(inout(Item))`
\orange\serialization\Serializer.d(1616):instantiated 
from here: `serializeBaseTypes!(item)`
\orange\serialization\Serializer.d(261):instantiated from 
here: `objectStructSerializeHelper!(item)`
\orange\serialization\Serializer.d(247):instantiated from 
here: `downcastSerialize!(item)`

main.d(50):instantiated from here: `register!(item)`
\orange\serialization\Serializer.d(1609): Error: template 
instance 
`orange.serialization.Serializer.Serializer.serializeInternal!(inout(void*))` error instantiating
\orange\serialization\Serializer.d(1698):instantiated 
from here: `objectStructSerializeHelper!(inout(Item))`
\orange\serialization\Serializer.d(1616):instantiated 
from here: `serializeBaseTypes!(item)`
\orange\serialization\Serializer.d(261):instantiated from 
here: `objectStructSerializeHelper!(item)`
\orange\serialization\Serializer.d(247):instantiated from 
here: `downcastSerialize!(item)`

main.d(50):instantiated from here: `register!(item)`
\orange\serialization\Serializer.d(1491): Error: new can only 
create structs, dynamic arrays or class objects, not `void`'s
\orange\serialization\Serializer.d(1653): Error: template 
instance 
`orange.serialization.Serializer.Serializer.deserializePointer!(void*)` error instantiating
\orange\serialization\Serializer.d(1709):instantiated 
from here: `objectStructDeserializeHelper!(Item)`
\orange\serialization\Serializer.d(1688):instantiated 
from here: `deserializeBaseTypes!(item)`
\orange\serialization\Serializer.d(264):instantiated from 
here: `objectStructDeserializeHelper!(item)`
\orange\serialization\Serializer.d(247):instantiated from 
here: `downcastSerialize!(item)`

main.d(50):instantiated from here: `register!(item)`


changing void* ptr to int* ptr and everything works so this is an 
issue in orange.


when changing to int it serializes to









Re: Confusion/trying to understand CTFE keywords

2018-06-06 Thread Jonathan M Davis via Digitalmars-d-learn
On Wednesday, June 06, 2018 18:18:16 jmh530 via Digitalmars-d-learn wrote:
> On Monday, 4 June 2018 at 03:18:05 UTC, Jonathan M Davis wrote:
> > [snip]
> >
> > If you haven't yet, I'd suggest reading
>
> Would make a good blog series?

What would make a good blog series? Something talking about CTFE?

- Jonathan M Davis



Configuring DerelictGL3

2018-06-06 Thread Entity325 via Digitalmars-d-learn
Updating my dev environment to the latest version of DMD, which 
means I updated to the latest versions of all of the Derelict 
libraries I use. Everything seems to be mostly in order(changed 
all the old references to "import derelict.opengl3.gl" to "import 
derelict.opengl"), except I'm getting a bunch of missing 
references that I can't for the life of me figure out what I'm 
doing wrong.


||=== Build: testbench in Materium D (compiler: Digital Mars D 
Compiler) ===|
materium\core\display.d|366|Error: undefined identifier 
`glTranslatef`|
materium\core\display.d|371|Error: undefined identifier 
`glEnableClientState`|
materium\core\display.d|376|Error: undefined identifier 
`glEnableClientState`|
materium\core\display.d|452|Error: undefined identifier 
`glDisableClientState`|
materium\core\display.d|455|Error: undefined identifier 
`glDisableClientState`|
materium\core\display.d|517|Error: undefined identifier 
`glShadeModel`|
materium\core\display.d|1379|Error: undefined identifier 
`glMatrixMode`|
materium\core\display.d|1380|Error: undefined identifier 
`glLoadIdentity`|
materium\core\display.d|1390|Error: undefined identifier 
`glOrtho`|
materium\core\display.d|1404|Error: undefined identifier 
`glFrustum`|
materium\core\display.d|1410|Error: undefined identifier 
`glMatrixMode`|
materium\core\display.d|1411|Error: undefined identifier 
`glLoadIdentity`|
||=== Build failed: 12 error(s), 0 warning(s) (0 minute(s), 3 
second(s)) ===|


I've been searching for about a day and I thought I might be 
trying to use deprecated functionality, but attempting to load 
the deprecated functions according to the documentation page did 
a whole lot of nothing, and I can't imagine things like 
"glEnable/DisableClientState" are deprecated.


I'm in the middle of adding shader support to the project I'm 
working on, finally bringing it out of the OpenGL 1.1-era dark 
ages and into the present day, but otherwise everything was 
working pretty well before the update.


Re: Configuring DerelictGL3

2018-06-06 Thread Rene Zwanenburg via Digitalmars-d-learn

On Wednesday, 6 June 2018 at 23:26:23 UTC, Entity325 wrote:
I can't imagine things like "glEnable/DisableClientState" are 
deprecated.


They are. All the missing symbols are indeed deprecated.

attempting to load the deprecated functions according to the 
documentation page did a whole lot of nothing


Could you post the exact code you used? I'm not using the old 
functions, but that should work.


Re: Configuring DerelictGL3

2018-06-06 Thread Entity325 via Digitalmars-d-learn

On Wednesday, 6 June 2018 at 23:43:34 UTC, Rene Zwanenburg wrote:

On Wednesday, 6 June 2018 at 23:26:23 UTC, Entity325 wrote:
I can't imagine things like "glEnable/DisableClientState" are 
deprecated.


They are. All the missing symbols are indeed deprecated.

Oh, I see where my confusion came from. I was getting 
glEnableClientState confused with glVertexAttribArray, and 
assumed glShadeModel was relevant to shaders, and not just to the 
built-in lighting model used.


...It's been a while since I touched this code.

attempting to load the deprecated functions according to the 
documentation page did a whole lot of nothing


Could you post the exact code you used? I'm not using the old 
functions, but that should work.
The actual source file all those calls are made in weighs in at 
over 1000 lines, and is mostly not related to the problem I'm 
having here.


Anyway.

I added the line, "mixin glContext!(GLVersion.gl33);" after the 
import statement. I didn't do anything with the context because I 
assumed SDL2 handled that, and creating my own would likely break 
the code.


I'll work a bit with the testing project I put together (which is 
a little easier to experiment on than a 1000+ line fully featured 
display module created by a madman) and report back on my results.


Re: Confusion/trying to understand CTFE keywords

2018-06-06 Thread Gopan via Digitalmars-d-learn

On Tuesday, 5 June 2018 at 22:08:32 UTC, Stefan Koch wrote:
On Tuesday, 5 June 2018 at 18:00:05 UTC, Steven Schveighoffer 
wrote:


No, it's definitely a bug. main is not being evaluated at 
compile time. The real result of this function should be a 
compile-time error -- __ctfe is a *runtime* value that is 
always defined based on whether you are __ctfe or not. 
Therefore, n must be a runtime value, and not usable as a 
static array dimension.


If the posted code is valid, then this should be valid as well:

static if(__ctfe)
   immutable n = 1;
else
   immutable n = 2;

But it's not.

-Steve


I see what you mean.
I fear fixing this bug will not be easy without breaking 
arguably valid uses.


Will it be feasible something like

int n = CTFE(foo(3)); //dont limit CTFE to enum or immutable, 
etc.  You are calling explicitly.

int[n] arr;

So that, we can be explicit about when CTFE kicks in.  In that 
case, don't assign value to n at runtime as it has been 
initialized at compile time.  This way, we can get rid of the 
intermediate enums which are introduced just for the sake of 
inviting CTFE.  Also, this way, it will not silently break 
existing code; instead a compilation error must be thrown "value 
of n not known at compile time" for the below code.


immutable n = foo();
int[n] arr;

Unless called throgh CTFE(), dont go for CTFE.

Will this work?

Just putting my thoughts... I am no expert.


Re: Confusion/trying to understand CTFE keywords

2018-06-06 Thread Jonathan M Davis via Digitalmars-d-learn
On Thursday, June 07, 2018 04:41:35 Gopan via Digitalmars-d-learn wrote:
> On Tuesday, 5 June 2018 at 22:08:32 UTC, Stefan Koch wrote:
> > On Tuesday, 5 June 2018 at 18:00:05 UTC, Steven Schveighoffer
> >
> > wrote:
> >> No, it's definitely a bug. main is not being evaluated at
> >> compile time. The real result of this function should be a
> >> compile-time error -- __ctfe is a *runtime* value that is
> >> always defined based on whether you are __ctfe or not.
> >> Therefore, n must be a runtime value, and not usable as a
> >> static array dimension.
> >>
> >> If the posted code is valid, then this should be valid as well:
> >>
> >> static if(__ctfe)
> >>
> >>immutable n = 1;
> >>
> >> else
> >>
> >>immutable n = 2;
> >>
> >> But it's not.
> >>
> >> -Steve
> >
> > I see what you mean.
> > I fear fixing this bug will not be easy without breaking
> > arguably valid uses.
>
> Will it be feasible something like
>
> int n = CTFE(foo(3)); //dont limit CTFE to enum or immutable,
> etc.  You are calling explicitly.
> int[n] arr;
>
> So that, we can be explicit about when CTFE kicks in.  In that
> case, don't assign value to n at runtime as it has been
> initialized at compile time.  This way, we can get rid of the
> intermediate enums which are introduced just for the sake of
> inviting CTFE.  Also, this way, it will not silently break
> existing code; instead a compilation error must be thrown "value
> of n not known at compile time" for the below code.
>
> immutable n = foo();
> int[n] arr;
>
> Unless called throgh CTFE(), dont go for CTFE.
>
> Will this work?
>
> Just putting my thoughts... I am no expert.

The core problem with this is that it's using a runtime variable at compile
time, which doesn't normally work. The fact that it works with an immutable
variable is a weird quirk based on the fact that it was assumed that the
value would be identical at both runtime and compile time, and as already
shown in this thread, that results in other bugs.

It would be trivial enough to create a wrapper template so that you can do
something like

immutable n = ctfe!(foo());

e.g.

template ctfe(alias value)
{
enum ctfe = value;
}

The problem is the fact that a runtime variable is being allowed in a
context that requires a compile time value. That violates how CTFE normally
works, increasing the confusion about when CTFE kicks in, and as shown in
this thread, it can result in subtle bugs.

- Jonathan M Davis



Re: Configuring DerelictGL3

2018-06-06 Thread Mike Parker via Digitalmars-d-learn

On Thursday, 7 June 2018 at 02:47:12 UTC, Entity325 wrote:






I added the line, "mixin glContext!(GLVersion.gl33);" after the 
import statement. I didn't do anything with the context because 
I assumed SDL2 handled that, and creating my own would likely 
break the code.




You aren't mixing in the deprecated symbols. From the 
documentation [1]:


"glFreeFuncs takes an optional paramter that will include 
deprecated types and function pointer declarations. This is false 
by default, but can be enabled with, e.g., mixin 
glFreeFuncs(GLVersion.gl33, true);."


So step-by-step:

1. Set version=DerelictGL3_CustomFreeFuncs on the command line 
(via dub's "versions" directive).


2. Create a module specifically for importing DerelictGL, e.g. 
mygl.d, and add this:


module mygl;
public import derelict.opengl;
mixin glFreeFuncs!(GLVersion.gl33, true);

3. In any  module where you need opengl, import mygl instead of 
derelict.opengl.


With this, Derelict will attempt to load all OpenGL functions, 
including the deprecated ones, up to 3.3. You'll just need to 
make sure you have the proper context created to support them.


FYI, I'm working on a new bindings package that's @nogc and 
-betterC comaptible (Derelict being neither). I've taken a 
completely different approach there, making everything 
configurable via commandline versions. For anyone interested in 
seeing what it looks like, I set up a github group a while back 
and have the loader package and the SDL bindings up now (though 
not yet in the dub repository). I've got most of OpenGL and GLFW 
done and will upload them in the not-too-distant future, to be 
followed by ports of other commonly-used Derelict packages. I'll 
push everything to the dub repo when I'm ready to formally make 
the announcement. It's best to consider the Derelict packages in 
maintenance mode, though I plan to keep supporting them for a 
long while to come.


[1]: http://derelictorg.github.io/packages/gl3/#using-derelictgl3
[2]: https://github.com/BindBC



Re: Orange serializer/deserializer

2018-06-06 Thread Jacob Carlborg via Digitalmars-d-learn
On Wednesday, 6 June 2018 at 20:46:22 UTC, InfiniteDimensional 
wrote:


I did register the main derived type and everything seems to 
work. Why do I have to reset the registered types?


Do you have to reset the registered types? What happens otherwise?

I still can't have a void* in my class though ;/ My exact code 
is


@nonSerialized void* ptr;


commenting out passes, else I get the errors


That's a bug, please report an issue on GitHub [1] so it's not 
forgotten.


[1] https://github.com/jacob-carlborg/orange/issues