extend "in" to all array types
Namespace
rswhite4 at googlemail.com
Wed Jan 15 09:33:26 PST 2014
On Wednesday, 15 January 2014 at 17:29:07 UTC, Tobias Pankrath
wrote:
> On Wednesday, 15 January 2014 at 17:13:37 UTC, Meta wrote:
>>
>> auto inWrap(T)(T[] arr)
>> {
>> static struct InWrapper
>> {
>> import std.typecons: Nullable;
>>
>> private T[] payload;
>>
>> Nullable!size_t opBinaryRight(string op: "in")(T val)
>> {
>> Nullable!size_t index;
>> foreach (i, element; payload)
>> {
>> if (element == val)
>> {
>> index = i;
>>
>> return index;
>> }
>> }
>>
>> return index;
>> }
>> }
>>
>> return InWrapper(arr);
>> }
>>
>> void main()
>> {
>> auto arr = [0, 1, 2, 3, 4];
>> auto i = 2 in arr.inWrap;
>> assert(!i.isNull);
>> assert(i == 2);
>> }
>
> The in-operator should return T* for consistency with the
> build-in ones.
That was exactly my thoughts:
----
auto each(T)(T[] arr) pure nothrow {
static struct InWrapper {
private T[] payload;
T* opBinaryRight(string op : "in")(T val) pure nothrow {
foreach (ref T element; payload) {
if (element == val)
return &element;
}
return null;
}
}
return InWrapper(arr);
}
void main() {
int[] arr = [0, 1, 2, 3, 4];
auto i = 2 in arr.each;
assert(i !is null);
assert(*i == 2);
}
----
Something like that should really be in std.array.
More information about the Digitalmars-d
mailing list