Re: static analysis: how to test code reachability at compile time

2013-05-22 Thread Diggory

On Tuesday, 21 May 2013 at 21:15:58 UTC, Timothee Cour wrote:
 I'd like to have the following tools to help with static 
analysis  code

coverage:

1) test whether code is reachable or not.

Of course it only works for executables and may have some 
caveats (eg:

goto), but its still useful diagnostic tool.

__traits(isReachable): true when the current context can be 
reached via at

least one code path starting from main():


void fun1(){
//__traits(isReachable) would be false here because even though 
fun1 is

called by fun2, it can never be called starting from main().
}
void fun2(){fun1;}
void fun3(){} // would also be false, because of static 
if(temp); with temp

being known to be 0 at compile time.
void fun4(){
return;
//__traits(isReachable) would be false here because all code 
paths return

above this point.
}
void main(){enum temp=0; static if(temp) fun3; fun4;}


When a pointer to a function is taken, we may want to assume by 
convention

that __traits(isReachable) is true.

This would enable for example to make sure a given code is 
never called.

Note, static assert(0) is not the same.

2)
static code call graph: know caller/calling functions for a 
given function.



3) static code coverage
this would allow us to tell at compile time the code coverage 
of a module;
it is larger than runtime coverage, but still useful to find 
dead code.


It would be very easy to introduce paradoxes if this were 
possible, simply use a static if to call something only if it is 
unreachable.


static analysis: how to test code reachability at compile time

2013-05-22 Thread Timothee Cour
 I'd like to have the following tools to help with static analysis  code
coverage:

1) test whether code is reachable or not.

Of course it only works for executables and may have some caveats (eg:
goto), but its still useful diagnostic tool.

__traits(isReachable): true when the current context can be reached via at
least one code path starting from main():


void fun1(){
//__traits(isReachable) would be false here because even though fun1 is
called by fun2, it can never be called starting from main().
}
void fun2(){fun1;}
void fun3(){} // would also be false, because of static if(temp); with temp
being known to be 0 at compile time.
void fun4(){
return;
//__traits(isReachable) would be false here because all code paths return
above this point.
}
void main(){enum temp=0; static if(temp) fun3; fun4;}


When a pointer to a function is taken, we may want to assume by convention
that __traits(isReachable) is true.

This would enable for example to make sure a given code is never called.
Note, static assert(0) is not the same.

2)
static code call graph: know caller/calling functions for a given function.


3) static code coverage
this would allow us to tell at compile time the code coverage of a module;
it is larger than runtime coverage, but still useful to find dead code.


Remove duplicates

2013-05-22 Thread bearophile
Sometimes I have need a simple function like this, related to 
std.string.squeeze:



// Must keep the original order of the items.
// Slow implementation that shows the semantics.
T[] noDupes(T)(in T[] s) {
import std.algorithm: canFind;
T[] result;
foreach (T c; s)
if (!result.canFind(c))
result ~= c;
return result;
}

void main() {
import std.string: squeeze;
assert(.noDupes == A);
assert(.squeeze == A);
assert(ABAC.noDupes == ABC);
assert(ABAC.squeeze == ABAC);
}


Do you know if this function (or a simple way to implement it) 
already in Phobos?


Bye,
bearophile


Re: static analysis: how to test code reachability at compile time

2013-05-22 Thread Timon Gehr

On 05/21/2013 11:31 PM, Diggory wrote:

...

It would be very easy to introduce paradoxes


This is the case already.


if this were possible,  simply use a static if to call something only if it is 
unreachable.


I don't think this would be possible because function-local symbols are 
not accessible from outside.


Re: Remove duplicates

2013-05-22 Thread bearophile

Namespace:


// Slow implementation that shows the semantics.

...
I do not know if this solution would be much faster. But if I 
should make a statement, I would tend to yes.


(The point of my code was to show the semantics as much clearly 
as possible, it was not to show fast code.)


If no similar function is in Phobos, and there is no trivial way 
to implement it efficiently, then maybe it's worth writing a 
Phobos enhancement request.


Bye,
bearophile


Re: Remove duplicates

2013-05-22 Thread bearophile

Namespace:


http://dlang.org/phobos/std_algorithm.html#uniq


Just like squeeze, uniq requires the items to be sorted, to 
remove the duplicates. The function I am discussing here must 
keep the order of the not removed items.


Bye,
bearophile


Re: Remove duplicates

2013-05-22 Thread Steven Schveighoffer
On Tue, 21 May 2013 18:00:07 -0400, bearophile bearophileh...@lycos.com  
wrote:


