]> gitweb.factorcode.org Git - factor.git/commitdiff
str/vector-hashcode
authorSlava Pestov <slava@factorcode.org>
Mon, 27 Sep 2004 01:34:25 +0000 (01:34 +0000)
committerSlava Pestov <slava@factorcode.org>
Mon, 27 Sep 2004 01:34:25 +0000 (01:34 +0000)
19 files changed:
TODO.FACTOR.txt
factor/FactorArray.java
library/cross-compiler.factor
library/platform/native/kernel.factor
library/platform/native/primitives.factor
library/platform/native/vectors.factor
library/test/httpd/html.factor
library/test/math/bitops.factor
library/test/sbuf.factor [new file with mode: 0644]
library/test/strings.factor
library/test/test.factor
library/test/vectors.factor
native/primitives.c
native/primitives.h
native/relocate.c
native/sbuf.c
native/sbuf.h
native/string.c
native/string.h

index 0b904095d815ee3858d18cd7d9f4558d670fa469..4e0b1a6c5517db0bdebf24f406046dff47579cef 100644 (file)
@@ -44,8 +44,6 @@ FFI:
 - add a socket timeout\r
 - fix error postoning -- not all errors thrown by i/o code are\r
   postponed\r
-- sbuf-hashcode\r
-- vector-hashcode\r
 - some way to run httpd from command line\r
 \r
 + bignums:\r
index ea686b20598a377aaeefea35bd4e927871f6fd9c..8010940a9f33dbd5dd441f3ae811afe4ca9a0746 100644 (file)
@@ -204,6 +204,20 @@ public class FactorArray implements FactorExternalizable, PublicCloneable
                }
        } //}}}
 
+       //{{{ hashCode() method
+       public int hashCode()
+       {
+               int hashCode = 0;
+               for(int i = 0; i < Math.min(top,4); i++)
+               {
+                       Object obj = stack[i];
+                       if(obj != null)
+                               hashCode ^= obj.hashCode();
+               }
+
+               return hashCode;
+       } //}}}
+
        //{{{ equals() method
        public boolean equals(Object obj)
        {
index ce22a59505de9fef3a0f05ca2640785dd3f236f6..2b64d12c850195b967d2360e3dd50acb34f18003 100644 (file)
@@ -80,6 +80,7 @@ IN: strings
 DEFER: str=
 DEFER: str-hashcode
 DEFER: sbuf=
+DEFER: sbuf-hashcode
 DEFER: sbuf-clone
 
 IN: files
@@ -221,6 +222,7 @@ IN: image
         sbuf-reverse
         sbuf-clone
         sbuf=
+        sbuf-hashcode
         arithmetic-type
         number?
         >fixnum
index b12a447e4952f5db8a4d5ba26f878bca1c0f50e8..87bb0808c912aae27d3216933f98545704d13a1c 100644 (file)
@@ -67,9 +67,9 @@ USE: vectors
         [ drop 0 ]
         [ drop 0 ]
         [ drop 0 ]
-        [ drop 0 ]
+        [ vector-hashcode ]
         [ str-hashcode ]
-        [ drop 0 ]
+        [ sbuf-hashcode ]
         [ drop 0 ]
         [ >fixnum ]
         [ >fixnum ]
index b8009cc93bf181a0709c3a0e10fb7dee5723335c..9c80ae3ba35931a89e5269492cfc9e743f1366a6 100644 (file)
@@ -75,6 +75,7 @@ USE: words
     [ sbuf-reverse           | " sbuf -- " ]
     [ sbuf-clone             | " sbuf -- sbuf " ]
     [ sbuf=                  | " sbuf sbuf -- ? " ]
+    [ sbuf-hashcode          | " sbuf -- n " ]
     [ arithmetic-type        | " n n -- type " ]
     [ number?                | " obj -- ? " ]
     [ >fixnum                | " n -- fixnum " ]
index 7508e6743ca17f67ed0788a31d377660afb4d43e..5fead95f81a32f6b1017860a23b280113a503396 100644 (file)
@@ -66,3 +66,11 @@ USE: stack
     ] [
         2drop f
     ] ifte ;
+
+: ?vector-nth ( n vec -- obj/f )
+    2dup vector-length >= [ 2drop f ] [ vector-nth ] ifte ;
+
+: vector-hashcode ( vec -- n )
+    0 swap 4 [
+        over ?vector-nth hashcode rot bitxor swap
+    ] times* drop ;
index cb6303eb68270efed59a421148270dccb5ccbc76..2ab1a8cf6d12673f5c0086650a7592b69e2b8a14 100644 (file)
@@ -19,7 +19,7 @@ USE: stack
     ] with-scope
 ] unit-test
 
