Re: C++ Interop

2018-01-06 Thread qznc via Digitalmars-d-learn

On Saturday, 6 January 2018 at 11:20:01 UTC, Seb wrote:

On Saturday, 6 January 2018 at 11:17:56 UTC, Seb wrote:

On Friday, 5 January 2018 at 13:02:12 UTC, qznc wrote:
I'm exploring [0] C++ interop after watching Walter's 
presentation [1].


[...]


I know about this:

https://github.com/Remedy-Entertainment/binderoo

https://github.com/dlang/druntime/pull/1802


And:

https://github.com/dlang/druntime/pull/1316

Also I think Ian (@ibuclaw) and @Razvan7 are currently working 
on a header generation tool from D sources to C++ headers.


It would be great to have std::vector and std::string out of the 
box in D, but putting it into druntime? Druntime is supposed to 
be shared among all frontends, isn't it? GCC and Clang probably 
do not have equivalent vector/string classes that the same D code 
can be used.


C++ Interop

2018-01-05 Thread qznc via Digitalmars-d-learn
I'm exploring [0] C++ interop after watching Walter's 
presentation [1].


I hit a block with classes as template parameters. This means 
vector works, but vector does not. D seems to map 
vector!Foo to vector. Likewise shared_ptr is a 
problem. Any way to fix that on the D side? The ugly workaround 
is to adapt the C++ code.


I understand that this mapping makes sense for function calls 
because bar(Foo f) in D maps to bar(Foo *f) in C++. And C++ 
bar(Foo f) has no equivalent in D because classes are reference 
types.


On a related note, C++ interop requires to redeclare or even 
reimplement C++ code. Has anybody started a libcpp-in-d project? 
I'm looking for basics like vector and string.


[0] https://github.com/qznc/d-cpptest
[1] https://youtu.be/IkwaV6k6BmM


Re: Use of "T"

2017-04-12 Thread qznc via Digitalmars-d-learn

On Wednesday, 12 April 2017 at 13:17:42 UTC, solidstate1991 wrote:
How can I make use of T? I've seen it being used many times for 
this application.


What "T"? This letter is often used as a generic template 
parameter. Are you talking about templates?


Maybe you can give some examples of the "many times" you have 
seen it used?


Dub and bindings

2017-03-11 Thread qznc via Digitalmars-d-learn
Are there any general tips or best practices for bindings in dub 
packages?


For example, I love the d2sqlite3 package. It just works out of 
the box. No linker configuration or anything. However, that is 
probably a testament to sqlite's lack of dependencies. That 
cannot work for libraries, which rely on other libraries.


Should the C code be included in the Github repo? Are submodules 
fine? Should the C build be invoked by dub via 
"preBuildCommands"? What about system libraries? Can that be made 
cross-platform? Should lflags be specified in the dub config or 
should they be passed via environment variable?


There should be a general guide for this. Maybe there already is 
one?


Re: About spinlock implementation

2016-09-01 Thread qznc via Digitalmars-d-learn
On Thursday, 1 September 2016 at 10:30:12 UTC, Guillaume Piolat 
wrote:

On Thursday, 1 September 2016 at 07:46:04 UTC, qznc wrote:


I find the documentation on MemoryOrder lacking about the 
semantics of rel. :(


[0] https://dlang.org/library/core/atomic/memory_order.html


What helped me was to read std::memory_order documentation
http://en.cppreference.com/w/cpp/atomic/memory_order


Yes, but how do they map? Is D's rel = relaxed or release or 
acq_rel?


Also, reading C++ documentation should not be required of course. 
;)


Re: About spinlock implementation

2016-09-01 Thread qznc via Digitalmars-d-learn

On Thursday, 1 September 2016 at 06:44:13 UTC, mogu wrote:

I found an implementation of spinlock in concurrency.d.
```
static shared struct SpinLock
{
void lock() { while (!cas(&locked, false, true)) { 
Thread.yield(); } }
void unlock() { atomicStore!(MemoryOrder.rel)(locked, 
false); }

bool locked;
}
```
Why atomicStore use MemoryOrder.rel instead of MemoryOrder.raw?