Sometimes I have need a simple function like this, related to  
std.string.squeeze:



// Must keep the original order of the items.
// Slow implementation that shows the semantics.
T[] noDupes(T)(in T[] s) {
 import std.algorithm: canFind;
 T[] result;
 foreach (T c; s)
 if (!result.canFind(c))
 result ~= c;
 return result;
}

void main() {
 import std.string: squeeze;
 assert(.noDupes == A);
 assert(.squeeze == A);
 assert(ABAC.noDupes == ABC);
 assert(ABAC.squeeze == ABAC);
}


Do you know if this function (or a simple way to implement it) already  
in Phobos?


This seems to work for ASCII strings, but the conversion to array is  
required (I think because writeln may re-evaluate the range's front more  
than once):


Should be O(n), but doesn't really get around the memory allocation.  You  
could probably write a custom range that does this properly (doesn't set  
present until popFront is called):


import std.algorithm;
import std.array;
import std.stdio;

void main()
{
bool present[256];
// writes ABC
writeln(array(ABAC.filter!((a){scope(exit) present[a] = true; return  
!present[a];})));

}

Kind of a violation of how a range should work, front should be the same  
across multiple calls!  But it does the trick :)


-Steve


Re: Remove duplicates

2013-05-22 Thread bearophile

Steven Schveighoffer:

