Hi, guys. <span class="Apple-style-span" style="font-family: sans-serif; font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">— said the shy newcomer.</span><div>
<font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"><br></span></font></div>
<div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;">I've started reading The D Programming Language just yesterday and I'm making my first attempts to dig into D now. I must say I'm loving the language beyond recognition. I never thought there was a language out there that had everything I ever wanted in C++ (I even considered developing my own language before knowing D!).</span></font></div>
<div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"><br></span></font></div>
<div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;">Right now I'm wondering how's the best way to create a dynamic array object which will only accept "unique" elements (i.e., elements != from the existing elements in the array).</span></font></div>
<div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"><br></span></font></div>
<div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;">I wanted a class that kept all the functionality of an array (e.g. being the right range types so that they can be passed to std.format.formatValue and trigger the right specialization) for maximum integration with the standard library. I thought about writing a class template privately containing an array and redirecting everything but the assignment/insertion operations to it. All ways of placing an object that was already there should throw an exception, but everything else should work the same.</span></font></div>
<div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"><br></span></font></div>
<div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;">Doing it this way is a lot of work for a simple thing, so some sort of internal alert in me tell me I might just be "doing-it-wrong". I want to know what your ideas are.</span></font></div>
<div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"><br></span></font></div>
<div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;">I want some way to achieve this sort of thing:</span></font></div>
<div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"><br></span></font></div>
<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><div><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><font class="Apple-style-span" face="'courier new', monospace">import myproject.helpers.UniqueArray;</font></span></div>
<div><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><font class="Apple-style-span" face="'courier new', monospace"><br>
</font></span></div><div><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><font class="Apple-style-span" face="'courier new', monospace">void main()</font></span></div>
<div><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><font class="Apple-style-span" face="'courier new', monospace">{</font></span></div>
<div><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><font class="Apple-style-span" face="'courier new', monospace">    auto a0 = [1, 2, 3];</font></span></div>
<div><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><font class="Apple-style-span" face="'courier new', monospace"><br>
</font></span></div><div><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><font class="Apple-style-span" face="'courier new', monospace">    // I'm not yet sure how to go about the constructor, since:</font></span></div>
<div><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><font class="Apple-style-span" face="'courier new', monospace"><br>
</font></span></div><div><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><font class="Apple-style-span" face="'courier new', monospace">    auto a1 = UniqueArray!(int)(a0[1 .. $]); // error: should not be able to internally hold reference to</font></span></div>
<div><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><font class="Apple-style-span" face="'courier new', monospace">                                             // </font></span><span class="Apple-style-span" style="font-family: 'courier new', monospace; font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">a raw </span><span class="Apple-style-span" style="font-family: 'courier new', monospace; font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">array since this could be used to break the "unique</span></div>
<div><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><font class="Apple-style-span" face="'courier new', monospace">                                             // elements" contract promise of UniqueArray</font></span></div>
<div><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><font class="Apple-style-span" face="'courier new', monospace">                                             // copy of elements can be considered, but I'd rather</font></span></div>
<div><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><font class="Apple-style-span" face="'courier new', monospace">                                             // have clients copy the array themselves so that they</font></span></div>
<div><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><font class="Apple-style-span" face="'courier new', monospace">                                             // know it is happening</font></span></div>
<div><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><font class="Apple-style-span" face="'courier new', monospace"><br>
</font></span></div><div><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><font class="Apple-style-span" face="'courier new', monospace">    auto a2 = UniqueArray!(int)(</font></span><span class="Apple-style-span" style="font-family: 'courier new', monospace; font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">a0[1 .. $].dup); // should be fine if D had some sort of</span><span class="Apple-style-span" style="font-family: 'courier new', monospace; font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "> non-const</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace; font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">                                                 // rvalue reference support, but I think it does not;</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace; font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">                                                 // am I wrong?</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace; font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><br></span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace; font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">    auto a3 = UniqueArray!(int)(</span><span class="Apple-style-span" style="font-family: 'courier new', monospace; font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">a0[1 .. $].idup</span><span class="Apple-style-span" style="font-family: 'courier new', monospace; font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">); // semantically pleasing at first sight, but</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace; font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">                                                  // suboptimal: the constructor would have to copy</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace; font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">                                                  // the passed array again to get rid of immutability</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace; font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><br></span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace; font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">    auto a4 = bestOptionOutOf(a1, a2, a3); // (:</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace; font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><br></span></div>
<div><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><font class="Apple-style-span" face="'courier new', monospace">    a4[1 .. $] = [3, 4, 5]; // ok: would first construct a UniqueArray out of the rvalue (thus ensuring</font></span></div>
<div><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><font class="Apple-style-span" face="'courier new', monospace">                            // "uniqueness" of elements) and then would work like a usual slice</font></span></div>
<div><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><font class="Apple-style-span" face="'courier new', monospace">                            // </font></span><span class="Apple-style-span" style="font-family: 'courier new', monospace; font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">assignment</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace; font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><br></span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace; font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">    a4 ~= 5; // throws exception: 5 is already in the array!</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace; font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">    a4 ~= 6; // ok: 6 is not there</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace; font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><br></span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace; font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">    </span><span class="Apple-style-span" style="font-family: 'courier new', monospace; font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">writeln(a4); // ok, output: [2, 3, 4, 5, 6]</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace; font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">                 // could just implement UniqueArray.toString() for this to work, but making UniqueArray</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace; font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">                 // </span><span class="Apple-style-span" style="font-family: 'courier new', monospace; font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">properly </span><span class="Apple-style-span" style="font-family: 'courier new', monospace; font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">model the ranges an array models solves this problem and others at the same</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace; font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">                 // time</span></div>
<div><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><font class="Apple-style-span" face="'courier new', monospace"><br>
</font></span></div><div><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><font class="Apple-style-span" face="'courier new', monospace">    auto a5 = a4.dup; // all properties of an array, such as dup here, should hold and overall</font></span></div>
<div><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><font class="Apple-style-span" face="'courier new', monospace">                      // the object should behave as one would expect from an array</font></span></div>
<div><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><font class="Apple-style-span" face="'courier new', monospace"><br>
</font></span></div><div><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><font class="Apple-style-span" face="'courier new', monospace">    int[] a6 = a5; // error: obviously shouldn't work since a6 could then be used to break the</font></span></div>
<div><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><font class="Apple-style-span" face="'courier new', monospace">                   // UniqueArray contract</font></span></div>
</blockquote><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><div><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><font class="Apple-style-span" face="'courier new', monospace">}</font></span></div>
</blockquote><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><div><font class="Apple-style-span" face="arial, helvetica, sans-serif"><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><br>
</span></font></div><font class="Apple-style-span" face="arial, helvetica, sans-serif">What do you think?</font><br></span><div><br>-- <br>Atenciosamente / Sincerely,<br>Guilherme ("n2liquid") Vieira<br>
</div>