Re: Derelict2 openGL3 issues

2012-04-24 Thread Denis Shelomovskij
One day I'll finish my OpenGL wrapper for D. It will give you 
better abilities in creating OpenGL 3 contexts than most C++ 
frameworks (SDL, GLFW etc.) and, I hope, will get rid of passing 
pointers to functions.


It will be done soon after I'll finish Scintilla wrapper for D.

And it will be done soon after I'll conquer the world (or a bit 
earlier).


Dreams, dreams...

P.S.
OpenGL context creating has been done a long time ago but then I 
decided to create full wrapper to supersede Derelict's one and it 
still not finished because that I decided to create general 
wrapping back-end. And I've done it (CWrap), but than I decided 
to create Scintilla wrapper...


P.P.S.
Sorry for the flood...

--
Денис В. Шеломовский
Denis V. Shelomovskij


Re: Stack overflow / recursive expansion with alias this

2012-04-24 Thread Namespace

Hm, doesn't anybody know anything about it?


Re: Stack overflow / recursive expansion with alias this

2012-04-24 Thread Timon Gehr

On 04/23/2012 11:29 PM, Namespace wrote:

I have this code:


...

 T _get() {
 return this._value;
 }

 const(T) _get() const {
 return this._value;
 }



You missed the 'immutable' and 'inout cases.
Just use inout(T) _get() inout { return _value; } instead of the two 
declarations you have.



...
And therefore i get the same error, as if i wrote return
NotNull!(Foo)(this); instead of return assumeNotNull(this);, in the
_convert method of NotNull. The Output is Stack overflow. I think
that comes from recursive calls which fills the stack? Is that a bug?



Yes.


Re: avoid toLower in std.algorithm.sort compare alias

2012-04-24 Thread Regan Heath
On Mon, 23 Apr 2012 16:43:20 +0100, Steven Schveighoffer  
schvei...@yahoo.com wrote:


While dealing with unicode in my std.stream rewrite, I've found that  
hand-decoding dchars is way faster than using library calls.


After watching Andrei's talk on generic and generative programming I have  
to ask, which routines are you avoiding .. it seems we need to make them  
as good as the hand coded code you've written...


R

--
Using Opera's revolutionary email client: http://www.opera.com/mail/


Re: Range of random numbers

2012-04-24 Thread Christophe
bearophile , dans le message (digitalmars.D.learn:35108), a écrit :
 What about (untested):
 
 auto uniformRange(T1 lower, T2 upper) {
  return count().map!(_ = uniform(lower, upper))();
 }

That looks like a workarround, not meaningful code.

How about
  return repeat(_ =uniform(lower, upper)).map!(x = x())();
?

We could also use a template to make a range out of a delegate and avoid 
this workarround...

struct RepeatDg(T)
{
  T delegate() dg;
  this(T delegate() dg_) { dg = dg_; }

  @property enum bool empty = false;
  @property T front() { return dg(); }
  @property void popFront() {}
}
  


Why has base class protection been deprecated?

2012-04-24 Thread David Bryant
With the dmd 2.059 I have started getting the error 'use of base class 
protection is deprecated' when I try to implement an interface with 
private visibility, ie:


  interface Interface { }

  class Class : private Interface { }

 $ dmd test.d
 test.d(4): use of base class protection is deprecated

This bothers me for two reasons: firstly it's not a base class, and 
secondly, it's a standard OO pattern of mine.


What's up with this?

Thanks,
Dave


Re: Why has base class protection been deprecated?

2012-04-24 Thread Don Clugston

On 24/04/12 14:22, David Bryant wrote:

With the dmd 2.059 I have started getting the error 'use of base class
protection is deprecated' when I try to implement an interface with
private visibility, ie:

interface Interface { }

class Class : private Interface { }

$ dmd test.d
test.d(4): use of base class protection is deprecated

This bothers me for two reasons: firstly it's not a base class, and
secondly, it's a standard OO pattern of mine.

What's up with this?

Thanks,
Dave


Because it doesn't make sense. All classes are derived from Object. That 
_has_ to be public, otherwise things like == wouldn't work.


Previously, the compiler used to allow base class protection, but it 
ignored it.


Re: D 50% slower than C++. What I'm doing wrong?

