Commit 16cb6cf9 authored by Kenton Varda's avatar Kenton Varda

Delete default construcrtor on builders, so that people don't incorrectly try to…

Delete default construcrtor on builders, so that people don't incorrectly try to just declare a Builder on the stack and then start setting its fields.  Instead, a Builder can be explicitly assigned to nullptr, which makes it clearer that it isn't safe to use.
parent c339019b
......@@ -1069,7 +1069,9 @@ private:
"public:\n"
" typedef ", unqualifiedParentType, " Builds;\n"
"\n"
" Builder() = default;\n"
" Builder() = delete; // Deleted to discourage incorrect usage.\n"
" // You can explicitly initialize to nullptr instead.\n"
" inline Builder(decltype(nullptr)) {}\n"
" inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {}\n"
" inline operator Reader() const { return Reader(_builder.asReader()); }\n"
" inline Reader asReader() const { return *this; }\n"
......
This diff is collapsed.
......@@ -159,7 +159,9 @@ class Token::Builder {
public:
typedef Token Builds;
Builder() = default;
Builder() = delete; // Deleted to discourage incorrect usage.
// You can explicitly initialize to nullptr instead.
inline Builder(decltype(nullptr)) {}
inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {}
inline operator Reader() const { return Reader(_builder.asReader()); }
inline Reader asReader() const { return *this; }
......@@ -292,7 +294,9 @@ class Statement::Builder {
public:
typedef Statement Builds;
Builder() = default;
Builder() = delete; // Deleted to discourage incorrect usage.
// You can explicitly initialize to nullptr instead.
inline Builder(decltype(nullptr)) {}
inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {}
inline operator Reader() const { return Reader(_builder.asReader()); }
inline Reader asReader() const { return *this; }
......@@ -382,7 +386,9 @@ class LexedTokens::Builder {
public:
typedef LexedTokens Builds;
Builder() = default;
Builder() = delete; // Deleted to discourage incorrect usage.
// You can explicitly initialize to nullptr instead.
inline Builder(decltype(nullptr)) {}
inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {}
inline operator Reader() const { return Reader(_builder.asReader()); }
inline Reader asReader() const { return *this; }
......@@ -443,7 +449,9 @@ class LexedStatements::Builder {
public:
typedef LexedStatements Builds;
Builder() = default;
Builder() = delete; // Deleted to discourage incorrect usage.
// You can explicitly initialize to nullptr instead.
inline Builder(decltype(nullptr)) {}
inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {}
inline operator Reader() const { return Reader(_builder.asReader()); }
inline Reader asReader() const { return *this; }
......
......@@ -1031,7 +1031,7 @@ private:
StructLayout::StructOrGroup& fieldScope,
bool isInUnion)
: parent(&parent), codeOrder(codeOrder), isInUnion(isInUnion),
decl(decl), fieldScope(&fieldScope) {}
decl(decl), node(nullptr), fieldScope(&fieldScope) {}
inline MemberInfo(MemberInfo& parent, uint codeOrder,
const Declaration::Reader& decl,
schema::Node::Builder node,
......
......@@ -1608,9 +1608,7 @@ ReaderFor<typeName> DynamicValue::Reader::AsImpl<typeName>::apply(const Reader&
return reader.name##Value; \
} \
BuilderFor<typeName> DynamicValue::Builder::AsImpl<typeName>::apply(Builder& builder) { \
KJ_REQUIRE(builder.type == discrim, "Value type mismatch.") { \
return BuilderFor<typeName>(); \
} \
KJ_REQUIRE(builder.type == discrim, "Value type mismatch."); \
return builder.name##Value; \
}
......
......@@ -187,7 +187,8 @@ class DynamicObject::Builder: public kj::DisallowConstCopy {
public:
typedef DynamicObject Builds;
Builder() = default;
Builder() = delete;
inline Builder(decltype(nullptr)) {}
Builder(Builder&) = default;
Builder(Builder&&) = default;
......@@ -276,7 +277,8 @@ class DynamicStruct::Builder {
public:
typedef DynamicStruct Builds;
Builder() = default;
Builder() = delete;
inline Builder(decltype(nullptr)) {}
template <typename T, typename = kj::EnableIf<kind<FromBuilder<T>>() == Kind::STRUCT>>
inline Builder(T&& value): Builder(toDynamic(value)) {}
......@@ -428,7 +430,8 @@ class DynamicList::Builder {
public:
typedef DynamicList Builds;
Builder() = default;
Builder() = delete;
inline Builder(decltype(nullptr)) {}
template <typename T, typename = kj::EnableIf<kind<FromBuilder<T>>() == Kind::LIST>>
inline Builder(T&& value): Builder(toDynamic(value)) {}
......
......@@ -94,6 +94,8 @@ TEST(Encoding, Defaults) {
checkTestMessage(reader.getRoot<TestDefaults>());
checkTestMessage(readMessageUnchecked<TestDefaults>(nullRoot.words));
checkTestMessage(TestDefaults::Reader());
}
TEST(Encoding, DefaultInitialization) {
......
......@@ -134,7 +134,8 @@ struct List<T, Kind::PRIMITIVE> {
public:
typedef List<T> Builds;
Builder() = default;
Builder() = delete;
inline Builder(decltype(nullptr)) {}
inline explicit Builder(_::ListBuilder builder): builder(builder) {}
inline operator Reader() { return Reader(builder.asReader()); }
......@@ -241,7 +242,8 @@ struct List<T, Kind::STRUCT> {
public:
typedef List<T> Builds;
Builder() = default;
Builder() = delete;
inline Builder(decltype(nullptr)) {}
inline explicit Builder(_::ListBuilder builder): builder(builder) {}
inline operator Reader() { return Reader(builder.asReader()); }
......@@ -371,7 +373,8 @@ struct List<List<T>, Kind::LIST> {
public:
typedef List<List<T>> Builds;
Builder() = default;
Builder() = delete;
inline Builder(decltype(nullptr)) {}
inline explicit Builder(_::ListBuilder builder): builder(builder) {}
inline operator Reader() { return Reader(builder.asReader()); }
......@@ -488,7 +491,8 @@ struct List<T, Kind::BLOB> {
public:
typedef List<T> Builds;
Builder() = default;
Builder() = delete;
inline Builder(decltype(nullptr)) {}
inline explicit Builder(_::ListBuilder builder): builder(builder) {}
inline operator Reader() { return Reader(builder.asReader()); }
......
This diff is collapsed.
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