You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by ma...@apache.org on 2009/12/04 17:26:32 UTC

svn commit: r887255 - in /lucene/lucy/trunk: core/Lucy/Object/VArray.bp core/Lucy/Object/VArray.c core/Lucy/Test/Object/TestVArray.c perl/lib/Lucy.pm perl/lib/Lucy/Object/VArray.pm perl/t/binding/016-varray.t

Author: marvin
Date: Fri Dec  4 16:26:31 2009
New Revision: 887255

URL: http://svn.apache.org/viewvc?rev=887255&view=rev
Log:
Commit varray_serialization.diff from LUCY-81.

Modified:
    lucene/lucy/trunk/core/Lucy/Object/VArray.bp
    lucene/lucy/trunk/core/Lucy/Object/VArray.c
    lucene/lucy/trunk/core/Lucy/Test/Object/TestVArray.c
    lucene/lucy/trunk/perl/lib/Lucy.pm
    lucene/lucy/trunk/perl/lib/Lucy/Object/VArray.pm
    lucene/lucy/trunk/perl/t/binding/016-varray.t

Modified: lucene/lucy/trunk/core/Lucy/Object/VArray.bp
URL: http://svn.apache.org/viewvc/lucene/lucy/trunk/core/Lucy/Object/VArray.bp?rev=887255&r1=887254&r2=887255&view=diff
==============================================================================
--- lucene/lucy/trunk/core/Lucy/Object/VArray.bp (original)
+++ lucene/lucy/trunk/core/Lucy/Object/VArray.bp Fri Dec  4 16:26:31 2009
@@ -146,6 +146,12 @@
     Load(VArray *self, Obj *dump);
 
     public void
+    Serialize(VArray *self, OutStream *outstream);
+
+    public incremented VArray*
+    Deserialize(VArray *self, InStream *instream);
+
+    public void
     Destroy(VArray *self);
 }
 

Modified: lucene/lucy/trunk/core/Lucy/Object/VArray.c
URL: http://svn.apache.org/viewvc/lucene/lucy/trunk/core/Lucy/Object/VArray.c?rev=887255&r1=887254&r2=887255&view=diff
==============================================================================
--- lucene/lucy/trunk/core/Lucy/Object/VArray.c (original)
+++ lucene/lucy/trunk/core/Lucy/Object/VArray.c Fri Dec  4 16:26:31 2009
@@ -9,7 +9,10 @@
 #include "Lucy/Object/VArray.h"
 #include "Lucy/Object/Err.h"
 #include "Lucy/Util/Memory.h"
+#include "Lucy/Util/Freezer.h"
 #include "Lucy/Util/SortUtils.h"
+#include "Lucy/Store/InStream.h"
+#include "Lucy/Store/OutStream.h"
 
 #define MAYBE_GROW(_self, _new_size) \
     do { \
@@ -85,6 +88,46 @@
     return loaded;
 }
 
+void
+VA_serialize(VArray *self, OutStream *outstream)
+{
+    u32_t i;
+    u32_t last_valid_tick = 0;
+    OutStream_Write_C32(outstream, self->size);
+    for (i = 0; i < self->size; i++) {
+        Obj *elem = self->elems[i];
+        if (elem) {
+            OutStream_Write_C32(outstream, i - last_valid_tick);
+            FREEZE(elem, outstream);
+            last_valid_tick = i;
+        }
+    }
+    /* Terminate. */
+    OutStream_Write_C32(outstream, self->size - last_valid_tick);
+}
+
+VArray*
+VA_deserialize(VArray *self, InStream *instream)
+{
+    u32_t tick;
+    u32_t size = InStream_Read_C32(instream);
+    if (self) {
+        self->size = size;
+        self->cap = size + 1;
+        self->elems = (Obj**)CALLOCATE(self->cap, sizeof(Obj*));
+    }
+    else self = VA_new(size);
+    for (tick = InStream_Read_C32(instream); 
+         tick < size; 
+         tick += InStream_Read_C32(instream)
+    ) {
+        Obj *obj = THAW(instream);
+        self->elems[tick] = obj;
+    }
+    self->size = size;
+    return self;
+}
+
 VArray*
 VA_clone(VArray *self)
 {

Modified: lucene/lucy/trunk/core/Lucy/Test/Object/TestVArray.c
URL: http://svn.apache.org/viewvc/lucene/lucy/trunk/core/Lucy/Test/Object/TestVArray.c?rev=887255&r1=887254&r2=887255&view=diff
==============================================================================
--- lucene/lucy/trunk/core/Lucy/Test/Object/TestVArray.c (original)
+++ lucene/lucy/trunk/core/Lucy/Test/Object/TestVArray.c Fri Dec  4 16:26:31 2009
@@ -2,6 +2,7 @@
 #include "Lucy/Util/ToolSet.h"
 
 #include "Lucy/Test.h"
+#include "Lucy/Test/TestUtils.h"
 #include "Lucy/Test/Object/TestVArray.h"
 
 static CharBuf*
@@ -247,10 +248,24 @@
     DECREF(loaded);
 }
 
+static void
+test_serialization(TestBatch *batch)
+{
+    VArray *array  = VA_new(0);
+    VArray *dupe;
+    VA_Store(array, 1, (Obj*)CB_newf("foo"));
+    VA_Store(array, 3, (Obj*)CB_newf("bar"));
+    dupe = (VArray*)TestUtils_freeze_thaw((Obj*)array);
+    ASSERT_TRUE(batch, dupe && VA_Equals(array, (Obj*)dupe), 
+        "Round trip through FREEZE/THAW");
+    DECREF(dupe);
+    DECREF(array);
+}
+
 void
 TestVArray_run_tests()
 {
-    TestBatch *batch = Test_new_batch("TestVArray", 38, NULL);
+    TestBatch *batch = Test_new_batch("TestVArray", 39, NULL);
 
     PLAN(batch);
 
@@ -263,6 +278,7 @@
     test_Push_VArray(batch);
     test_Clone_and_Shallow_Copy(batch);
     test_Dump_and_Load(batch);
+    test_serialization(batch);
 
     batch->destroy(batch);
 }

Modified: lucene/lucy/trunk/perl/lib/Lucy.pm
URL: http://svn.apache.org/viewvc/lucene/lucy/trunk/perl/lib/Lucy.pm?rev=887255&r1=887254&r2=887255&view=diff
==============================================================================
--- lucene/lucy/trunk/perl/lib/Lucy.pm (original)
+++ lucene/lucy/trunk/perl/lib/Lucy.pm Fri Dec  4 16:26:31 2009
@@ -124,6 +124,7 @@
     package Lucy::Object::VArray;
     no warnings 'redefine';
     sub clone { CORE::shift->_clone }
+    sub deserialize { CORE::shift->_deserialize(@_) }
 }
 
 {

Modified: lucene/lucy/trunk/perl/lib/Lucy/Object/VArray.pm
URL: http://svn.apache.org/viewvc/lucene/lucy/trunk/perl/lib/Lucy/Object/VArray.pm?rev=887255&r1=887254&r2=887255&view=diff
==============================================================================
--- lucene/lucy/trunk/perl/lib/Lucy/Object/VArray.pm (original)
+++ lucene/lucy/trunk/perl/lib/Lucy/Object/VArray.pm Fri Dec  4 16:26:31 2009
@@ -17,6 +17,15 @@
 OUTPUT: RETVAL
 
 SV*
+_deserialize(either_sv, instream)
+    SV *either_sv;
+    lucy_InStream *instream;
+CODE:
+    CHY_UNUSED_VAR(either_sv);
+    RETVAL = LUCY_OBJ_TO_SV_NOINC(lucy_VA_deserialize(NULL, instream));
+OUTPUT: RETVAL
+
+SV*
 _clone(self)
     lucy_VArray *self;
 CODE:

Modified: lucene/lucy/trunk/perl/t/binding/016-varray.t
URL: http://svn.apache.org/viewvc/lucene/lucy/trunk/perl/t/binding/016-varray.t?rev=887255&r1=887254&r2=887255&view=diff
==============================================================================
--- lucene/lucy/trunk/perl/t/binding/016-varray.t (original)
+++ lucene/lucy/trunk/perl/t/binding/016-varray.t Fri Dec  4 16:26:31 2009
@@ -1,7 +1,8 @@
 use strict;
 use warnings;
 
-use Test::More tests => 1;
+use Test::More tests => 3;
+use Storable qw( nfreeze thaw );
 use Lucy::Test;
 
 my ( $varray, $evil_twin );
@@ -9,6 +10,20 @@
 $varray = Lucy::Object::VArray->new( capacity => 5 );
 $varray->push( Lucy::Object::CharBuf->new($_) ) for 1 .. 5;
 $varray->delete(3);
+my $frozen = nfreeze($varray);
+my $thawed = thaw($frozen);
+is_deeply( $thawed->to_perl, $varray->to_perl, "freeze/thaw" );
+
+my $ram_file = Lucy::Store::RAMFile->new;
+my $outstream = Lucy::Store::OutStream->open( file => $ram_file )
+    or die Lucy->error;
+$varray->serialize($outstream);
+$outstream->close;
+my $instream = Lucy::Store::InStream->open( file => $ram_file )
+    or die Lucy->error;
+my $deserialized = $varray->deserialize($instream);
+is_deeply( $varray->to_perl, $deserialized->to_perl,
+    "serialize/deserialize" );
 
 $evil_twin = $varray->_clone;
 is_deeply( $evil_twin->to_perl, $varray->to_perl, "clone" );