Commit d63ab91a authored by Wei Li's avatar Wei Li Committed by Commit Bot

Create object early in Builder

Previously, Builder only creates the View object in Build() call. So we
can not use the raw pointer passed in through CopyAddressTo() during the
building process. This CL changes to create the object early on inside
the constructor so we can use the raw address during the building
process.

Bug: 1130078
Change-Id: I893a567262bb31b9090012c1a74e899311d33182
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2490556Reviewed-by: default avatarAllen Bauer <kylixrd@chromium.org>
Commit-Queue: Wei Li <weili@chromium.org>
Cr-Commit-Position: refs/heads/master@{#820037}
parent 0e840ae8
......@@ -22,13 +22,13 @@ template <typename Builder>
class BaseViewBuilderT : public internal::ViewBuilderCore {
public:
using ViewClass_ = typename internal::ViewClassTrait<Builder>::ViewClass_;
BaseViewBuilderT() = default;
BaseViewBuilderT() { view_ = std::make_unique<ViewClass_>(); }
BaseViewBuilderT(BaseViewBuilderT&&) = default;
BaseViewBuilderT& operator=(BaseViewBuilderT&&) = default;
~BaseViewBuilderT() override = default;
Builder& CopyAddressTo(ViewClass_** view_address) {
view_address_ = view_address;
*view_address = view_.get();
return *static_cast<Builder*>(this);
}
......@@ -46,12 +46,9 @@ class BaseViewBuilderT : public internal::ViewBuilderCore {
}
std::unique_ptr<ViewClass_> Build() {
auto view = std::make_unique<ViewClass_>();
SetProperties(view.get());
CreateChildren(view.get());
if (view_address_)
*view_address_ = view.get();
return view;
SetProperties(view_.get());
CreateChildren(view_.get());
return std::move(view_);
}
template <typename T>
......@@ -67,7 +64,9 @@ class BaseViewBuilderT : public internal::ViewBuilderCore {
protected:
std::unique_ptr<View> DoBuild() override { return Build(); }
ViewClass_** view_address_ = nullptr;
// Owned and meaningful during the Builder building process. Its
// ownership will be transferred out upon Build() call.
std::unique_ptr<ViewClass_> view_;
};
// Example of builder class generated by the following macros.
......
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