This seems to work for ASCII strings, but the conversion to 
array is required (I think because writeln may re-evaluate the 
range's front more than once):


Thank you, I have opened an ER:

http://d.puremagic.com/issues/show_bug.cgi?id=10131

Bye,
bearophile


Regarding a vector op

2013-05-22 Thread bearophile

Currently this code doesn't compile:

void main() {
int[2] data = [10, 20];
double[2] result;
result[] = data[] * 0.5;
}


It gives the error:
test.d(4): Error: incompatible types for ((data[]) * (0.5)): 
'int[]' and 'double'


Is code like this meant to work?

Bye,
bearophile


Re: Nesting Variants

2013-05-22 Thread Wyatt

On Monday, 20 May 2013 at 08:55:24 UTC, evilrat wrote:
yes, you forgot to take exact value, it doesn't know anything 
about array you put it in, so if you take that array explicitly 
and put value on array element it would work


ender[0] = one;
ender[0].get!(Variant[])[0] = key;
writeln(ender[0][0]); // writes 1

also you can check whats inside by doing just this 
writeln(ender); in case you are not sure what's going on.


I was trying to do this as a way to obtain a concise syntax for 
manipulating a tree of elements deserialized at runtime, ex:

data[foo][bar] = baz;
assert( data[foo][bar] == baz );
foreach( subtree; data[foo] )
doSubtreeOp( subtree );

Having to place .get!(Variant[]) between each dereference will 
defeat my use case.


Associative arrays fail in the same way, btw.  I'm using integers 
in the first example because it should be simpler to get those 
right.


I expected this to work because the value of 'ender[0]' will be a 
variant that contains an array, and such a variant should be able 
to index the contained array because of its opIndex overload.


Re: Nesting Variants

2013-05-22 Thread evilrat

On Wednesday, 22 May 2013 at 01:04:35 UTC, Wyatt wrote:


I was trying to do this as a way to obtain a concise syntax for 
manipulating a tree of elements deserialized at runtime, ex:

data[foo][bar] = baz;
assert( data[foo][bar] == baz );
foreach( subtree; data[foo] )
doSubtreeOp( subtree );

Having to place .get!(Variant[]) between each dereference will 
defeat my use case.


Associative arrays fail in the same way, btw.  I'm using 
integers in the first example because it should be simpler to 
get those right.


I expected this to work because the value of 'ender[0]' will be 
a variant that contains an array, and such a variant should be 
able to index the contained array because of its opIndex 
overload.


if this is a tree anyway better use custom node types.
so why not do this and overload opindex? unlike c++ u can put 
anything as key. i can't say from this example what types you are 
going to use but if it's only strings this should be very easy to 
implement.




Import Canon Camcorder AVCHD/MOV files to FCP with Mac Camcorder video converter

2013-05-22 Thread daisy520

Import Canon Camcorder AVCHD/MOV files to FCP with Mac Camcorder
video converter

As a great non-linear video editing application, Final Cut Pro
has gained the favor of different people, from video hobbyists,
independent filmmakers to film and television editors. Final Cut
Pro provides non-linear, non-destructive editing of any QuickTime
compatible video format including DV, HDV, P2 MXF (DVCProHD),
XDCAM, and 2K film formats. Seems powerful enough? Even so, users
always encounter troubles when importing clips shot by different
cameras or camcorders, like Canon Vixia AVCHD, etc. In that way,
you have to consider transferring Canon Camcorder videos to FCP
compatible file types before importing, such as Apple ProRes
, Apple ProRes 422 (HQ), Apple ProRes 422,Apple ProRes 422
(LT), and Apple ProRes 422 (Proxy).
Now that we’ve talked about importing, I’d like to say something
different between Final Cut Pro 7 and the newest Final Cut Pro X.

Three ways are available for importing.
1. Importing from File-Based Cameras
2. Importing from FireWire Cameras and Decks
3. Importing Files - You can import files into Final Cut Pro X by
choosing Import  Files or by dragging files directly into the
Event Library. You don’t need to specify whether you’re importing
an individual file or a folder, as you do in Final Cut Pro 7.

Understanding the similarities and differences between Final Cut
Pro 7 and Final Cut Pro X will allow you to work faster than ever
with this new breakthrough application.

Back to the point, if you have troubles while importing different
Canon Camcorder videos to FCP, what to do? As we’ve mentioned at
the beginning, you have to consider converting Canon avchd/mov
footage to FCP workable format before importing. Indeed, there
are numbers of Canon video converter software in the market.
Choosing a good converter or a bad one will decide the quality of
your editing material, so it’s serious. Aunsoft Canon Camcorder
video converter for Mac will never let you down. It not only
provides expert format preset for Final Cut Pro, but also offers
profiles for other commonly-used video editing programs running
on Mac OS X, including iMovie, Final Cut Express, Avid Media
Composer, Adobe Premiere, and Sony Vegas. More than that, if you
wanna cut some Canon footage for watching on iPad, iPhone, Apple
TV, iTouch, Aunsoft Canon footage converter will also help you
realize the goal.

To encode Canon recordings to FCP for editing, three steps are
enough.
Step 1: Import Canon footage to Aunsoft Canon video converter for
Mac software.
Step 2: Select output format for FCP (X).
Step 3: Convert Canon footage to FCP compatible format.

Additional Tips - with Aunsoft Mac Canon AVCHD/MOV to FCP
Converter , you can do more:
- convert Canon AVCHD files to FCP editable format
- transfer Canon EOS DSLR H.264 MOV for Final Cut Pro
- transcode Canon MXF to QT MOV, Apple ProRes, AIC, DNxHD, etc.
- downsize 1080p Canon footage to 720p




Re: Import Canon Camcorder AVCHD/MOV files to FCP with Mac Camcorder video converter

2013-05-22 Thread Iain Buclaw

On Wednesday, 22 May 2013 at 07:10:38 UTC, daisy520 wrote:

Import Canon Camcorder AVCHD/MOV files to FCP with Mac Camcorder
video converter

As a great non-linear video editing application, Final Cut Pro
has gained the favor of different people, from video hobbyists,
independent filmmakers to film and television editors. Final Cut
Pro provides non-linear, non-destructive editing of any 
QuickTime

compatible video format including DV, HDV, P2 MXF (DVCProHD),
XDCAM, and 2K film formats. Seems powerful enough? Even so, 
users

always encounter troubles when importing clips shot by different
cameras or camcorders, like Canon Vixia AVCHD, etc. In that way,
you have to consider transferring Canon Camcorder videos to FCP
compatible file types before importing, such as Apple ProRes
, Apple ProRes 422 (HQ), Apple ProRes 422,Apple ProRes 422
(LT), and Apple ProRes 422 (Proxy).
Now that we’ve talked about importing, I’d like to say something
different between Final Cut Pro 7 and the newest Final Cut Pro 
X.


Three ways are available for importing.
1. Importing from File-Based Cameras
2. Importing from FireWire Cameras and Decks
3. Importing Files - You can import files into Final Cut Pro X 
by

choosing Import  Files or by dragging files directly into the
Event Library. You don’t need to specify whether you’re 
importing

an individual file or a folder, as you do in Final Cut Pro 7.

Understanding the similarities and differences between Final Cut
Pro 7 and Final Cut Pro X will allow you to work faster than 
ever

with this new breakthrough application.

Back to the point, if you have troubles while importing 
different

Canon Camcorder videos to FCP, what to do? As we’ve mentioned at
the beginning, you have to consider converting Canon avchd/mov
footage to FCP workable format before importing. Indeed, there
are numbers of Canon video converter software in the market.
Choosing a good converter or a bad one will decide the quality 
of

your editing material, so it’s serious. Aunsoft Canon Camcorder
video converter for Mac will never let you down. It not only
provides expert format preset for Final Cut Pro, but also offers
profiles for other commonly-used video editing programs running
on Mac OS X, including iMovie, Final Cut Express, Avid Media
Composer, Adobe Premiere, and Sony Vegas. More than that, if you
wanna cut some Canon footage for watching on iPad, iPhone, Apple
TV, iTouch, Aunsoft Canon footage converter will also help you
realize the goal.

To encode Canon recordings to FCP for editing, three steps are
enough.
Step 1: Import Canon footage to Aunsoft Canon video converter 
for

Mac software.
Step 2: Select output format for FCP (X).
Step 3: Convert Canon footage to FCP compatible format.

Additional Tips - with Aunsoft Mac Canon AVCHD/MOV to FCP
Converter , you can do more:
- convert Canon AVCHD files to FCP editable format
- transfer Canon EOS DSLR H.264 MOV for Final Cut Pro
- transcode Canon MXF to QT MOV, Apple ProRes, AIC, DNxHD, etc.
- downsize 1080p Canon footage to 720p



This information has changed my life!


...



Or not...


[Video to MP4]playing VOB, MXF, AVCHD, MKV videos on Samsung Galaxy S 3

2013-05-22 Thread daisy520

Watch movies on Samsung Galaxy S III with the best Samsung Galaxy
S 3 video converter
[Video to MP4]playing VOB, MXF, AVCHD, MKV videos on Samsung
Galaxy S 3

As the users of Samsung Galaxy S III, what will you do with it?
Listen Music, or download top 10 Android games? Anyway, whether
you do anything on Galaxy S3, don’t forget to watch movies on
Samsung Galaxy S III. It’s pleasant to play videos on such a
wide-screen with HD quality. Galaxy S III is said to support
videos in MP4, 3GP, MPEG4, Divx, Xvid formats, but if we have
videos in FLV, MOV, WMV, AVI, VOB, etc, we need convert FLV, MOV,
WMV, AVI, VOB, MXF, AVCHD, MKV, etc to Samsung Galaxy S3
supported formats.

  The following paragraphs will guide you how to effectively
transfer/convert any movies to Samsung Galaxy S III so that we
can freely enjoy videos on Galaxy S III.

Step 1: Add Videos to Aunsoft Samsung Galaxy S3 Video Converter
With this powerful Samsung Galaxy S3 Video Converter, we can load
as many as videos at one time, so we can import any
FLV/MOV/WMV/AVI/VOB/MXF/AVCHD/MKV videos to Samsung Galaxy S3
Video Converter.

Step 2: Convert Videos to Samsung Galaxy S III by the best video
to Samsung Galaxy S3 Converter
No matter what formats videos are, Samsung Galaxy Video Converter
is able to transcode FLV/MOV/WMV/AVI/VOB/MXF/AVCHD/MKV to Samsung
Galaxy S3 compatible MP4 format. Pull down format list to select
SamsungSamsung Galaxy S II (I9100) (*.mp4).

Also, we can adjust size, bit rates, as well as frame rate to
create the best profile for Samsung Galaxy S III videos.

Step 3: Export MP4 videos for Galaxy S3
Conversion from videos to MP4 will be done so quickly that we can
easily transfer exported MP4 videos to Galaxy S III. In
conclusion, we can copy any videos on Samsung Galaxy S3.

Watch movies on Samsung Galaxy S III with the best Samsung Galaxy
S 3 video converter
[Video to MP4]playing VOB, MXF, AVCHD, MKV videos on Samsung
Galaxy S 3

As the users of Samsung Galaxy S III, what will you do with it?
Listen Music, or download top 10 Android games? Anyway, whether
you do anything on Galaxy S3, don’t forget to watch movies on
Samsung Galaxy S III. It’s pleasant to play videos on such a
wide-screen with HD quality. Galaxy S III is said to support
videos in MP4, 3GP, MPEG4, Divx, Xvid formats, but if we have
videos in FLV, MOV, WMV, AVI, VOB, etc, we need convert FLV, MOV,
WMV, AVI, VOB, MXF, AVCHD, MKV, etc to Samsung Galaxy S3
supported formats.

  The following paragraphs will guide you how to effectively
transfer/convert any movies to Samsung Galaxy S III so that we
can freely enjoy videos on Galaxy S III.

Step 1: Add Videos to Aunsoft Samsung Galaxy S3 Video Converter
With this powerful Samsung Galaxy S3 Video Converter, we can load
as many as videos at one time, so we can import any
FLV/MOV/WMV/AVI/VOB/MXF/AVCHD/MKV videos to Samsung Galaxy S3
Video Converter.

Step 2: Convert Videos to Samsung Galaxy S III by the best video
to Samsung Galaxy S3 Converter
No matter what formats videos are, Samsung Galaxy Video Converter
is able to transcode FLV/MOV/WMV/AVI/VOB/MXF/AVCHD/MKV to Samsung
Galaxy S3 compatible MP4 format. Pull down format list to select
SamsungSamsung Galaxy S II (I9100) (*.mp4).

Also, we can adjust size, bit rates, as well as frame rate to
create the best profile for Samsung Galaxy S III videos.

Step 3: Export MP4 videos for Galaxy S3
Conversion from videos to MP4 will be done so quickly that we can
easily transfer exported MP4 videos to Galaxy S III. In
conclusion, we can copy any videos on Samsung Galaxy S3.


open a range of files - segfault

2013-05-22 Thread Stephan Schiffels

Hi,

this code crashes with a segfault. I need help to understand what 
might be wrong with it.


import std.array;
import std.algorithm;

void main() {
  auto names = [file1.txt, file2.txt, file3.txt];  // let 
these files exist

  auto files = names.map!(f = File(f, r))().array();
}

Thanks,

Stephan


Re: open a range of files - segfault

2013-05-22 Thread bearophile

Stephan Schiffels:

this code crashes with a segfault. I need help to understand 
what might be wrong with it.


import std.array;
import std.algorithm;

void main() {
  auto names = [file1.txt, file2.txt, file3.txt];  // let 
these files exist

  auto files = names.map!(f = File(f, r))().array();
}


If I use the latest 2.063beta5 compiler, and I also import 
std.stdio, then I see no crash on Windows32.


Bye,
bearophile


Re: open a range of files - segfault

2013-05-22 Thread John Colvin
On Wednesday, 22 May 2013 at 08:38:14 UTC, Stephan Schiffels 
wrote:

Hi,

this code crashes with a segfault. I need help to understand 
what might be wrong with it.


import std.array;
import std.algorithm;

void main() {
  auto names = [file1.txt, file2.txt, file3.txt];  // let 
these files exist

  auto files = names.map!(f = File(f, r))().array();
}

Thanks,

Stephan


A quick gdb run shows that it's segfaulting at the exit of the 
program, when the GC runs its final full collection.


Re: open a range of files - segfault

2013-05-22 Thread John Colvin

On Wednesday, 22 May 2013 at 11:07:39 UTC, bearophile wrote:

Stephan Schiffels:

this code crashes with a segfault. I need help to understand 
what might be wrong with it.


import std.array;
import std.algorithm;

void main() {
 auto names = [file1.txt, file2.txt, file3.txt];  // let 
these files exist

 auto files = names.map!(f = File(f, r))().array();
}


If I use the latest 2.063beta5 compiler, and I also import 
std.stdio, then I see no crash on Windows32.


Bye,
bearophile


With git master on linux x64 I get a segfault, see my other
comment.


casting with preserving attributes

2013-05-22 Thread Jack Applegame

Hello.

I need a template for casting arrays to another type without 
changing const and immutable attributes:


template ByteType(T) {
  // some magic
}

const(int)[] ca;
immutable(short)[] is;
long[] ml;

static assert(is(ByteType!ca == const(byte)[]));
static assert(is(ByteType!is == immutable(byte)[]));
static assert(is(ByteType!ml == byte[]));

What kind of template magic I should use?


Re: casting with preserving attributes

2013-05-22 Thread Jack Applegame

On Wednesday, 22 May 2013 at 13:01:26 UTC, bearophile wrote:
I think that's essentially the right solution. I suggest to 
generalize it a bit, removing the byte from its insides, and 
making it a template argument. I think shared is missing.

Yes.

Finally http://dpaste.1azy.net/fc503331


Re: casting with preserving attributes

2013-05-22 Thread bearophile

Jack Applegame:


Finally http://dpaste.1azy.net/fc503331


I suggest to use indents composed by 4 spaces.
Generally in D we use template constraints, instead of static ifs 
with a nice error message...

In such complex situations I also suggest to add braces.

Something like this:


auto castElementType(T = byte, F)(ref F from)
if (isArray!F) {
alias E = typeof(from[0]);

static if(is(E == const)) {
return cast(const(Unqual!T)[])from;
} else static if(is(E == immutable)) {
return cast(immutable(Unqual!T)[])from;
} else static if(is(E == shared)) {
return cast(shared(Unqual!T)[])from;
} else {
return cast(Unqual!T[])from;
}
}


Bye,
bearophile


Re: Nesting Variants

2013-05-22 Thread gedaiu

what about this class?

https://bitbucket.org/szabo_bogdan/cmsushid/raw/e2e4d2195bf48df586887768d2d800d21227c80d/src/base/Value.d


Re: how to have alias this with an unaccessible member?

2013-05-22 Thread timotheecour

On Sunday, 19 May 2013 at 14:33:32 UTC, Ali Çehreli wrote:

On 05/19/2013 05:34 AM, Simen Kjaeraas wrote:


Well, there is also opDot:
What is the state of opDot? According to the change log, it has 
been introduced as a part of Version D 2.013 Apr 22, 2008 
with the note Added opDot, which is experimental only.


I will keep assuming that opDot does not exist. :) (However, it 
is being used by Unique an Ref in std.typecons.)


