Commit c44c9276 authored by Kenton Varda's avatar Kenton Varda

Get rid of no-longer-needed object-specific methods of DynamicStruct. Use…

Get rid of no-longer-needed object-specific methods of DynamicStruct.  Use get().as<ObjectPointer>() instead.
parent d99c0b4c
......@@ -187,7 +187,9 @@ TEST(DynamicApi, DynamicGenericObjects) {
MallocMessageBuilder builder;
auto root = builder.getRoot<DynamicStruct>(Schema::from<test::TestObject>());
initDynamicTestMessage(root.initObject("objectField", Schema::from<TestAllTypes>()));
initDynamicTestMessage(
root.get("objectField").as<ObjectPointer>()
.initAs<DynamicStruct>(Schema::from<TestAllTypes>()));
checkTestMessage(root.asReader().as<test::TestObject>().getObjectField().getAs<TestAllTypes>());
checkDynamicTestMessage(
......@@ -200,11 +202,13 @@ TEST(DynamicApi, DynamicGenericObjects) {
root.get("objectField").as<ObjectPointer>().asReader()
.getAs<DynamicStruct>(Schema::from<TestAllTypes>()));
checkDynamicTestMessage(
root.getObject("objectField", Schema::from<TestAllTypes>()));
root.get("objectField").as<ObjectPointer>()
.getAs<DynamicStruct>(Schema::from<TestAllTypes>()));
{
{
auto list = root.initObject("objectField", Schema::from<List<uint32_t>>(), 4);
auto list = root.init("objectField").as<ObjectPointer>()
.initAs<DynamicList>(Schema::from<List<uint32_t>>(), 4);
list.set(0, 123);
list.set(1, 456);
list.set(2, 789);
......@@ -233,7 +237,8 @@ TEST(DynamicApi, DynamicGenericObjects) {
.getAs<DynamicList>(Schema::from<List<uint32_t>>()),
{123u, 456u, 789u, 123456789u});
checkList<uint32_t>(
root.getObject("objectField", Schema::from<List<uint32_t>>()),
root.get("objectField").as<ObjectPointer>()
.getAs<DynamicList>(Schema::from<List<uint32_t>>()),
{123u, 456u, 789u, 123456789u});
}
}
......
......@@ -589,11 +589,21 @@ DynamicValue::Builder DynamicStruct::Builder::init(StructSchema::Field field) {
case schema::Field::SLOT: {
auto slot = proto.getSlot();
auto type = slot.getType();
KJ_REQUIRE(type.isStruct(), "init() without a size is only valid for struct fields.");
auto subSchema = schema.getDependency(type.getStruct().getTypeId()).asStruct();
return DynamicStruct::Builder(subSchema,
builder.getPointerField(slot.getOffset() * POINTERS)
.initStruct(structSizeFromSchema(subSchema)));
switch (type.which()) {
case schema::Type::STRUCT: {
auto subSchema = schema.getDependency(type.getStruct().getTypeId()).asStruct();
return DynamicStruct::Builder(subSchema,
builder.getPointerField(slot.getOffset() * POINTERS)
.initStruct(structSizeFromSchema(subSchema)));
}
case schema::Type::OBJECT: {
auto pointer = builder.getPointerField(slot.getOffset() * POINTERS);
pointer.clear();
return ObjectPointer::Builder(pointer);
}
default:
KJ_FAIL_REQUIRE("init() without a size is only valid for struct and object fields.");
}
}
case schema::Field::GROUP: {
......@@ -887,92 +897,6 @@ void DynamicStruct::Builder::clear(StructSchema::Field field) {
KJ_UNREACHABLE;
}
WirePointerCount DynamicStruct::Builder::verifyIsObject(StructSchema::Field field) {
KJ_REQUIRE(field.getContainingStruct() == schema, "`field` is not a field of this struct.");
auto proto = field.getProto();
switch (proto.which()) {
case schema::Field::SLOT: {
auto slot = proto.getSlot();
KJ_REQUIRE(slot.getType().isObject(), "Expected an Object.");
return slot.getOffset() * POINTERS;
}
case schema::Field::GROUP:
KJ_FAIL_REQUIRE("Expected an Object.");
}
KJ_UNREACHABLE;
}
DynamicStruct::Builder DynamicStruct::Builder::getObject(
StructSchema::Field field, StructSchema type) {
auto offset = verifyIsObject(field);
verifySetInUnion(field);
return DynamicStruct::Builder(type,
builder.getPointerField(offset)
.getStruct(structSizeFromSchema(type), nullptr));
}
DynamicList::Builder DynamicStruct::Builder::getObject(
StructSchema::Field field, ListSchema type) {
auto offset = verifyIsObject(field);
verifySetInUnion(field);
if (type.whichElementType() == schema::Type::STRUCT) {
return DynamicList::Builder(type,
builder.getPointerField(offset)
.getStructList(structSizeFromSchema(type.getStructElementType()), nullptr));
} else {
return DynamicList::Builder(type,
builder.getPointerField(offset)
.getList(elementSizeFor(type.whichElementType()), nullptr));
}
}
Text::Builder DynamicStruct::Builder::getObjectAsText(StructSchema::Field field) {
auto offset = verifyIsObject(field);
verifySetInUnion(field);
return builder.getPointerField(offset).getBlob<Text>(nullptr, 0 * BYTES);
}
Data::Builder DynamicStruct::Builder::getObjectAsData(StructSchema::Field field) {
auto offset = verifyIsObject(field);
verifySetInUnion(field);
return builder.getPointerField(offset).getBlob<Data>(nullptr, 0 * BYTES);
}
DynamicStruct::Builder DynamicStruct::Builder::initObject(
StructSchema::Field field, StructSchema type) {
auto offset = verifyIsObject(field);
setInUnion(field);
return DynamicStruct::Builder(type,
builder.getPointerField(offset).initStruct(structSizeFromSchema(type)));
}
DynamicList::Builder DynamicStruct::Builder::initObject(
StructSchema::Field field, ListSchema type, uint size) {
auto offset = verifyIsObject(field);
setInUnion(field);
if (type.whichElementType() == schema::Type::STRUCT) {
return DynamicList::Builder(type,
builder.getPointerField(offset)
.initStructList(size * ELEMENTS, structSizeFromSchema(type.getStructElementType())));
} else {
return DynamicList::Builder(type,
builder.getPointerField(offset)
.initList(elementSizeFor(type.whichElementType()), size * ELEMENTS));
}
}
Text::Builder DynamicStruct::Builder::initObjectAsText(StructSchema::Field field, uint size) {
auto offset = verifyIsObject(field);
setInUnion(field);
return builder.getPointerField(offset).initBlob<Text>(size * BYTES);
}
Data::Builder DynamicStruct::Builder::initObjectAsData(StructSchema::Field field, uint size) {
auto offset = verifyIsObject(field);
setInUnion(field);
return builder.getPointerField(offset).initBlob<Data>(size * BYTES);
}
DynamicValue::Reader DynamicStruct::Reader::get(kj::StringPtr name) const {
return get(schema.getFieldByName(name));
}
......@@ -1011,33 +935,6 @@ Orphan<DynamicValue> DynamicStruct::Builder::disown(kj::StringPtr name) {
void DynamicStruct::Builder::clear(kj::StringPtr name) {
clear(schema.getFieldByName(name));
}
DynamicStruct::Builder DynamicStruct::Builder::getObject(
kj::StringPtr name, StructSchema type) {
return getObject(schema.getFieldByName(name), type);
}
DynamicList::Builder DynamicStruct::Builder::getObject(kj::StringPtr name, ListSchema type) {
return getObject(schema.getFieldByName(name), type);
}
Text::Builder DynamicStruct::Builder::getObjectAsText(kj::StringPtr name) {
return getObjectAsText(schema.getFieldByName(name));
}
Data::Builder DynamicStruct::Builder::getObjectAsData(kj::StringPtr name) {
return getObjectAsData(schema.getFieldByName(name));
}
DynamicStruct::Builder DynamicStruct::Builder::initObject(
kj::StringPtr name, StructSchema type) {
return initObject(schema.getFieldByName(name), type);
}
DynamicList::Builder DynamicStruct::Builder::initObject(
kj::StringPtr name, ListSchema type, uint size) {
return initObject(schema.getFieldByName(name), type, size);
}
Text::Builder DynamicStruct::Builder::initObjectAsText(kj::StringPtr name, uint size) {
return initObjectAsText(schema.getFieldByName(name), size);
}
Data::Builder DynamicStruct::Builder::initObjectAsData(kj::StringPtr name, uint size) {
return initObjectAsData(schema.getFieldByName(name), size);
}
// =======================================================================================
......
......@@ -258,18 +258,6 @@ public:
// Clear a field, setting it to its default value. For pointer fields, this actually makes the
// field null.
DynamicStruct::Builder getObject(StructSchema::Field field, StructSchema type);
DynamicList::Builder getObject(StructSchema::Field field, ListSchema type);
Text::Builder getObjectAsText(StructSchema::Field field);
Data::Builder getObjectAsData(StructSchema::Field field);
// Get an object field. You must specify the type.
DynamicStruct::Builder initObject(StructSchema::Field field, StructSchema type);
DynamicList::Builder initObject(StructSchema::Field field, ListSchema type, uint size);
Text::Builder initObjectAsText(StructSchema::Field field, uint size);
Data::Builder initObjectAsData(StructSchema::Field field, uint size);
// Init an object field. You must specify the type.
DynamicValue::Builder get(kj::StringPtr name);
bool has(kj::StringPtr name);
void set(kj::StringPtr name, const DynamicValue::Reader& value);
......@@ -279,14 +267,6 @@ public:
void adopt(kj::StringPtr name, Orphan<DynamicValue>&& orphan);
Orphan<DynamicValue> disown(kj::StringPtr name);
void clear(kj::StringPtr name);
DynamicStruct::Builder getObject(kj::StringPtr name, StructSchema type);
DynamicList::Builder getObject(kj::StringPtr name, ListSchema type);
Text::Builder getObjectAsText(kj::StringPtr name);
Data::Builder getObjectAsData(kj::StringPtr name);
DynamicStruct::Builder initObject(kj::StringPtr name, StructSchema type);
DynamicList::Builder initObject(kj::StringPtr name, ListSchema type, uint size);
Text::Builder initObjectAsText(kj::StringPtr name, uint size);
Data::Builder initObjectAsData(kj::StringPtr name, uint size);
// Shortcuts to access fields by name. These throw exceptions if no such field exists.
Reader asReader() const;
......@@ -302,8 +282,6 @@ private:
void verifySetInUnion(StructSchema::Field field);
void setInUnion(StructSchema::Field field);
WirePointerCount verifyIsObject(StructSchema::Field field);
template <typename T, Kind k>
friend struct _::PointerHelpers;
friend struct DynamicList;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment