default text fields
This commit is contained in:
parent
b269458232
commit
dc771a07cb
6 changed files with 49 additions and 11 deletions
|
@ -942,6 +942,10 @@ private:
|
||||||
|
|
||||||
} else if (kind == FieldKind::BLOB && typeBody.which() == schema::Type::TEXT ) {
|
} 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");
|
kj::String blobKind = kj::str("Text");
|
||||||
|
|
||||||
return FieldText {
|
return FieldText {
|
||||||
|
@ -955,7 +959,7 @@ private:
|
||||||
spaces(indent), " public ", type, ".Reader",
|
spaces(indent), " public ", type, ".Reader",
|
||||||
" get", titleCase, "() {\n",
|
" get", titleCase, "() {\n",
|
||||||
spaces(indent), " return _reader.getPointerField(",
|
spaces(indent), " return _reader.getPointerField(",
|
||||||
offset, ").get", blobKind, " ();\n", // XXX
|
offset, ").getText(", defaultParams, ");\n",
|
||||||
spaces(indent), " }\n", "\n"),
|
spaces(indent), " }\n", "\n"),
|
||||||
|
|
||||||
kj::strTree(
|
kj::strTree(
|
||||||
|
@ -966,7 +970,7 @@ private:
|
||||||
spaces(indent), " }\n",
|
spaces(indent), " }\n",
|
||||||
spaces(indent), " public final ", type, ".Builder get", titleCase, "() {\n",
|
spaces(indent), " public final ", type, ".Builder get", titleCase, "() {\n",
|
||||||
spaces(indent), " return _builder.getPointerField(",
|
spaces(indent), " return _builder.getPointerField(",
|
||||||
offset, ").get", blobKind, " ();\n", // XXX
|
offset, ").get", blobKind, "(", defaultParams, ");\n",
|
||||||
spaces(indent), " }\n",
|
spaces(indent), " }\n",
|
||||||
spaces(indent), " public final void set", titleCase, "(", type, ".Reader value) {\n",
|
spaces(indent), " public final void set", titleCase, "(", type, ".Reader value) {\n",
|
||||||
unionDiscrim.set,
|
unionDiscrim.set,
|
||||||
|
|
|
@ -237,6 +237,7 @@ object TestUtil {
|
||||||
assert(builder.getUInt64Field() == 0xab54a98ceb1f0ad2L);
|
assert(builder.getUInt64Field() == 0xab54a98ceb1f0ad2L);
|
||||||
assert(builder.getFloat32Field() == 1234.5f);
|
assert(builder.getFloat32Field() == 1234.5f);
|
||||||
assert(builder.getFloat64Field() == -123e45);
|
assert(builder.getFloat64Field() == -123e45);
|
||||||
|
(builder.getTextField().toString()) should equal ("foo");
|
||||||
}
|
}
|
||||||
|
|
||||||
def checkDefaultMessage(reader : TestDefaults.Reader) {
|
def checkDefaultMessage(reader : TestDefaults.Reader) {
|
||||||
|
@ -252,6 +253,7 @@ object TestUtil {
|
||||||
assert(reader.getUInt64Field() == 0xab54a98ceb1f0ad2L);
|
assert(reader.getUInt64Field() == 0xab54a98ceb1f0ad2L);
|
||||||
assert(reader.getFloat32Field() == 1234.5f);
|
assert(reader.getFloat32Field() == 1234.5f);
|
||||||
assert(reader.getFloat64Field() == -123e45);
|
assert(reader.getFloat64Field() == -123e45);
|
||||||
|
(reader.getTextField().toString()) should equal ("foo");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -66,6 +66,7 @@ struct TestDefaults {
|
||||||
uInt64Field @9 : UInt64 = 12345678901234567890;
|
uInt64Field @9 : UInt64 = 12345678901234567890;
|
||||||
float32Field @10 : Float32 = 1234.5;
|
float32Field @10 : Float32 = 1234.5;
|
||||||
float64Field @11 : Float64 = -123e45;
|
float64Field @11 : Float64 = -123e45;
|
||||||
|
textField @12 : Text = "foo";
|
||||||
}
|
}
|
||||||
|
|
||||||
struct TestAnyPointer {
|
struct TestAnyPointer {
|
||||||
|
|
|
@ -31,7 +31,15 @@ public final class PointerBuilder {
|
||||||
|
|
||||||
public final Text.Builder getText() {
|
public final Text.Builder getText() {
|
||||||
return WireHelpers.getWritableTextPointer(
|
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() {
|
public final Data.Builder getData() {
|
||||||
|
|
|
@ -53,8 +53,11 @@ public final class PointerReader {
|
||||||
}
|
}
|
||||||
|
|
||||||
public Text.Reader getText() {
|
public Text.Reader getText() {
|
||||||
return WireHelpers.readTextPointer(this.segment,
|
return WireHelpers.readTextPointer(this.segment, this.pointer, null, 0, 0);
|
||||||
this.pointer);
|
}
|
||||||
|
|
||||||
|
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() {
|
public Data.Reader getData() {
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
package org.capnproto;
|
package org.capnproto;
|
||||||
|
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
|
||||||
final class WireHelpers {
|
final class WireHelpers {
|
||||||
|
|
||||||
public static int roundBytesUpToWords(int bytes) {
|
public static int roundBytesUpToWords(int bytes) {
|
||||||
|
@ -310,12 +312,23 @@ final class WireHelpers {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Text.Builder getWritableTextPointer(int refOffset,
|
public static Text.Builder getWritableTextPointer(int refOffset,
|
||||||
SegmentBuilder segment) {
|
SegmentBuilder segment,
|
||||||
|
ByteBuffer defaultBuffer,
|
||||||
|
int defaultOffset,
|
||||||
|
int defaultSize) {
|
||||||
long ref = WirePointer.get(segment.buffer, refOffset);
|
long ref = WirePointer.get(segment.buffer, refOffset);
|
||||||
|
|
||||||
if (WirePointer.isNull(ref)) {
|
if (WirePointer.isNull(ref)) {
|
||||||
// TODO default values
|
if (defaultBuffer == null) {
|
||||||
return new Text.Builder(null, 0, 0);
|
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);
|
int refTarget = WirePointer.target(refOffset, ref);
|
||||||
|
@ -454,12 +467,19 @@ final class WireHelpers {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Text.Reader readTextPointer(SegmentReader segment,
|
public static Text.Reader readTextPointer(SegmentReader segment,
|
||||||
int refOffset) {
|
int refOffset,
|
||||||
|
ByteBuffer defaultBuffer,
|
||||||
|
int defaultOffset,
|
||||||
|
int defaultSize) {
|
||||||
long ref = WirePointer.get(segment.buffer, refOffset);
|
long ref = WirePointer.get(segment.buffer, refOffset);
|
||||||
|
|
||||||
if (WirePointer.isNull(ref)) {
|
if (WirePointer.isNull(ref)) {
|
||||||
// XXX should use the default value
|
if (defaultBuffer == null) {
|
||||||
return new Text.Reader(java.nio.ByteBuffer.wrap(new byte[0]), 0, 0);
|
// 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);
|
int refTarget = WirePointer.target(refOffset, ref);
|
||||||
|
|
Loading…
Reference in a new issue