unserialize grammer directly to avoid extra copying

This commit is contained in:
Nathan Braswell
2016-01-02 13:44:31 -05:00
parent 8b77a60be5
commit bb3ccf808b
2 changed files with 19 additions and 7 deletions

View File

@@ -10,7 +10,9 @@ import serialize:*
fun main():int {
var gram.construct(): grammer
/*var gram.construct(): grammer*/
// delay construction until we either load it or copy construct it
var gram: grammer
var file_name = string("../krakenGrammer.kgm")
@@ -28,7 +30,9 @@ fun main():int {
if (cached_contents == file_contents) {
println("loaded_and_valid, using cached version!")
loaded_and_valid = true
unpack(gram, pos) = unserialize<grammer>(binary, pos)
/*unpack(gram, pos) = unserialize<grammer>(binary, pos)*/
// skip unnecessary copies this way
pos = gram.unserialize(binary, pos)
println("finished unserializeing!!")
} else {
println("file contents do not match:")
@@ -43,7 +47,9 @@ fun main():int {
}
if (!loaded_and_valid) {
println("Not loaded_and_valid, re-generating and writing out")
gram = load_grammer(file_contents)
/*gram = load_grammer(file_contents)*/
// since we now don't construct before hand
gram.copy_construct(&load_grammer(file_contents))
println("grammer loaded, calculate_first_set")
gram.calculate_first_set()
println("grammer loaded, calculate_state_automaton")

View File

@@ -10,7 +10,9 @@ import serialize:*
fun main():int {
var a.construct(): grammer
/*var a.construct(): grammer*/
// delay construction until unserialization or copy_construction now
var a: grammer
var file_name = string("../krakenGrammer.kgm")
/*var file_name = string("../simplifiedKrakenGrammer.kgm")*/
@@ -32,7 +34,9 @@ fun main():int {
if (cached_contents == file_contents) {
println("loaded_and_valid, using cached version!")
loaded_and_valid = true
unpack(a, pos) = unserialize<grammer>(binary, pos)
/*unpack(a, pos) = unserialize<grammer>(binary, pos)*/
// avoid extra copies
pos = a.unserialize(binary, pos)
println("finished unserializeing!!")
} else {
println("file contents do not match:")
@@ -47,7 +51,9 @@ fun main():int {
}
if (!loaded_and_valid) {
println("Not loaded_and_valid, re-generating and writing out")
a = load_grammer(file_contents)
/*a = load_grammer(file_contents)*/
// copy construct now
a.copy_construct(&load_grammer(file_contents))
println("grammer loaded, calculate_first_set")
a.calculate_first_set()
println("grammer loaded, calculate_state_automaton")