From 2bfdf7e32fb4fb4b806264b323bac5237ed91705 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sat, 10 Jul 2010 22:19:57 +0200 Subject: New immutable list implementation --- src/Term.vala | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) (limited to 'src/Term.vala') diff --git a/src/Term.vala b/src/Term.vala index 6b08730..698bfc2 100644 --- a/src/Term.vala +++ b/src/Term.vala @@ -75,18 +75,14 @@ namespace Eva { case Erl.TermType.NIL: case Erl.TermType.LIST: - List term = new List(); - assert(Erl.decode_list_header(buffer, ref index, out size) == 0); - if(size != 0) { - for(int i = 0; i < size; ++i) { - term.list.add(do_decode(buffer, ref index)); - } - term.tail = do_decode(buffer, ref index); + if(size == 0) { + return List.empty; + } + else { + return decode_list(buffer, ref index, size); } - - return term; case Erl.TermType.STRING: char[] value = new char[size+1]; @@ -119,6 +115,19 @@ namespace Eva { assert_not_reached(); } } + + private static List decode_list(void *buffer, ref int index, int n) { + Term head = do_decode(buffer, ref index); + Term tail; + + if(n > 1) { + tail = decode_list(buffer, ref index, n-1); + } + else { + tail = do_decode(buffer, ref index); + } + + return new List(head, tail); + } } - } -- cgit v1.2.3