str/vector-hashcode
parent
babd2b7494
commit
10d070d3ec
|
@ -44,8 +44,6 @@ FFI:
|
|||
- add a socket timeout
|
||||
- fix error postoning -- not all errors thrown by i/o code are
|
||||
postponed
|
||||
- sbuf-hashcode
|
||||
- vector-hashcode
|
||||
- some way to run httpd from command line
|
||||
|
||||
+ bignums:
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 ]
|
||||
|
|
|
@ -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 " ]
|
||||
|
|
|
@ -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 ;
|
||||
|
|
|
@ -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'>" ]
|
||||
[
|
||||
[
|
||||
""
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
|
@ -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
|
||||
|
|
|
@ -72,6 +72,7 @@ USE: unparser
|
|||
"errors"
|
||||
"hashtables"
|
||||
"strings"
|
||||
"sbuf"
|
||||
"namespaces/namespaces"
|
||||
"files"
|
||||
"format"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
extern XT primitives[];
|
||||
#define PRIMITIVE_COUNT 192
|
||||
#define PRIMITIVE_COUNT 193
|
||||
|
||||
CELL primitive_to_xt(CELL primitive);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue