Sean Kelly wrote:
Chris R Miller wrote:
===== Short Story =====
I needed to search through a String (NSString) specifically to know
whether a character at a specific index is any one of a given set of
characters. Rather than subclass NSString, I decided to make a category:
> [snip]
Won't all of this be solved by the planned D2 feature of making these
operations synonymous for all types?
void fn(T val);
T t;
fn(t);
t.fn();
Or are you saying that these added functions can actually access private
data in the class?
Yes, they can access private data. I see how this could be both a
feature and a potential hazard. Then again, do you not need to be
careful when subclassing things in Java-style OO languages? Otherwise
you can very easily mire yourself in a world of objects that end up
hindering more than helping.
And just to prove D's potency, the very algorithm I used was stolen from
something I wrote in D not long ago:
====== DuffsDevice.d ======
module duffsdevice;
import tango.io.Stdout;
/// tells if anything in the contents of arr1 are present in arr2
/// uses type implicit opCmp for comparison
bool hasAnyOf(T)(T[] arr1,T[] arr2){
T[] small,large;
if(arr1.length>arr2.length){
large=arr1;small=arr2;
}else{
large=arr2;small=arr1;
}
int lp,rm=large.length%10;
foreach(T t;small){
lp=(large.length-1)/10;
switch(rm){
case 0: do{
if(t==large[lp*10+9]) return true;
case 9: if(t==large[lp*10+8]) return true;
case 8: if(t==large[lp*10+7]) return true;
case 7: if(t==large[lp*10+6]) return true;
case 6: if(t==large[lp*10+5]) return true;
case 5: if(t==large[lp*10+4]) return true;
case 4: if(t==large[lp*10+3]) return true;
case 3: if(t==large[lp*10+2]) return true;
case 2: if(t==large[lp*10+1]) return true;
case 1: if(t==large[lp*10 ]) return true;
}while(0<--lp);
break;
}
}
return false;
}
void main(char[][] argc) {
if(argc.length>2) {
Stdout("argc[0]=={}",argc[1]).newline;
Stdout("argc[1]=={}",argc[2]).newline;
Stdout("hasAnyOf!(char[])(argc[0],argc[1])=={}",
hasAnyOf!(char)(argc[1],argc[2])).newline;
}
}
====== EOF ======
Personally I prefer the D to the Objective-C implementation.