Ali


is there anything you can do with opDot that you can't with alias 
this?


(aside from the ability to hide the member as being private, as 
raised in the OP; its a bit broken as mentioned 1 post above)


if not, it should deprecate.


Re: how to have alias this with an unaccessible member?

2013-05-22 Thread Jonathan M Davis
On Wednesday, May 22, 2013 18:18:34 timotheecour wrote:
 On Sunday, 19 May 2013 at 14:33:32 UTC, Ali Çehreli wrote:
  On 05/19/2013 05:34 AM, Simen Kjaeraas wrote:
  Well, there is also opDot:
  What is the state of opDot? According to the change log, it has
  been introduced as a part of Version D 2.013 Apr 22, 2008
  with the note Added opDot, which is experimental only.
  
  I will keep assuming that opDot does not exist. :) (However, it
  is being used by Unique an Ref in std.typecons.)
  
  Ali
 
 is there anything you can do with opDot that you can't with alias
 this?
 
 (aside from the ability to hide the member as being private, as
 raised in the OP; its a bit broken as mentioned 1 post above)
 
 if not, it should deprecate.

opDot is definitely supposed to be deprecated:

http://d.puremagic.com/issues/show_bug.cgi?id=2327

but Daniel Murphy seems to have missed it on his list 
(http://dlang.org/deprecate.html), and it hasn't actually been deprecated yet 
(but then again, even delet hasn't been deprecated yet, so that just goes to 
show how slow we are to deprecate language features that are definitely 
supposed to get the axe).

- Jonathan M Davis


WindowProc in a class - function and pointer problem

2013-05-22 Thread D-sturbed
Hello, is there a way to wrap a WindowProc (so LRESULT 
WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
nothrow) in a class and to link it to a WindowClass without 
puting it as static ?


Because defacto every datum used in the WindowProc must also be 
static.
The problem technically is that if static is not specified, the 
compiler won't allow this: MyWinClass.lpfnWndProc = 
TheWindowProcInMyClass.


I've also tried this: MyWinClass.lpfnWndProc = 
(TheWindowProcInMyClass).funcptr but, while it compiles, it 
drastically fails at the run-time...


Re: WindowProc in a class - function and pointer problem

2013-05-22 Thread Simen Kjaeraas

On 2013-05-22, 21:30, D-sturbed wrote:

Hello, is there a way to wrap a WindowProc (so LRESULT WindowProc(HWND  
hWnd, UINT message, WPARAM wParam, LPARAM lParam) nothrow) in a class  
and to link it to a WindowClass without puting it as static ?


Because defacto every datum used in the WindowProc must also be static.
The problem technically is that if static is not specified, the  
compiler won't allow this: MyWinClass.lpfnWndProc =  
TheWindowProcInMyClass.


I've also tried this: MyWinClass.lpfnWndProc =  
(TheWindowProcInMyClass).funcptr but, while it compiles, it  
drastically fails at the run-time...


Not possible, no. What you *can* do is have some way to translate from
hwnd to class instance, and fetch the right instance inside the static
wndProc to call a member function on that.

--
Simen


Re: how to have alias this with an unaccessible member?

2013-05-22 Thread Timothee Cour
at least 'delete' is in the deprecated table (marked as will be deprecated
some time in the future)
so should opDot then.

On Wed, May 22, 2013 at 11:34 AM, Jonathan M Davis jmdavisp...@gmx.comwrote:

 On Wednesday, May 22, 2013 18:18:34 timotheecour wrote:
  On Sunday, 19 May 2013 at 14:33:32 UTC, Ali Çehreli wrote:
   On 05/19/2013 05:34 AM, Simen Kjaeraas wrote:
   Well, there is also opDot:
   What is the state of opDot? According to the change log, it has
   been introduced as a part of Version D 2.013 Apr 22, 2008
   with the note Added opDot, which is experimental only.
  
   I will keep assuming that opDot does not exist. :) (However, it
   is being used by Unique an Ref in std.typecons.)
  
   Ali
 
  is there anything you can do with opDot that you can't with alias
  this?
 
  (aside from the ability to hide the member as being private, as
  raised in the OP; its a bit broken as mentioned 1 post above)
 
  if not, it should deprecate.

 opDot is definitely supposed to be deprecated:

 http://d.puremagic.com/issues/show_bug.cgi?id=2327

 but Daniel Murphy seems to have missed it on his list
 (http://dlang.org/deprecate.html), and it hasn't actually been deprecated
 yet
 (but then again, even delet hasn't been deprecated yet, so that just goes
 to
 show how slow we are to deprecate language features that are definitely
 supposed to get the axe).

 - Jonathan M Davis



Re: WindowProc in a class - function and pointer problem

2013-05-22 Thread Diggory

On Wednesday, 22 May 2013 at 20:25:40 UTC, Simen Kjaeraas wrote:

On 2013-05-22, 21:30, D-sturbed wrote:

Hello, is there a way to wrap a WindowProc (so LRESULT 
WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM 
lParam) nothrow) in a class and to link it to a WindowClass 
without puting it as static ?


