move hashmap to its own module for now

pull/3182/head
Alexander Medvednikov 2019-12-22 00:38:43 +03:00
parent 4fc8842edb
commit 2b9392c46c
4 changed files with 41 additions and 39 deletions

View File

@ -36,7 +36,7 @@ TCCREPO := https://github.com/vlang/tccbin_win
VCFILE := v_win.c
endif
all: latest_vc latest_tcc
all: latest_vc
ifdef WIN32
$(CC) -std=c99 -w -o v0.exe $(TMPVC)/$(VCFILE) $(LDFLAGS)
./v0.exe -o v.exe v.v
@ -70,19 +70,19 @@ fresh_vc:
rm -rf $(TMPVC)
$(GITFASTCLONE) $(VCREPO) $(TMPVC)
latest_tcc: $(TMPTCC)/.git/config
ifndef ANDROID
cd $(TMPTCC) && $(GITCLEANPULL)
endif
#latest_tcc: $(TMPTCC)/.git/config
#ifndef ANDROID
#cd $(TMPTCC) && $(GITCLEANPULL)
#endif
fresh_tcc:
ifndef ANDROID
rm -rf $(TMPTCC)
$(GITFASTCLONE) $(TCCREPO) $(TMPTCC)
endif
#fresh_tcc:
#ifndef ANDROID
#rm -rf $(TMPTCC)
#$(GITFASTCLONE) $(TCCREPO) $(TMPTCC)
#endif
$(TMPTCC)/.git/config:
$(MAKE) fresh_tcc
#$(TMPTCC)/.git/config:
#$(MAKE) fresh_tcc
$(TMPVC)/.git/config:
$(MAKE) fresh_vc

View File

@ -1,10 +1,10 @@
// Copyright (c) 2019 Alexander Medvednikov. All rights reserved.
// Use of this source code is governed by an MIT license
// that can be found in the LICENSE file.
module builtin
module hashmap
/*
This is work in progress.
A very early test version of the hashmap with a fixed size.
A very early test version of the Hashmap with a fixed size.
Only works with string keys and int values for now.
I added this to improve performance of the V compiler,
@ -13,19 +13,20 @@ module builtin
*/
struct hashmap {
struct Hashmap {
cap int
keys []string
table []hashmapentry
table []Hashmapentry
elm_size int
pub:
pub mut:
nr_collisions int
}
struct hashmapentry {
struct Hashmapentry {
mut:
key string
val int
next &hashmapentry // linked list for collisions
next &Hashmapentry // linked list for collisions
}
const (
@ -35,7 +36,7 @@ const (
const(
fnv64_prime = 1099511628211
fnv64_offset_basis = 14695981039346656037
fnv64_offset_basis = u64(14695981039346656037)
)
const(
@ -43,7 +44,7 @@ const(
fnv32_prime = u32(16777619)
)
pub fn new_hashmap(planned_nr_items int) hashmap {
pub fn new_hashmap(planned_nr_items int) Hashmap {
mut cap := planned_nr_items * 5
if cap < min_cap {
cap = min_cap
@ -51,14 +52,14 @@ pub fn new_hashmap(planned_nr_items int) hashmap {
if cap > max_cap {
cap = max_cap
}
return hashmap{
return Hashmap{
cap: cap
elm_size: 4
table: make(cap, cap, sizeof(hashmapentry))
table: make(cap, cap, sizeof(Hashmapentry))
}
}
pub fn (m mut hashmap) set(key string, val int) {
pub fn (m mut Hashmap) set(key string, val int) {
// mut hash := int(b_fabs(key.hash()))
// idx := hash % m.cap
idx := int(fnv1a32(key) % m.cap)
@ -70,16 +71,16 @@ pub fn (m mut hashmap) set(key string, val int) {
for e.next != 0 {
e = e.next
}
e.next = &hashmapentry{
e.next = &Hashmapentry{
key,val,0}
}
else {
m.table[idx] = hashmapentry{
m.table[idx] = Hashmapentry{
key,val,0}
}
}
pub fn (m mut hashmap) get(key string) int {
pub fn (m &Hashmap) get(key string) int {
// mut hash := int(b_fabs(key.hash()))
// idx := hash % m.cap
idx := int(fnv1a32(key) % m.cap)

View File

@ -1,3 +1,5 @@
module hashmap
import rand
fn test_random_strings() {

View File

@ -1145,7 +1145,6 @@ pub fn vfmt(args []string) {
println('v fmt can only be used on .v files')
exit(1)
}
println('WIP')
vexe := vexe_path()
// launch_tool('vfmt', '-d vfmt')
vroot := os.dir(vexe)