2012-04-24 Thread Marco Leise
Am Sat, 14 Apr 2012 19:31:40 -0700
schrieb Jonathan M Davis jmdavisp...@gmx.com:

 On Sunday, April 15, 2012 04:21:09 Joseph Rushton Wakeling wrote:
  On 14/04/12 23:03, q66 wrote:
   He also uses a class. And -noboundscheck should be automatically induced
   by
   -release.
  
  ... but the methods are marked as final -- shouldn't that substantially
  reduce any speed hit from using class instead of struct?
 
 In theory. If they don't override anything, then that signals to the compiler 
 that they don't need to be virtual, in which case, they _shouldn't_ be 
 virtual, but that's up to the compiler to optimize, and I don't know how good 
 it is about that right now.

cynicism
May I point to this: http://d.puremagic.com/issues/show_bug.cgi?id=7865
/cynicism

-- 
Marco



Re: Stack overflow / recursive expansion with alias this

2012-04-24 Thread Namespace



You missed the 'immutable' and 'inout cases.
Just use inout(T) _get() inout { return _value; } instead of 
the two declarations you have.


Oh, thanks a lot, i'm forgetting this often.




...
And therefore i get the same error, as if i wrote return
NotNull!(Foo)(this); instead of return 
assumeNotNull(this);, in the
_convert method of NotNull. The Output is Stack overflow. 
I think
that comes from recursive calls which fills the stack? Is that 
a bug?




Yes.


Some ideas how i can implement this otherwise? And would the bug 
fix come with 2.060?

With this functionality, the NotNull struct would be perfect.




Re: Why has base class protection been deprecated?

2012-04-24 Thread Don Clugston

On 24/04/12 15:29, David Bryant wrote:


Because it doesn't make sense. All classes are derived from Object. That
_has_ to be public, otherwise things like == wouldn't work.



Does the same apply for interfaces? I'm specifically implementing an
interface with non-public visibility. This shouldn't affect the
visibility of the implicit Object base-class.


Right. Only classes are affected.


Re: Range of random numbers

2012-04-24 Thread bearophile

trav...@phare.normalesup.org:


That looks like a workarround, not meaningful code.


It wasn't terrible code :-)



How about
  return repeat(_ =uniform(lower, upper)).map!(x = x())();
?


Why don't you write a little benchmark to compare the performance 
of the two versions?


Using uniform(lower, upper, gen)  with
auto gen = Xorshift(1);
to reduce influence from the random generator.

Bye,
bearophile


Re: D 50% slower than C++. What I'm doing wrong?

2012-04-24 Thread Marco Leise
Am Sat, 14 Apr 2012 21:05:36 +0200
schrieb ReneSac renedu...@yahoo.com.br:

 I have this simple binary arithmetic coder in C++ by Mahoney and 
 translated to D by Maffi. I added notrow, final and pure  
 and GC.disable where it was possible, but that didn't made much 
 difference. Adding const to the Predictor.p() (as in the C++ 
 version) gave 3% higher performance. Here the two versions:
 
 http://mattmahoney.net/dc/  -- original zip
 
 http://pastebin.com/55x9dT9C  -- Original C++ version.
 http://pastebin.com/TYT7XdwX  -- Modified D translation.
 
 The problem is that the D version is 50% slower:
 
 test.fpaq0 (16562521 bytes) - test.bmp (33159254 bytes)
 
 Lang| Comp  | Binary size | Time (lower is better)
 C++  (g++)  -  13kb   -  2.42s  (100%)   -O3 -s
 D(DMD)  - 230kb   -  4.46s  (184%)   -O -release -inline
 D(GDC)  -1322kb   -  3.69s  (152%)   -O3 -frelease -s
 
 
 The only diference I could see between the C++ and D versions is 
 that C++ has hints to the compiler about which functions to 
 inline, and I could't find anything similar in D. So I manually 
 inlined the encode and decode functions:
 
 http://pastebin.com/N4nuyVMh  - Manual inline
 
 D(DMD)  - 228kb   -  3.70s  (153%)   -O -release -inline
 D(GDC)  -1318kb   -  3.50s  (144%)   -O3 -frelease -s
 
 Still, the D version is slower. What makes this speed diference? 
 Is there any way to side-step this?
 
 Note that this simple C++ version can be made more than 2 times 
 faster with algoritimical and io optimizations, (ab)using 
 templates, etc. So I'm not asking for generic speed 
 optimizations, but only things that may make the D code more 
 equal to the C++ code.

I noticed the thread just now. I ported fast paq8 (fp8) to D, and with some 
careful D-ification and optimization it runs a bit faster than the original C 
program when compiled with the GCC on Linux x86_64, Core 2 Duo. As others said 
the files are cached in RAM anyway if there is enough available, so you should 
not be bound by your hard drive speed anyway.
I don't know about this version of paq you ported the coder from, but I try to 
give you some hints on what I did to optimize the code.