Because defacto every datum used in the WindowProc must also 
be static.
The problem technically is that if static is not specified, 
the compiler won't allow this: MyWinClass.lpfnWndProc = 
TheWindowProcInMyClass.


I've also tried this: MyWinClass.lpfnWndProc = 
(TheWindowProcInMyClass).funcptr but, while it compiles, it 
drastically fails at the run-time...


Not possible, no. What you *can* do is have some way to 
translate from
hwnd to class instance, and fetch the right instance inside the 
static

wndProc to call a member function on that.


If you are only going to have one window you can store the this 
pointer in a global variable.


If you want to have multiple windows each with messages going to 
an instance of a class, you need to do the following:
- Specify the this pointer as the lpParam argument to 
CreateWindow

- Hook up a static WndProc function
- Have the static function handle a WM_NCCREATE message as 
follows:
- Cast the lParam parameter to a CREATESTRUCT* and retrieve 
the this pointer from the lpCreateParams member.
- Use SetWindowLongPtr to set the GWLP_USERDATA property of 
the window hwnd to the this pointer

- Have the static function handle all messages as follows:
- Use GetWindowLongPtr to get the GWLP_USERDATA property of 
the window hwnd to get the this pointer
- Pass the message on to a non-static WndProc in the class 
using the discovered this pointer


