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