I'm not sure I understand rel [0], but raw is too weak. Raw means 
no sequencing barrier, so


  local_var = protected_value;
  spinlock.unlock();

could be transformed (by compiler or CPU) to

  spinlock.unlock();
  local_var = protected_value;

This effectively makes the access to the protected value 
unprotected and nullifies the effect of the spinlock.


I find the documentation on MemoryOrder lacking about the 
semantics of rel. :(


[0] https://dlang.org/library/core/atomic/memory_order.html


Re: Implementing a cache

2016-07-03 Thread qznc via Digitalmars-d-learn

On Saturday, 2 July 2016 at 12:21:14 UTC, Lodovico Giaretta wrote:

On Saturday, 2 July 2016 at 12:10:28 UTC, qznc wrote:
Alternatively, any better idea to implement the cache? I guess 
there is no off-the-shelf/dub solution.


For now, I settled for a sorted array of cache entries plus an AA 
to map urls to indices into this array.


https://github.com/qznc/d-github/commit/46c013c650d2cf34911ad3e10308ee6a0b5e3690#diff-24abb1e4df591f2d28947bbde1a09220R79


Implementing a cache

2016-07-02 Thread qznc via Digitalmars-d-learn
I want to implement some caching for HTTP GET requests. Basically 
a map of URL to content. A cache needs some additional meta data 
(size, age, etc).


There seem to be two basic data structures available: Associative 
array (AA) or red black tree (RBT).


With AA cache eviction is inefficient. It requires to sort the 
keys of the AA with respect to a field in the value. Stack 
overflow says "use RBT instead" [0].


With RBT retrieving something is inefficient. To get an entry, we 
need to create an fake entry with the key and get a range of 
entries 'equal' to the fake one? Or can I exploit some "find on 
sorted range" algorithm somewhere?


Alternatively, any better idea to implement the cache? I guess 
there is no off-the-shelf/dub solution.


[0] 
https://stackoverflow.com/questions/10060625/how-to-sort-associative-arrays


Re: String compare in words?

2016-05-29 Thread qznc via Digitalmars-d-learn

On Sunday, 29 May 2016 at 17:42:48 UTC, Era Scarecrow wrote:
 Worse I'm not sure if the code generation already does that 
and possibly does a better job than what we could do by hand...


Not with dmd v2.071.0 or ldc 0.17.1.

At least not in all the variations I tried to trick them with, 
like copying into fixed-size array. Well, they did insert a 
memcmp and libc is probably optimized like that, but they copied 
data first, which is unnecessary.


Re: String compare in words?

2016-05-29 Thread qznc via Digitalmars-d-learn

On Sunday, 29 May 2016 at 18:15:16 UTC, qznc wrote:

On Sunday, 29 May 2016 at 17:38:17 UTC, Jonathan M Davis wrote:
And if you're not simply comparing for equality, what are you 
looking to figure out? Without more information about what 
you're trying to do, it's kind of hard to help you.


If I write the comparison naively, the assembly clearly shows a 
"movzbl" [0]. It loads a single byte! The other single byte 
load is encoded in the address mode of "cmp". Implementation:


bool stringcmp(string x, string y) {
  foreach(i; 0..x.length) {
if (x[i] != y[i]) // byte compare
  return false;
  }
  return true;
}

It makes no sense to load single bytes here. Since we only want 
to check for equality, we could load two full words and compare 
four or eight bytes in one go.


Ok, to answer my own question, this looks good:

bool string_cmp_opt(immutable(ubyte)[] x, immutable(ubyte)[] y) {
pragma(inline, false);
if (x.length != y.length) return false;
int i=0;
// word-wise compare is faster than byte-wise
if (x.length > size_t.sizeof)
for (; i < x.length - size_t.sizeof; i+=size_t.sizeof) {
size_t* xw = cast(size_t*) &x[i];
size_t* yw = cast(size_t*) &x[i];
if (*xw != *yw) return false;
}
// last sub-word part
for (; i < x.length; i+=1) {
if (x[i] != y[i]) // byte compare
return false;
}
return true;
}

Any comments or recommendations?


Re: String compare in words?

2016-05-29 Thread qznc via Digitalmars-d-learn

On Sunday, 29 May 2016 at 17:38:17 UTC, Jonathan M Davis wrote:
And if you're not simply comparing for equality, what are you 
looking to figure out? Without more information about what 
you're trying to do, it's kind of hard to help you.


If I write the comparison naively, the assembly clearly shows a 
"movzbl" [0]. It loads a single byte! The other single byte load 
is encoded in the address mode of "cmp". Implementation:


bool stringcmp(string x, string y) {
  foreach(i; 0..x.length) {
if (x[i] != y[i]) // byte compare
  return false;
  }
  return true;
}

It makes no sense to load single bytes here. Since we only want 
to check for equality, we could load two full words and compare 
four or eight bytes in one go.


This example is simplified and far-fetched. Actually, this is 
about the find algorithm [1].


[0] http://goo.gl/ttybAB
[1] 
http://forum.dlang.org/post/vdjraubhtoqtxeshj...@forum.dlang.org


String compare in words?

2016-05-29 Thread qznc via Digitalmars-d-learn
Given two string (or char[] or ubyte[]) objects, I want to 
compare them. The naive loop accesses the arrays byte-wise. How 
could I turn this into a word-wise compare for better performance?


Is a cast into size_t[] ok? Some Phobos helper functions?


Re: Newbie to D, first impressions and feedback on the 5 (and more) first minutes.

2016-05-25 Thread qznc via Digitalmars-d-learn

On Wednesday, 25 May 2016 at 09:41:10 UTC, Russel Winder wrote:
I do not really have the proper resources to host such a 
repository and because of this I have not built one. I know I 
should rather than just moan, but Debian is my main platform 
and that is covered.


Yes, this is the core problem. There is no single person, which 
(a) cares enough about Fedora and (b) can fix it. Unless this 
champion appears, Fedora will continue to suck for newbies.


Re: Newbie to D, first impressions and feedback on the 5 (and more) first minutes.

2016-05-24 Thread qznc via Digitalmars-d-learn

On Tuesday, 24 May 2016 at 15:27:45 UTC, llaine wrote:
As written in the description I'm really new to D, I discovered 
it a few weeks ago thanks to the D Conf in Berlin.


After playing around for couple of days with it, I wanted to 
share my journey with you guys on several points.


Thanks for writing this!

The "First 5 Minutes" (or days) are an important aspect, which 
the D community tries to improve. Since active D users already 
forgot about their first contact with D, the only information on 
what to improve are newbies telling their experience.


Re: reading file byLine

2015-09-02 Thread qznc via Digitalmars-d-learn

On Wednesday, 2 September 2015 at 13:46:54 UTC, Namal wrote:

On Wednesday, 2 September 2015 at 13:12:39 UTC, cym13 wrote:

On Wednesday, 2 September 2015 at 13:01:31 UTC, Namal wrote:

Hello,

I want to read a file line by line and store each line in a 
string. I found this example with byLine and ranges. First of 
all, do I need the range lib at all to do this and if so what 
is the range of the end of the file?


You don't need the range lib at all, std.range provides 
advanced functions to work with ranges but ranges are a 
general concept. You need std.stdio though as this is doing 
file operations.


A way to do it is:

void main() {
auto f = File("myfile");
string buffer;

foreach (line ; f.byLine) {
buffer ~= line;
}

f.close();
writeln(buffer);
}

Note that by default byLine doesn't keep the line terminator. 
See http://dlang.org/phobos/std_stdio.html#.File.byLine for 
more informations.


Thx, cym. I have a question about a D strings though. In c++ I 
would just reuse the string buffer with the "=" how can I clear 
the string after i store a line in the buffer and do something 
with it.


Just like in C++: buffer = line;

However, you can just use "line" instead of "buffer" then. The 
byLine does buffer internally, so it overwrites "line" on the 
next iteration of foreach. If you want to keep the line string, 
then make a copy "line.idup".


I also tried to append a line to an array of strings but it 
failed because the line is a char?


Here is how to get an array of lines:

import std.stdio;
void main() {
auto f = File("myfile");
string buffer[];

foreach (line ; f.byLine) {
buffer ~= line.idup;
}

f.close();
writeln(buffer);
}


Profiling with LDC/GDC?

2015-09-01 Thread qznc via Digitalmars-d-learn

Is it possible to profile with LDC/GDC?

At least LDC lists it as only an "idea". 
http://wiki.dlang.org/LDC_project_ideas


Re: linking external libs

2015-08-29 Thread qznc via Digitalmars-d-learn

On Thursday, 2 July 2015 at 12:10:52 UTC, Nicholas Wilson wrote:
Also is there a binding to GMP somewhere? I just hacked one 
together.


I could need the bindings to fix the pidigits benchmark.

There is this 7y old code on dsource: 
http://www.dsource.org/projects/bindings/browser/trunk/gmp


The readme says "This is in alpha state. All functions that have 
been tried seem to work. (8 out of many)", so not that confident.





Packing enums

2015-06-30 Thread qznc via Digitalmars-d-learn
I stumbled upon this interesting programming challenge [0], which 
imho should be possible to implement in D. Maybe someone here 
wants to try.


Task: Given two enums with less than 256 states, pack them into 
one byte and provide convenient accessor functions.


Something like this:

enum X { A, B, C };
enum Y { foo, bar, baz };
alias both = TwoEnums!(X,Y);
static assert(both.sizeof == 1);
both z;
z.X = B;
z.Y = bar;

Of course, you can generalize to "n enums packed into a minimal 
number of bytes".



[0] https://news.ycombinator.com/item?id=9800231


Re: std.container.Array deep-copy?

2014-10-10 Thread qznc via Digitalmars-d-learn

On Friday, 10 October 2014 at 10:59:59 UTC, Sag Academy wrote:

On Friday, 10 October 2014 at 10:32:17 UTC, yazd wrote:


Like the following? That did not work.

Array!Foo y = Array!Foo(x[]);


How does it not work?
It compiles successfully: http://dpaste.dzfl.pl/583d20e426a0


yeah man.


You are right.

Sorry. I probably messed up my test file somehow.


Re: std.container.Array deep-copy?

2014-10-10 Thread qznc via Digitalmars-d-learn

On Friday, 10 October 2014 at 06:27:35 UTC, yazd wrote:

On Thursday, 9 October 2014 at 21:24:55 UTC, qznc wrote:

On Thursday, 9 October 2014 at 21:14:46 UTC, qznc wrote:

How can you deep-copy a std.container.Array instance?


Ok, the deep-copy problem already got resolved on reddit: Use 
dup.


However, the error is still open. You cannot give an Array!X
argument to constructor/replace/insertBefore of Array!X 
instances?


You will just need to slice it to provide a range.


Like the following? That did not work.

Array!Foo y = Array!Foo(x[]);


Re: std.container.Array deep-copy?

2014-10-09 Thread qznc via Digitalmars-d-learn

On Thursday, 9 October 2014 at 21:14:46 UTC, qznc wrote:

How can you deep-copy a std.container.Array instance?


Ok, the deep-copy problem already got resolved on reddit: Use dup.

However, the error is still open. You cannot give an Array!X
argument to constructor/replace/insertBefore of Array!X instances?



std.container.Array deep-copy?

2014-10-09 Thread qznc via Digitalmars-d-learn

How can you deep-copy a std.container.Array instance?

The actual array data is heap-allocated and reference-counted.
Assignment and .dup only create additional references.

Using a copy constructor yields an error:

Array!Foo x;
Array!Foo y = Array!Foo(x);

Error: template std.container.Array!(Foo).Array.__ctor cannot
deduce function from argument types !()(Array!(Foo)), candidates
are:
/opt/compilers/dmd2/include/std/container.d(2652):
std.container.Array!(Foo).Array.__ctor(U)(U[] values...) if
(isImplicitlyConvertible!(U, T))
/opt/compilers/dmd2/include/std/container.d(2670):
std.container.Array!(Foo).Array.__ctor(Stuff)(Stuff stuff) if
(isInputRange!Stuff &&
isImplicitlyConvertible!(ElementType!Stuff, T) && !is(Stuff ==
T[]))


The question came up in a reddit discussion:
http://www.reddit.com/r/programming/comments/2ipdpa/floss_weekly_311_the_d_language/cl4yv8w