-[ "<img src='/resource/library/icons/File.png'>" ]
+[ "<img src='/responder/resource/library/icons/File.png'>" ]
 [
     [
         ""
index fd39b8c9927015db4915986435149cf8292f75fc..406611748ac0663550bd04f09bcbb8ba8346527d 100644 (file)
@@ -51,6 +51,6 @@ USE: lists
 
 [ 12 ] [ 11 4 align ] unit-test
 [ 12 ] [ 12 4 align ] unit-test
-[ 12 ] [ 10 2 align ] unit-test
+[ 10 ] [ 10 2 align ] unit-test
 [ 14 ] [ 13 2 align ] unit-test
 [ 11 ] [ 11 1 align ] unit-test
diff --git a/library/test/sbuf.factor b/library/test/sbuf.factor
new file mode 100644 (file)
index 0000000..6c3e5a3
--- /dev/null
@@ -0,0 +1,29 @@
+IN: scratchpad
+USE: combinators
+USE: errors
+USE: kernel
+USE: logic
+USE: math
+USE: namespaces
+USE: stack
+USE: strings
+USE: test
+
+native? [
+    [ t ] [ "Foo" str>sbuf "Foo" str>sbuf = ] unit-test
+    [ f ] [ "Foo" str>sbuf "Foob" str>sbuf = ] unit-test
+    [ f ] [ 34 "Foo" str>sbuf = ] unit-test
+    
+    [ "Hello" ] [
+        100 <sbuf> "buf" set
+        "Hello" "buf" get sbuf-append
+        "buf" get clone "buf-clone" set
+        "World" "buf-clone" get sbuf-append
+        "buf" get sbuf>str
+    ] unit-test
+
+    [ t ] [
+        "Hello world" str>sbuf hashcode
+        "Hello world" hashcode =
+    ] unit-test
+] when
index 07fa8e6ccc6b135bce7da8edd75a2a7218fd79a5..5c98bc8458af127c6bdd8601939988996f800497 100644 (file)
@@ -88,20 +88,6 @@ unit-test
 [ "fedcba" ] [ "abcdef" str-reverse ] unit-test
 [ "edcba" ] [ "abcde" str-reverse ] unit-test
 
-native? [
-    [ t ] [ "Foo" str>sbuf "Foo" str>sbuf = ] unit-test
-    [ f ] [ "Foo" str>sbuf "Foob" str>sbuf = ] unit-test
-    [ f ] [ 34 "Foo" str>sbuf = ] unit-test
-    
-    [ "Hello" ] [
-        100 <sbuf> "buf" set
-        "Hello" "buf" get sbuf-append
-        "buf" get clone "buf-clone" set
-        "World" "buf-clone" get sbuf-append
-        "buf" get sbuf>str
-    ] unit-test
-] when
-
 [ f ] [ [ 0 10 "hello" substring ] [ not ] catch ] unit-test
 
 [ [ "hell" "o wo" "rld" ] ] [ 4 "hello world" split-n ] unit-test
index 3304914651f29ddfe94eee8a5f09c266d7b88b3b..6a2c7f92d10d1b1ebb9017d26696d75fc29a09d9 100644 (file)
@@ -72,6 +72,7 @@ USE: unparser
         "errors"
         "hashtables"
         "strings"
+        "sbuf"
         "namespaces/namespaces"
         "files"
         "format"
index 33098e517d639dbd0a68061617ee1f025d4f2e48..cd81ae9a7e3a39ceb250f857ea14d38d9ad31468 100644 (file)
@@ -27,3 +27,8 @@ USE: vectors
 [ list>vector [ 3 > ] vector-all? ] test-word
 [ t ] [ [ ] ]
 [ list>vector [ 3 > ] vector-all? ] test-word
+
+[ t ] [ { } hashcode { } hashcode = ] unit-test
+[ t ] [ { 1 2 3 } hashcode { 1 2 3 } hashcode = ] unit-test
+[ t ] [ { 1 { 2 } 3 } hashcode { 1 { 2 } 3 } hashcode = ] unit-test
+[ t ] [ { } hashcode { } hashcode = ] unit-test
index 3489be5e714f4beb9c495c9f999b3ad1b7b59f9b..de8e9fb4cad5f571eed0fc13b076c5d95ec83dff 100644 (file)
@@ -34,6 +34,7 @@ XT primitives[] = {
        primitive_sbuf_reverse,
        primitive_sbuf_clone,
        primitive_sbuf_eq,
+       primitive_sbuf_hashcode,
        primitive_arithmetic_type,
        primitive_numberp,
        primitive_to_fixnum,
index 1aa49ac28140a009df69e8ae1f2e8e2ec6c3c589..bf3cca526c9527b071f6523c7b2ae3b75d30717a 100644 (file)
@@ -1,4 +1,4 @@
 extern XT primitives[];
-#define PRIMITIVE_COUNT 192
+#define PRIMITIVE_COUNT 193
 
 CELL primitive_to_xt(CELL primitive);
index 9adcd5f89079a127da1e674c8c382250805928a9..917288b82a78214cfc6787ffeef4e3ee21e2baa8 100644 (file)
@@ -20,7 +20,7 @@ void relocate_object()
                fixup_vector((VECTOR*)relocating);
                break;
        case STRING_TYPE:
-               hash_string((STRING*)relocating);
+               rehash_string((STRING*)relocating);
                break;
        case SBUF_TYPE:
                fixup_sbuf((SBUF*)relocating);
index 80a391b0a315bdf59a284be765d8a1b1e836ed87..9c1cefa9a81abe0fb9858a5085fce76ab5cc6a8a 100644 (file)
@@ -100,7 +100,7 @@ void primitive_sbuf_to_string(void)
 {
        SBUF* sbuf = untag_sbuf(dpeek());
        STRING* s = string_clone(sbuf->string,sbuf->top);
-       hash_string(s);
+       rehash_string(s);
        drepl(tag_object(s));
 }
 
@@ -120,7 +120,9 @@ void primitive_sbuf_clone(void)
 
 bool sbuf_eq(SBUF* s1, SBUF* s2)
 {
-       if(s1->top == s2->top)
+       if(s1 == s2)
+               return true;
+       else if(s1->top == s2->top)
                return (string_compare_head(s1->string,s2->string,s1->top) == 0);
        else
                return false;
@@ -136,6 +138,12 @@ void primitive_sbuf_eq(void)
                dpush(F);
 }
 
+void primitive_sbuf_hashcode(void)
+{
+       SBUF* sbuf = untag_sbuf(dpop());
+       dpush(tag_fixnum(hash_string(sbuf->string,sbuf->top)));
+}
+
 void fixup_sbuf(SBUF* sbuf)
 {
        sbuf->string = fixup_untagged_string(sbuf->string);
index 0c40cc95cab4e07354e8c26080cdfac4c074a507..02d760bcce607f597093c9128ff438eec26607d6 100644 (file)
@@ -29,5 +29,6 @@ void primitive_sbuf_reverse(void);
 void primitive_sbuf_clone(void);
 bool sbuf_eq(SBUF* s1, SBUF* s2);
 void primitive_sbuf_eq(void);
+void primitive_sbuf_hashcode(void);
 void fixup_sbuf(SBUF* sbuf);
 void collect_sbuf(SBUF* sbuf);
index a3102a99703f00db75f05d7c66ab68af26041059..42a9fcd4c85a99ddd26270b2a540482cd25e6c00 100644 (file)
@@ -13,14 +13,20 @@ STRING* allot_string(FIXNUM capacity)
 }
 
 /* call this after constructing a string */
-/* uses same algorithm as java.lang.String for compatibility */
-void hash_string(STRING* str)
+/* uses same algorithm as java.lang.String for compatibility with
+images generated from Java Factor. */
+FIXNUM hash_string(STRING* str, FIXNUM len)
 {
        FIXNUM hash = 0;
        CELL i;
-       for(i = 0; i < str->capacity; i++)
+       for(i = 0; i < len; i++)
                hash = 31*hash + string_nth(str,i);
-       str->hashcode = hash;
+       return hash;
+}
+
+void rehash_string(STRING* str)
+{
+       str->hashcode = hash_string(str,str->capacity);
 }
 
 /* untagged */
@@ -33,7 +39,7 @@ STRING* string(FIXNUM capacity, CELL fill)
        for(i = 0; i < capacity; i++)
                cput(SREF(string,i),fill);
 
-       hash_string(string);
+       rehash_string(string);
 
        return string;
 }
@@ -66,7 +72,7 @@ STRING* from_c_string(const BYTE* c_string)
                c_string++;
        }
 
-       hash_string(s);
+       rehash_string(s);
        
        return s;
 }