- time portions of your main()
  is the time actually spent at start up or in the compression?

- use structs, where you don't classes don't make your code cleaner

- where ever you have large arrays that you don't need initialized to .init, 
write:
  int[large number] arr = void;
  double[large number] arr = void;
  This disables default initialization, which may help you in inner loops.
  Remember that C++ doesn't default initialize at all, so this is an obvious
  way to lose performance against that language.
  Also keep in mind that the .init for floating point types is NaN:
  struct Foo { double[99] bar; }
  Is not a block of binary zeroes and hence cannot be stored in a .bss
  section in the executable, where it would not take any space at all.
  struct Foo { double[99] bar = void; }
  On the contrary will not bloat your executable by 7,6 MB!
  Be cautious with:
  class Foo { double[99] bar = void; }
  Classes' .init don't go into .bss either way. Another reason to use a
  struct where appropriate. (WARNING: Usage of .bss on Linux/MacOS is currently
  broken in the compiler front-end. You'll only see the effect on Windows)

- Mahoney used an Array class in my version of paq, which allocates via calloc.
  Do this as well. You can't win otherwise. Read up a bit on calloc if you want.
  It generally 'allocates' a special zeroed out memory page multiple times.
  No matter how much memory you ask for, it wont really allocate anything until
  you *write* to it, at which point new memory is allocated for you and the
  zero-page is copied into it.
  The D GC on the other hand allocates that memory and writes zeroes to it 
  immediately.
  The effect is two fold: First, the calloc version will use much less RAM, if
  the 'allocated' buffers aren't fully used (e.g. you compressed a small file).
  Second, the D GC version is slowed down by writing zeroes to all that memory.
  At high compression levels, paq8 uses ~2 GB of memory that is calloc'ed. You
  should _not_ try to use GC memory for that.

- If there are data structures that are designed to fit into a CPU cache-line
  (I had one of those in paq8), make sure it still has the correct size in your
  D version. static assert(Foo.sizeof == 64); helped me find a bug there that
  resulted from switching from C bitfields to the D version (which is a library
  solution in Phobos).

I hope that gives you some ideas what to look for. Good luck!

-- 
Marco



Re: Why has base class protection been deprecated?

2012-04-24 Thread David Bryant

On 04/24/2012 11:07 PM, Don Clugston wrote:

On 24/04/12 15:29, David Bryant wrote:


Because it doesn't make sense. All classes are derived from Object. That
_has_ to be public, otherwise things like == wouldn't work.



Does the same apply for interfaces? I'm specifically implementing an
interface with non-public visibility. This shouldn't affect the
visibility of the implicit Object base-class.


Right. Only classes are affected.


Ok...so I still don't understand why the original example shouldn't 
compile. I'm not trying to change the visibility of the base class but 
rather the visibility of the interface.


Re: Why has base class protection been deprecated?

2012-04-24 Thread David Bryant

On 04/24/2012 11:47 PM, David Bryant wrote:

On 04/24/2012 11:07 PM, Don Clugston wrote:

On 24/04/12 15:29, David Bryant wrote:


Because it doesn't make sense. All classes are derived from Object.
That
_has_ to be public, otherwise things like == wouldn't work.



Does the same apply for interfaces? I'm specifically implementing an
interface with non-public visibility. This shouldn't affect the
visibility of the implicit Object base-class.


Right. Only classes are affected.


Ok...so I still don't understand why the original example shouldn't
compile. I'm not trying to change the visibility of the base class but
rather the visibility of the interface.


To be clear: my subject line is misleading. I used that text because 
it's what came out of the compiler's mouth. I do understand your 
reasoning why you can't change the visibility of a base class, just not 
for an interface.


Forcing static foreach

2012-04-24 Thread Robert Clipsham

Is there anyway to force a static foreach to occur?

template TT(T...)
{
alias T TT;
}
void main()
{
// This works
foreach(s; TT!(a, b, c))
{
mixin(`int ` ~ s ~ `;`);
}

enum foo = TT!(a, b, c);
// This fails
foreach(s; foo)
{
mixin(`int ` ~ s ~ `;`);
}
}


Thanks,

--
Robert
http://octarineparrot.com/


Re: avoid toLower in std.algorithm.sort compare alias

2012-04-24 Thread Steven Schveighoffer

On Tuesday, 24 April 2012 at 11:24:44 UTC, Regan Heath wrote:
On Mon, 23 Apr 2012 16:43:20 +0100, Steven Schveighoffer 
schvei...@yahoo.com wrote:


While dealing with unicode in my std.stream rewrite, I've 
found that hand-decoding dchars is way faster than using 
library calls.


After watching Andrei's talk on generic and generative 
programming I have to ask, which routines are you avoiding .. 
it seems we need to make them as good as the hand coded code 
you've written...


from memory (don't have the code in front of me right now), it 
was std.uni.decode, and using foreach(dchar d; str) (which cannot 
be inlined currently).


IIRC, std.uni.decode was not being inlined.  So I tried 
hand-inlining it (I also discovered some optimizations it was not 
using), and it made a huge difference.


In regards to this discussion, I think icmp can also be improved 
when run on a char array, by doing a byte comparison (no dchar 
decoding) until it finds a difference.  That might be a huge 
speedup.  Right now, all dchars are being decoded, and translated 
to the toLower counterpart.  It may have an opposite effect, 
however, if there are a lot of strings that are equivalent when 
ignoring case, but not exactly the same.


-Steve


Re: avoid toLower in std.algorithm.sort compare alias

2012-04-24 Thread Steven Schveighoffer
On Tuesday, 24 April 2012 at 14:54:48 UTC, Steven Schveighoffer 
wrote:

On Tuesday, 24 April 2012 at 11:24:44 UTC, Regan Heath wrote:
After watching Andrei's talk on generic and generative 
programming I have to ask, which routines are you avoiding .. 
it seems we need to make them as good as the hand coded code 
you've written...


from memory (don't have the code in front of me right now), it 
was std.uni.decode, and using foreach(dchar d; str) (which 
cannot be inlined currently).


IIRC, std.uni.decode was not being inlined.  So I tried 
hand-inlining it (I also discovered some optimizations it was 
not using), and it made a huge difference.


BTW, you can check out my github branch of phobos named new-io2, 
look at the textstream struct to see what I've inlined.


-Steve


Re: Forcing static foreach

2012-04-24 Thread David

Am 24.04.2012 16:34, schrieb Robert Clipsham:

enum foo = TT!(a, b, c);


alias TT!(a, b, c) foo;

btw. there is std.typecons : TypeTuple with helpers (like staticMap)



Re: Nested RegEx

2012-04-24 Thread nrgyzer
== Auszug aus Dmitry Olshansky (dmitry.o...@gmail.com)'s Artikel
 On 21.04.2012 22:46, H. S. Teoh wrote:
  On Sat, Apr 21, 2012 at 09:41:18PM +0400, Dmitry Olshansky wrote:
  On 21.04.2012 21:24, nrgyzer wrote:
  Hi guys,
 
  I'm trying to use std.regex to parse a string like the following:
 
  string myString = preOuter {if condition1} content1 {if condition2}
content2
  {elseif condition3} content3 {else}any other content{/if}{/if} postOuter;
 
 
  Simply put pure regex is incapable of arbitrary-nested if-else
  statements. In a sense if... /if is a case of balanced parens
  problem and it's widely know to form non-regular language.
 
  This is of theoretical interest to me. Very often I find myself wanting
  a concise way to express patterns with nested matching delimiters, but
  regexes can't do it. But to jump to a full-blown stack-based language
  seems like an overkill to me: stack languages can express *much* more
  than just nested delimiters, most of which is difficult to encapsulate
  in a nice, concise syntax like regexes. All I want is a simple way to
  express the kind of simple nesting that matching delimiters give.
 
 Recursive descent is not particularly bad unless minimal grammar
 descent depth is high. Example:
 a+b-c
 uses a quite a lot of recursive calls for grammar with e.g. 10+ operator
 precedence levels.
 I'm thinking of merging operator precedence parser with regex might be a
 happy marriage you know.
 Back to OP topic something along the lines of this will do it (beware of
 stack overflow):
 void parseIf(){
   static int ifNest;
   if(input.startWith({if)){
   ifNest++;
   scope(exit) ifNest--;
   enforce(ifNest  1, conservative stack overflow);
   parseCond(input[2..$-1]);//regex that does condition
   enforce(input[$-1] == '}', close that if);
   parseIf();//parse body or another nested if
   //parseElse();//goes here, as does elif
   }
   else
   parseBody();// the regex you used before
 }
 
  [...]
  One day I may add push-pop stack extensions (that allow this kind of
  thing) into regex but I'd have to think hard to make it efficient.
  [...]
 
  Plus, have a nice concise syntax for it (otherwise I might as well just
  write a recursive descent parser for it in the first place).
 
 Concise syntax  lots of power is a priority actually, because I can
 detect if push-pop stuff is used or not and pick the right engine for
 the job. So different big-oh complexity is not important.

Thanks guys... I just solved the problem by using indexOf() from std.string for
parsing my if-statements. So... in principle, I can have unlimited nested if-
statements, but I think it's much more difficult (and slower) than using any
regex-expression.


Re: Keyword to avoid not null references

2012-04-24 Thread Namespace

After i'm sure, that this is a bug: Great work again.
If this bug will be fixed soon or someone can help me to find a 
workaround, then NotNull would be exactly what I always wanted.


Object Serialization?

2012-04-24 Thread dcoder

Hello.

I'm probably not looking hard enough, but Do we have any 
standard d-library for serializing an object/object tree into 
-for example- an xml file?


thanks.




Re: Object Serialization?

2012-04-24 Thread David Nadlinger

On Tuesday, 24 April 2012 at 16:42:19 UTC, dcoder wrote:
I'm probably not looking hard enough, but Do we have any 
standard d-library for serializing an object/object tree into 
-for example- an xml file?


There is no standard library support yet, but you might want to 
look at Orange (full fledged D serialization library) or the 
msgpack/Thrift D implementations (fast, lightweight, written with 
primarily RPC in mind).


David


Re: Why has base class protection been deprecated?

2012-04-24 Thread David Nadlinger

On Tuesday, 24 April 2012 at 12:22:14 UTC, David Bryant wrote:
This bothers me for two reasons: firstly it's not a base class, 
and secondly, it's a standard OO pattern of mine.


What's up with this?


Generally (and slightly inaccurately) speaking, D follows the 
Java model for inheritance rather than the C++ one, where base 
class protection attributes simply do not exist.


Besides that, I'm not quite sure what privately inheriting an 
interface would buy you – there would be no implementation to 
inherit anyway (except for final interface methods, but I doubt a 
valid use case for this would be easy to find)?


David


Re: Stack overflow / recursive expansion with alias this

2012-04-24 Thread Namespace

...
And therefore i get the same error, as if i wrote return
NotNull!(Foo)(this); instead of return 
assumeNotNull(this);, in the
_convert method of NotNull. The Output is Stack overflow. 
I think
that comes from recursive calls which fills the stack? Is that 
a bug?




Yes.


I found nothing like that. Is the bug reported?


How to pass list of strings as compile-time parameters?

2012-04-24 Thread H. S. Teoh
I'm trying to write a template function for doing member-wise
comparisons between two objects, with an optional list of members to
ignore. But I can't seem to figure out the syntax for passing a list of
strings (or an AA of strings) to the function?

I tried this:

bool compareByMemb(string[] ignores, T)(T obj1, T obj2) {
foreach (name; __traits(getAllMembers, T)) {
...
}
}

but the compiler complains:

Error: arithmetic/string type expected for value-parameter, not string[]

What gives?


T

-- 
Recently, our IT department hired a bug-fix engineer. He used to work for 
Volkswagen.


Re: How to pass list of strings as compile-time parameters?

2012-04-24 Thread Trass3r

bool compareByMemb(string[] ignores, T)(T obj1, T obj2) {
foreach (name; __traits(getAllMembers, T)) {
...
}


In this particular case you could try

foo(T, U...)(T obj1, T obj2, U ignores)


Re: How to pass list of strings as compile-time parameters?

2012-04-24 Thread H. S. Teoh
On Tue, Apr 24, 2012 at 07:39:42PM +0200, Trass3r wrote:
  bool compareByMemb(string[] ignores, T)(T obj1, T obj2) {
  foreach (name; __traits(getAllMembers, T)) {
  ...
  }
 
 In this particular case you could try
 
 foo(T, U...)(T obj1, T obj2, U ignores)

Sure, but U always string. Though I suppose I *could* use a signature
constraint to enforce that...


T

-- 
Guns don't kill people. Bullets do.


Re: How to pass list of strings as compile-time parameters?

2012-04-24 Thread H. S. Teoh
On Tue, Apr 24, 2012 at 10:47:53AM -0700, H. S. Teoh wrote:
 On Tue, Apr 24, 2012 at 07:39:42PM +0200, Trass3r wrote:
 bool compareByMemb(string[] ignores, T)(T obj1, T obj2) {
 foreach (name; __traits(getAllMembers, T)) {
 ...
 }
  
  In this particular case you could try
  
  foo(T, U...)(T obj1, T obj2, U ignores)
 
 Sure, but U always string. Though I suppose I *could* use a signature
 constraint to enforce that...
[...]

Well actually, U is a type tuple... but I want to constrain it to be
always a tuple of strings. How would that work?


T

-- 
It is widely believed that reinventing the wheel is a waste of time; but I 
disagree: without wheel reinventers, we would be still be stuck with wooden 
horse-cart wheels.


Re: How to pass list of strings as compile-time parameters?

2012-04-24 Thread Timon Gehr

On 04/24/2012 07:37 PM, H. S. Teoh wrote:

I'm trying to write a template function for doing member-wise
comparisons between two objects, with an optional list of members to
ignore. But I can't seem to figure out the syntax for passing a list of
strings (or an AA of strings) to the function?

I tried this:

bool compareByMemb(string[] ignores, T)(T obj1, T obj2) {
foreach (name; __traits(getAllMembers, T)) {
...
}
}

but the compiler complains:

Error: arithmetic/string type expected for value-parameter, not string[]

What gives?


T



Try using an alias parameter (with an optional type constraint). imo the 
template instantiation semantics needs a clean-up.


Re: How to pass list of strings as compile-time parameters?

2012-04-24 Thread H. S. Teoh
On Tue, Apr 24, 2012 at 08:03:07PM +0200, Timon Gehr wrote:
 On 04/24/2012 07:37 PM, H. S. Teoh wrote:
 I'm trying to write a template function for doing member-wise
 comparisons between two objects, with an optional list of members to
 ignore. But I can't seem to figure out the syntax for passing a list of
 strings (or an AA of strings) to the function?
 
 I tried this:
 
  bool compareByMemb(string[] ignores, T)(T obj1, T obj2) {
  foreach (name; __traits(getAllMembers, T)) {
  ...
  }
  }
 
 but the compiler complains:
 
  Error: arithmetic/string type expected for value-parameter, not string[]
[...]
 Try using an alias parameter (with an optional type constraint). imo
 the template instantiation semantics needs a clean-up.

Thanks, that did it!

For posterity, here's the code (which I think is generally usable for
many more things than I'm using it for in my code):

bool membCmp(T)(T t1, T t2) {
return membCmpIgnoring!(cast(string[])[])(t1, t2);
}

bool membCmpIgnoring(alias ignores, T)(T t1, T t2)
if (is(typeof(ignores)==string[]))
{
nextMemb: foreach (name; __traits(allMembers, T)) {
foreach (i; ignores) {
if (name == i)
continue nextMemb;
}
static if (__traits(compiles, __traits(getMember, t1,
name)))
{
alias typeof(__traits(getMember, t1, name))
type;
static if (!is(type==function))
{
auto val1 = __traits(getMember, t1, 
name);
auto val2 = __traits(getMember, t2, 
name);
if (val1 != val2)
return false;
}
}
}
return true;
}

Given two structs or objects, X and Y, this lets you do an easy
implementation of opEquals():

bool opEquals(Object obj) {
auto o = cast(typeof(this))obj;
return obj  membCmp(this, o);
}

If you wish to ignore some fields, say x and y, in the comparison, then
just do this:

bool opEquals(Object obj) {
auto o = cast(typeof(this))obj;
return obj  membCmpIgnoring!([x, y])(this, o);
}


Question: is it possible to sugar up the syntax even more, by allowing
an array of aliases? Or is that pushing the template syntax a bit too
far? I.e., can we make it possible to write:

membCmpIgnoring!(x,y)(this, o)

without the string list syntax?


T

-- 
Prosperity breeds contempt, and poverty breeds consent. -- Suck.com


Recommended way to access numeric_limits epsilon()

2012-04-24 Thread Timo Westkämper
What is the recommended way to access the equivalent of 
numeric_limits epsilon() in D? I am searching especially for the 
double version.


http://www.cplusplus.com/reference/std/limits/numeric_limits/


Re: Recommended way to access numeric_limits epsilon()

2012-04-24 Thread H. S. Teoh
On Tue, Apr 24, 2012 at 08:36:34PM +0200, 
digitalmars-d-learn-boun...@puremagic.com wrote:
 What is the recommended way to access the equivalent of
 numeric_limits epsilon() in D? I am searching especially for the
 double version.
 
 http://www.cplusplus.com/reference/std/limits/numeric_limits/

Check this page:

http://dlang.org/property.html

under Properties for Floating Point Types.


--T


Re: Object Serialization?

2012-04-24 Thread Jacob Carlborg

On 2012-04-24 18:42, dcoder wrote:

Hello.

I'm probably not looking hard enough, but Do we have any standard
d-library for serializing an object/object tree into -for example- an
xml file?

thanks.


You can have a look at Orange:

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

Tutorials:

http://dsource.org/projects/orange/wiki/Tutorials

API reference: 
http://dl.dropbox.com/u/18386187/orange_docs/orange.serialization.Serializer.html


--
/Jacob Carlborg


Re: Recommended way to access numeric_limits epsilon()

2012-04-24 Thread Timo Westkämper

On Tuesday, 24 April 2012 at 18:48:15 UTC, H. S. Teoh wrote:
On Tue, Apr 24, 2012 at 08:36:34PM +0200, 
digitalmars-d-learn-boun...@puremagic.com wrote:

What is the recommended way to access the equivalent of
numeric_limits epsilon() in D? I am searching especially for 
the

double version.

http://www.cplusplus.com/reference/std/limits/numeric_limits/


Check this page:

http://dlang.org/property.html

under Properties for Floating Point Types.


--T


Thanks a lot.


Re: Stack overflow / recursive expansion with alias this

2012-04-24 Thread Timon Gehr

On 04/24/2012 07:09 PM, Namespace wrote:

...
And therefore i get the same error, as if i wrote return
NotNull!(Foo)(this); instead of return assumeNotNull(this);, in the
_convert method of NotNull. The Output is Stack overflow. I think
that comes from recursive calls which fills the stack? Is that a bug?



Yes.


I found nothing like that. Is the bug reported?


I remember reporting a similar issue, but that one seems to have been 
fixed. Feel free to create a new ticket.


Re: Stack overflow / recursive expansion with alias this

2012-04-24 Thread Namespace

On Tuesday, 24 April 2012 at 19:34:26 UTC, Timon Gehr wrote:

On 04/24/2012 07:09 PM, Namespace wrote:

...
And therefore i get the same error, as if i wrote return
NotNull!(Foo)(this); instead of return 
assumeNotNull(this);, in the
_convert method of NotNull. The Output is Stack 
overflow. I think
that comes from recursive calls which fills the stack? Is 
that a bug?




Yes.


I found nothing like that. Is the bug reported?


I remember reporting a similar issue, but that one seems to 
have been fixed. Feel free to create a new ticket.


That's what I do now. Thanks a lot for your help.


Re: avoid toLower in std.algorithm.sort compare alias

2012-04-24 Thread Jonathan M Davis
On Tuesday, April 24, 2012 12:24:44 Regan Heath wrote:
 On Mon, 23 Apr 2012 16:43:20 +0100, Steven Schveighoffer
 
 schvei...@yahoo.com wrote:
  While dealing with unicode in my std.stream rewrite, I've found that
  hand-decoding dchars is way faster than using library calls.
 
 After watching Andrei's talk on generic and generative programming I have
 to ask, which routines are you avoiding .. it seems we need to make them
 as good as the hand coded code you've written...

In general, when operating on strings generically, you up having to treat them 
as ranges of dchar and decode everything, but there are a lot of cases where 
you can special-case algorithms for narrow strings and avoid decoding them. 
Phobos does this a lot (though it can probably do a better job of it in a 
number of places), so by using functions from there rather than rolling your 
own, the problem is reduced, but any time that you're doing a lot of generic 
string processing, there's a decent chance that you're going to have to 
special case some stuff for arrays of char, wchar, and dchar in order to fully 
optimize it. And I don't think that there's really a way out of that beyond 
having a lot of functions already available (and already optimized) to do a 
lot of the string processing for you. There's a definite tension between 
genericity and effciency in the case of string processing - due primarily to 
variable length encodings.

- Jonathan M Davis


Re: Object Serialization?

2012-04-24 Thread sclytrack

On 04/24/2012 08:50 PM, Jacob Carlborg wrote:

On 2012-04-24 18:42, dcoder wrote:

Hello.

I'm probably not looking hard enough, but Do we have any standard
d-library for serializing an object/object tree into -for example- an
xml file?

thanks.


You can have a look at Orange:

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

Tutorials:

http://dsource.org/projects/orange/wiki/Tutorials

API reference:
http://dl.dropbox.com/u/18386187/orange_docs/orange.serialization.Serializer.html




Does it automatically pick everything to serialize?

How would you make it more selective?

struct Me
{
int x;
int y;
}

serialize x but not y.

Would you have to create a custom serializer?

If so I would like to see an example with the custom serializer and 
deserializer that only does the x.




Basic Example
Serialize Through Base Class
Register Serializer?



There is no register serializer example.



277 private void serializeStruct (T) (T value, string key, Id id)
278 {
279 string type = T.stringof;
280 
281 triggerEvents(serializing, value, {
282 archive.archiveStruct(type, key, id, {
283 if (type in serializers)
284 {
285 auto wrapper = getSerializerWrapper!(T)(type);
286 wrapper(value, this, key);
287 }
288 
289 else
290 {
291 static if (isSerializable!(T))
292 value.toData(this, key);
293 
294 else
295 objectStructSerializeHelper(value);
296 }
297 });
298 });
299 }



I assume that the wrapper is the custom serializer that can be registered.

Then there is the toData that a struct can have, basically
member functions that do the serialization. Priority is
given to the registered serializer over the member functions.

And the last one. ObjectStructSerializerHelper is more a default
serializer if none is registered or doesn't have the correct
isSerializable member functions.
ObjectStructSerializerHelper(T) (T .)


Just browsing, I haven't downloaded anything.






Extending std.format.formattedRead

2012-04-24 Thread H. S. Teoh
What's the correct way of implementing formattedRead support for
user-defined types? I tried overloading the unformatValue() template,
but for some reason the compiler doesn't seem to be picking it up.


T

-- 
People walk. Computers run.


Re: D 50% slower than C++. What I'm doing wrong?

2012-04-24 Thread bearophile

Marco Leise:

I ported fast paq8 (fp8) to D, and with some careful 
D-ification and optimization it runs a bit faster than the 
original C program when compiled with the GCC on Linux x86_64, 
Core 2 Duo.


I guess you mean GDC.
With DMD, even if you are a good D programmer, it's not easy to 
beat that original C compressor :-)

Do you have a link to your D version?
Matt Mahoney is probably willing to put a link in his site to 
your D version.



I don't know about this version of paq you ported the coder 
from,


It was a very basic coder.


  The D GC on the other hand allocates that memory and writes 
zeroes to it immediately.


Is this always done the first time the memory is allocated by the 
GC?



  The effect is two fold: First, the calloc version will use 
much less RAM, if
  the 'allocated' buffers aren't fully used (e.g. you 
compressed a small file).


On the other hand in D you may allocate the memory in a more 
conscious way.



static assert(Foo.sizeof == 64); helped me find a bug there 
that
  resulted from switching from C bitfields to the D version 
(which is a library

  solution in Phobos).


The Phobos D bitfields aren't required to mimic C, but that's an 
interesting case. Maybe it's a difference interesting to be taken 
a look at. Do you have the code of the two C-D versions?


Bye,
bearophile


Re: Range of random numbers

2012-04-24 Thread Joseph Rushton Wakeling

On 24/04/12 13:50, Christophe wrote:

We could also use a template to make a range out of a delegate and avoid
this workarround...


What I'd _really_ like to see is something which would allow you to generate a 
range of random numbers with an expression like,


auto rr = randomRange!distribution(/* distribution parameters */);

or,

auto rr = randomRange!distribution(size_t n, /* distribution parameters */);

... which would generate you either an infinite or length-n range of random 
numbers generated by the specified distribution, with the passed parameters.


So, you could call e.g.,

auto rr = randomRange!(uniform!())(100, 0.0, 1.0);

auto rr = randomRange!pareto(100, alpha, sigma);

auto rr = randomRange!exponential(lambda);

... etc.  But I'm not sure if this is feasible.


Re: Extending std.format.formattedRead

2012-04-24 Thread Kenji Hara

On Tuesday, 24 April 2012 at 21:50:03 UTC, H. S. Teoh wrote:

What's the correct way of implementing formattedRead support for
user-defined types? I tried overloading the unformatValue() 
template,
but for some reason the compiler doesn't seem to be picking it 
up.


Unfortunately, there is not yet general way.
The definition of unformatValue for user-defined type in 
different module isn't considered by std.format module. D's 
module system is closed in basic.


Kenji Hara


Re: Extending std.format.formattedRead

2012-04-24 Thread bearophile

H. S. Teoh:


What's the correct way of implementing formattedRead support for
user-defined types? I tried overloading the unformatValue() 
template,
but for some reason the compiler doesn't seem to be picking it 
up.


Maybe do you want to open this discussion in the main D
newsgroup? I think this is not a very important issue, but it's a
nice thing to have.

Bye,
bearophile


No implicitly convert derived ptr to base ptr?

2012-04-24 Thread Nick Sabalausky
The compiler rejects this:

class Base {}
class Derived : Base {}

void main()
{
Base*basePtr;
Derived* derivedPtr;

basePtr = derivedPtr; // ERROR
}

Is that really correct that it shouldn't be allowed?