default text fields

This commit is contained in:
David Renshaw 2014-10-03 12:01:09 -04:00
parent b269458232
commit dc771a07cb
6 changed files with 49 additions and 11 deletions

View file

@ -942,6 +942,10 @@ private:
} else if (kind == FieldKind::BLOB && typeBody.which() == schema::Type::TEXT ) {
uint64_t typeId = field.getContainingStruct().getProto().getId();
kj::String defaultParams = defaultOffset == 0 ? kj::str() : kj::str(
"Schemas.b_", kj::hex(typeId), ", ", defaultOffset * 8, ", ", defaultSize);
kj::String blobKind = kj::str("Text");
return FieldText {
@ -955,7 +959,7 @@ private:
spaces(indent), " public ", type, ".Reader",
" get", titleCase, "() {\n",
spaces(indent), " return _reader.getPointerField(",
offset, ").get", blobKind, " ();\n", // XXX
offset, ").getText(", defaultParams, ");\n",
spaces(indent), " }\n", "\n"),
kj::strTree(
@ -966,7 +970,7 @@ private:
spaces(indent), " }\n",
spaces(indent), " public final ", type, ".Builder get", titleCase, "() {\n",
spaces(indent), " return _builder.getPointerField(",
offset, ").get", blobKind, " ();\n", // XXX
offset, ").get", blobKind, "(", defaultParams, ");\n",
spaces(indent), " }\n",
spaces(indent), " public final void set", titleCase, "(", type, ".Reader value) {\n",
unionDiscrim.set,

View file

@ -237,6 +237,7 @@ object TestUtil {
assert(builder.getUInt64Field() == 0xab54a98ceb1f0ad2L);
assert(builder.getFloat32Field() == 1234.5f);
assert(builder.getFloat64Field() == -123e45);
(builder.getTextField().toString()) should equal ("foo");
}
def checkDefaultMessage(reader : TestDefaults.Reader) {
@ -252,6 +253,7 @@ object TestUtil {
assert(reader.getUInt64Field() == 0xab54a98ceb1f0ad2L);
assert(reader.getFloat32Field() == 1234.5f);
assert(reader.getFloat64Field() == -123e45);
(reader.getTextField().toString()) should equal ("foo");
}

View file

@ -66,6 +66,7 @@ struct TestDefaults {
uInt64Field @9 : UInt64 = 12345678901234567890;
float32Field @10 : Float32 = 1234.5;
float64Field @11 : Float64 = -123e45;
textField @12 : Text = "foo";
}
struct TestAnyPointer {

View file

@ -31,7 +31,15 @@ public final class PointerBuilder {
public final Text.Builder getText() {
return WireHelpers.getWritableTextPointer(
this.pointer, this.segment);
this.pointer, this.segment, null, 0, 0);
}
public Text.Builder getText(java.nio.ByteBuffer defaultBuffer, int defaultOffset, int defaultSize) {
return WireHelpers.getWritableTextPointer(this.pointer,
this.segment,
defaultBuffer,
defaultOffset,
defaultSize);
}
public final Data.Builder getData() {

View file

@ -53,8 +53,11 @@ public final class PointerReader {
}
public Text.Reader getText() {
return WireHelpers.readTextPointer(this.segment,
this.pointer);
return WireHelpers.readTextPointer(this.segment, this.pointer, null, 0, 0);
}
public Text.Reader getText(java.nio.ByteBuffer defaultBuffer, int defaultOffset, int defaultSize) {
return WireHelpers.readTextPointer(this.segment, this.pointer, defaultBuffer, defaultOffset, defaultSize);
}
public Data.Reader getData() {

View file

@ -1,5 +1,7 @@
package org.capnproto;
import java.nio.ByteBuffer;
final class WireHelpers {
public static int roundBytesUpToWords(int bytes) {
@ -310,12 +312,23 @@ final class WireHelpers {
}
public static Text.Builder getWritableTextPointer(int refOffset,
SegmentBuilder segment) {
SegmentBuilder segment,
ByteBuffer defaultBuffer,
int defaultOffset,
int defaultSize) {
long ref = WirePointer.get(segment.buffer, refOffset);
if (WirePointer.isNull(ref)) {
// TODO default values
return new Text.Builder(null, 0, 0);
if (defaultBuffer == null) {
return new Text.Builder(null, 0, 0);
} else {
Text.Builder builder = initTextPointer(refOffset, segment, defaultSize);
// TODO is there a way to do this with bulk methods?
for (int i = 0; i < builder.size; ++i) {
builder.buffer.put(builder.offset + i, defaultBuffer.get(defaultOffset + i));
}
return builder;
}
}
int refTarget = WirePointer.target(refOffset, ref);
@ -454,12 +467,19 @@ final class WireHelpers {
}
public static Text.Reader readTextPointer(SegmentReader segment,
int refOffset) {
int refOffset,
ByteBuffer defaultBuffer,
int defaultOffset,
int defaultSize) {
long ref = WirePointer.get(segment.buffer, refOffset);
if (WirePointer.isNull(ref)) {
// XXX should use the default value
return new Text.Reader(java.nio.ByteBuffer.wrap(new byte[0]), 0, 0);
if (defaultBuffer == null) {
// XXX -- what about null terminator?
return new Text.Reader(ByteBuffer.wrap(new byte[0]), 0, 0);
} else {
return new Text.Reader(defaultBuffer, defaultOffset, defaultSize);
}
}
int refTarget = WirePointer.target(refOffset, ref);