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) { ...@@ -187,7 +187,9 @@ TEST(DynamicApi, DynamicGenericObjects) {
MallocMessageBuilder builder; MallocMessageBuilder builder;
auto root = builder.getRoot<DynamicStruct>(Schema::from<test::TestObject>()); 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>()); checkTestMessage(root.asReader().as<test::TestObject>().getObjectField().getAs<TestAllTypes>());
checkDynamicTestMessage( checkDynamicTestMessage(
...@@ -200,11 +202,13 @@ TEST(DynamicApi, DynamicGenericObjects) { ...@@ -200,11 +202,13 @@ TEST(DynamicApi, DynamicGenericObjects) {
root.get("objectField").as<ObjectPointer>().asReader() root.get("objectField").as<ObjectPointer>().asReader()
.getAs<DynamicStruct>(Schema::from<TestAllTypes>())); .getAs<DynamicStruct>(Schema::from<TestAllTypes>()));
checkDynamicTestMessage( 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(0, 123);
list.set(1, 456); list.set(1, 456);
list.set(2, 789); list.set(2, 789);
...@@ -233,7 +237,8 @@ TEST(DynamicApi, DynamicGenericObjects) { ...@@ -233,7 +237,8 @@ TEST(DynamicApi, DynamicGenericObjects) {
.getAs<DynamicList>(Schema::from<List<uint32_t>>()), .getAs<DynamicList>(Schema::from<List<uint32_t>>()),
{123u, 456u, 789u, 123456789u}); {123u, 456u, 789u, 123456789u});
checkList<uint32_t>( 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}); {123u, 456u, 789u, 123456789u});
} }
} }
......
...@@ -589,12 +589,22 @@ DynamicValue::Builder DynamicStruct::Builder::init(StructSchema::Field field) { ...@@ -589,12 +589,22 @@ DynamicValue::Builder DynamicStruct::Builder::init(StructSchema::Field field) {
case schema::Field::SLOT: { case schema::Field::SLOT: {
auto slot = proto.getSlot(); auto slot = proto.getSlot();
auto type = slot.getType(); auto type = slot.getType();
KJ_REQUIRE(type.isStruct(), "init() without a size is only valid for struct fields."); switch (type.which()) {
case schema::Type::STRUCT: {
auto subSchema = schema.getDependency(type.getStruct().getTypeId()).asStruct(); auto subSchema = schema.getDependency(type.getStruct().getTypeId()).asStruct();
return DynamicStruct::Builder(subSchema, return DynamicStruct::Builder(subSchema,
builder.getPointerField(slot.getOffset() * POINTERS) builder.getPointerField(slot.getOffset() * POINTERS)
.initStruct(structSizeFromSchema(subSchema))); .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: { case schema::Field::GROUP: {
clear(field); clear(field);
...@@ -887,92 +897,6 @@ void DynamicStruct::Builder::clear(StructSchema::Field field) { ...@@ -887,92 +897,6 @@ void DynamicStruct::Builder::clear(StructSchema::Field field) {
KJ_UNREACHABLE; 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 { DynamicValue::Reader DynamicStruct::Reader::get(kj::StringPtr name) const {
return get(schema.getFieldByName(name)); return get(schema.getFieldByName(name));
} }
...@@ -1011,33 +935,6 @@ Orphan<DynamicValue> DynamicStruct::Builder::disown(kj::StringPtr name) { ...@@ -1011,33 +935,6 @@ Orphan<DynamicValue> DynamicStruct::Builder::disown(kj::StringPtr name) {
void DynamicStruct::Builder::clear(kj::StringPtr name) { void DynamicStruct::Builder::clear(kj::StringPtr name) {
clear(schema.getFieldByName(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: ...@@ -258,18 +258,6 @@ public:
// Clear a field, setting it to its default value. For pointer fields, this actually makes the // Clear a field, setting it to its default value. For pointer fields, this actually makes the
// field null. // 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); DynamicValue::Builder get(kj::StringPtr name);
bool has(kj::StringPtr name); bool has(kj::StringPtr name);
void set(kj::StringPtr name, const DynamicValue::Reader& value); void set(kj::StringPtr name, const DynamicValue::Reader& value);
...@@ -279,14 +267,6 @@ public: ...@@ -279,14 +267,6 @@ public:
void adopt(kj::StringPtr name, Orphan<DynamicValue>&& orphan); void adopt(kj::StringPtr name, Orphan<DynamicValue>&& orphan);
Orphan<DynamicValue> disown(kj::StringPtr name); Orphan<DynamicValue> disown(kj::StringPtr name);
void clear(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. // Shortcuts to access fields by name. These throw exceptions if no such field exists.
Reader asReader() const; Reader asReader() const;
...@@ -302,8 +282,6 @@ private: ...@@ -302,8 +282,6 @@ private:
void verifySetInUnion(StructSchema::Field field); void verifySetInUnion(StructSchema::Field field);
void setInUnion(StructSchema::Field field); void setInUnion(StructSchema::Field field);
WirePointerCount verifyIsObject(StructSchema::Field field);
template <typename T, Kind k> template <typename T, Kind k>
friend struct _::PointerHelpers; friend struct _::PointerHelpers;
friend struct DynamicList; 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