You also need to make sure that there is a separate reference to 
the class instance for as long as the window exists, because the 
garbage collector will not scan the window properties and so may 
think the object is garbage otherwise.


Re: open a range of files - segfault

2013-05-22 Thread Stephan Schiffels

On Wednesday, 22 May 2013 at 11:09:49 UTC, John Colvin wrote:

On Wednesday, 22 May 2013 at 11:07:39 UTC, bearophile wrote:

Stephan Schiffels:

this code crashes with a segfault. I need help to understand 
what might be wrong with it.


import std.array;
import std.algorithm;

void main() {
auto names = [file1.txt, file2.txt, file3.txt];  // let 
these files exist

auto files = names.map!(f = File(f, r))().array();
}


If I use the latest 2.063beta5 compiler, and I also import 
std.stdio, then I see no crash on Windows32.


Bye,
bearophile


With git master on linux x64 I get a segfault, see my other
comment.


OK, thanks for confirming. I updated to the latest git master and 
still get a segfault. I'll file a bug report.


Stephan



Re: WindowProc in a class - function and pointer problem

2013-05-22 Thread D-sturbed

On Wednesday, 22 May 2013 at 21:22:52 UTC, Diggory wrote:

On Wednesday, 22 May 2013 at 20:25:40 UTC, Simen Kjaeraas wrote:

On 2013-05-22, 21:30, D-sturbed wrote:

Hello, is there a way to wrap a WindowProc (so LRESULT 
WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM 
lParam) nothrow) in a class and to link it to a WindowClass 
without puting it as static ?


Because defacto every datum used in the WindowProc must also 
be static.
The problem technically is that if static is not specified, 
the compiler won't allow this: MyWinClass.lpfnWndProc = 
TheWindowProcInMyClass.


I've also tried this: MyWinClass.lpfnWndProc = 
(TheWindowProcInMyClass).funcptr but, while it compiles, it 
drastically fails at the run-time...


Not possible, no. What you *can* do is have some way to 
translate from
hwnd to class instance, and fetch the right instance inside 
the static

wndProc to call a member function on that.


If you are only going to have one window you can store the 
this pointer in a global variable.


If you want to have multiple windows each with messages going 
to an instance of a class, you need to do the following:
- Specify the this pointer as the lpParam argument to 
CreateWindow

- Hook up a static WndProc function
- Have the static function handle a WM_NCCREATE message as 
follows:
- Cast the lParam parameter to a CREATESTRUCT* and 
retrieve the this pointer from the lpCreateParams member.
- Use SetWindowLongPtr to set the GWLP_USERDATA property 
of the window hwnd to the this pointer

