summaryrefslogtreecommitdiff
path: root/src/test/java/com/seaofnodes/simple/spill/Chapter21AllocTest-testString.smp
blob: a18a5b884e584fcf01b5435497ce8f9bd09b8c22 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// -*- mode: java;  -*-
struct _String {
    u8[] cs;
    int _hashCode;
    new _String = { u8[] data -> cs=data; };
};

// Compare two Strings
val equals = { !_String !self, !_String s ->
    if( self == s ) return true;
    if( self.cs# != s.cs# ) return false;
    for( int i=0; i< self.cs#; i++ )
        if( self.cs[i] != s.cs[i] )
            return false;
    return true;
};

// Return the String hashCode (cached, and never 0)
val hashCode = { !_String self ->
    self._hashCode
    ?  self._hashCode
    : (self._hashCode = _hashCodeString(self));
};

val _hashCodeString = { !_String self ->
    int hash=0;
    if( self.cs )
        for( int i=0; i< self.cs#; i++ )
            hash = hash*31 + self.cs[i];
    if( !hash ) hash = 123456789;
    return hash;
};

// This fixture exports its API, not the last declaration as a result.
return 0;