@@ -158,7 +164,9 @@ void primitive_string_compare(void)
 
 bool string_eq(STRING* s1, STRING* s2)
 {
-       if(s1->hashcode != s2->hashcode)
+       if(s1 == s2)
+               return true;
+       else if(s1->hashcode != s2->hashcode)
                return false;
        else
                return (string_compare(s1,s2) == 0);
@@ -258,7 +266,7 @@ INLINE STRING* substring(CELL start, CELL end, STRING* string)
        memcpy(result + 1,
                (void*)((CELL)(string + 1) + CHARS * start),
                CHARS * (end - start));
-       hash_string(result);
+       rehash_string(result);
 
        return result;
 }
@@ -300,7 +308,7 @@ void primitive_string_reverse(void)
        STRING* s = untag_string(dpeek());
        s = string_clone(s,s->capacity);
        string_reverse(s,s->capacity);
-       hash_string(s);
+       rehash_string(s);
        drepl(tag_object(s));
 }
 
index 7191468b6a87d31942d99594b9357a99328ac555..146655aab433a62e82fb7ea8eaf6f64901cbff5a 100644 (file)
@@ -14,7 +14,8 @@ INLINE STRING* untag_string(CELL tagged)
 
 STRING* allot_string(FIXNUM capacity);
 STRING* string(FIXNUM capacity, CELL fill);
-void hash_string(STRING* str);
+FIXNUM hash_string(STRING* str, FIXNUM len);
+void rehash_string(STRING* str);
 STRING* grow_string(STRING* string, FIXNUM capacity, CHAR fill);
 BYTE* to_c_string(STRING* s);
 void box_c_string(const BYTE* c_string);