summaryrefslogtreecommitdiff
path: root/src/test/java/com/seaofnodes/simple/spill/Chapter21AllocTest-testString.smp
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/java/com/seaofnodes/simple/spill/Chapter21AllocTest-testString.smp')
-rw-r--r--src/test/java/com/seaofnodes/simple/spill/Chapter21AllocTest-testString.smp35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/test/java/com/seaofnodes/simple/spill/Chapter21AllocTest-testString.smp b/src/test/java/com/seaofnodes/simple/spill/Chapter21AllocTest-testString.smp
new file mode 100644
index 00000000..a18a5b88
--- /dev/null
+++ b/src/test/java/com/seaofnodes/simple/spill/Chapter21AllocTest-testString.smp
@@ -0,0 +1,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;