- Have the static function handle all messages as follows:
- Use GetWindowLongPtr to get the GWLP_USERDATA property 
of the window hwnd to get the this pointer
- Pass the message on to a non-static WndProc in the class 
using the discovered this pointer


You also need to make sure that there is a separate reference 
to the class instance for as long as the window exists, because 
the garbage collector will not scan the window properties and 
so may think the object is garbage otherwise.


Yes I'm in the multiple Window case, every window is wraped in 
a class and has its own message handler. I know that Win, in its 
callback system, often lets you retrieve a pointer to something, 
and I haven't get it was possible in this case...(which is you 
seem to describe). I will try this tomorrow.




Templated Function can't deduce function arguments

2013-05-22 Thread Jonathan Crapuchettes
Can anyone tell me why this doesn't compile? Dmd 2.062 says that it 
cannot deduce the template function from arguments types.

import std.stdio;

void main()
{
test!(dchar, int)('b', 6, 'a', 54);
}

template test(Types...)
{
void test(T...)(const Types v, const T values...)
{
writefln(%s,%s, v);
foreach (s; values)
writefln(%s,%s, s);
}
}

Thank you,
Jonathan


Re: Templated Function can't deduce function arguments

2013-05-22 Thread Steven Schveighoffer
On Wed, 22 May 2013 21:16:44 -0400, Jonathan Crapuchettes  
jcrapuchet...@gmail.com wrote:



Can anyone tell me why this doesn't compile? Dmd 2.062 says that it
cannot deduce the template function from arguments types.

import std.stdio;

void main()
{
test!(dchar, int)('b', 6, 'a', 54);
}

template test(Types...)
{
void test(T...)(const Types v, const T values...)


Do you need that last elipsis?  I thought you didn't, but not sure.

-Steve


Re: WindowProc in a class - function and pointer problem

2013-05-22 Thread evilrat

On Wednesday, 22 May 2013 at 21:42:32 UTC, D-sturbed wrote:


Yes I'm in the multiple Window case, every window is wraped 
in a class and has its own message handler. I know that Win, in 
its callback system, often lets you retrieve a pointer to 
something, and I haven't get it was possible in this 
case...(which is you seem to describe). I will try this 
tomorrow.


you can't really make it without static wndproc. if you don't 
know how to do it just go google some wndproc in a class tutors 
for c++, i can even recommend you one(i had used my own port of 
this in D before i switched to crossplatform lib for my needs) - 
http://blogs.msdn.com/b/oldnewthing/archive/2005/04/22/410773.aspx


equivalent of __attribute__((constructor))

2013-05-22 Thread Ellery Newcomer

In the context of shared libraries, with gcc

__attribute__((constructor))
void myfunc() { .. }

is used to make myfunc be called upon loading of the shared library (you 
can tell I know what I am talking about here) via some field in the ELF 
headers, apparently. Is there any way to get our trusty d compilers to 
do the equivalent?


Sure, Ellery, we have this awesome feature called module constructors. 
Check em out.


Ehh, I would be using this to initialize druntime...

You could just define _init, couldn't you?

Yes, but there is only one _init, while the above can be used with 
multiple functions and thus wouldn't inadvertently cause important code 
to not run. If I don't have to, I'd rather not.


Wait, why are you initializing druntime?

Because druntime isn't set up to do it yet for c main calling d shared 
lib. You'd think it would need the same sort of functionality when it 
does implement it, though.