Use Handle::New to construct T <: RefCountedObject

Unless `T::T(Args...)` is inaccessible from `Handle::New`, in which case
`Handle::Handle{new T(args...), false}` should be used.
This commit is contained in:
yvt 2019-07-20 17:01:04 +09:00
parent 29ac869491
commit b9a5d80f7b
No known key found for this signature in database
GPG Key ID: 48F2768FA8D07C92
23 changed files with 63 additions and 65 deletions

View File

@ -125,9 +125,9 @@ namespace spades {
limbo = stmp::make_unique<LimboView>(this);
paletteView = stmp::make_unique<PaletteView>(this);
tcView = stmp::make_unique<TCProgressView>(this);
scriptedUI.Set(new ClientUI(renderer.GetPointerOrNull(), audioDev.GetPointerOrNull(),
fontManager.GetPointerOrNull(), this),
false);
scriptedUI =
Handle<ClientUI>::New(renderer.GetPointerOrNull(), audioDev.GetPointerOrNull(),
fontManager.GetPointerOrNull(), this);
renderer->SetGameMap(nullptr);
}
@ -168,7 +168,7 @@ namespace spades {
for (size_t i = 0; i < world->GetNumPlayerSlots(); i++) {
auto p = world->GetPlayer(static_cast<unsigned int>(i));
if (p) {
clientPlayers[i] = new ClientPlayer(*p, *this);
clientPlayers[i] = Handle<ClientPlayer>::New(*p, *this);
} else {
clientPlayers[i] = nullptr;
}

View File

@ -237,7 +237,7 @@ namespace spades {
ScriptContextHandle ctx;
IAudioDevice &audio = client.GetAudioDevice();
sandboxedRenderer.Set(new SandboxedRenderer(client.GetRenderer()), false);
sandboxedRenderer = Handle<SandboxedRenderer>::New(client.GetRenderer());
IRenderer &renderer = *sandboxedRenderer;
static ScriptFunction spadeFactory(

View File

@ -39,6 +39,7 @@ namespace spades {
class SandboxedRenderer;
// TODO: Use `shared_ptr` instead of `RefCountedObject`
/** Representation of player which is used by
* drawing/view layer of game client. */
class ClientPlayer : public RefCountedObject {

View File

@ -40,7 +40,7 @@ namespace spades {
if (!audioDevice)
SPInvalidArgument("audioDevice");
helper.Set(new ClientUIHelper(this), false);
helper = Handle<ClientUIHelper>::New(this);
ScopedPrivilegeEscalation privilege;
static ScriptFunction uiFactory(

View File

@ -568,7 +568,7 @@ namespace spades {
stmp::optional<Player &> p = world->GetPlayer(id);
if (p) {
clientPlayers[id].Set(new ClientPlayer(*p, *this), false);
clientPlayers[id] = Handle<ClientPlayer>::New(*p, *this);
}
}

View File

@ -99,7 +99,7 @@ namespace spades {
std::list<std::pair<int, int>> skyline;
Bin(int width, int height, client::IRenderer &r) : width(width), height(height) {
Handle<Bitmap> tmpbmp(new Bitmap(width, height), false);
auto tmpbmp = Handle<Bitmap>::New(width, height);
memset(tmpbmp->GetPixels(), 0, tmpbmp->GetWidth() * tmpbmp->GetHeight() * 4);
image = r.CreateImage(*tmpbmp);
skyline.emplace_back(0, 0);
@ -316,7 +316,7 @@ namespace spades {
SPAssert(outbmp->pixel_mode == FT_PIXEL_MODE_GRAY);
Handle<Bitmap> spbmp(new Bitmap(outbmp->width + 1, outbmp->rows + 1), false);
auto spbmp = Handle<Bitmap>::New(outbmp->width + 1, outbmp->rows + 1);
memset(spbmp->GetPixels(), 0, 4 * spbmp->GetWidth() * spbmp->GetHeight());
@ -358,8 +358,8 @@ namespace spades {
enum { KernelSize = 6 };
auto &orig = *g.bmp;
Handle<Bitmap> newbmp(
new Bitmap(orig.GetWidth() + KernelSize, orig.GetHeight() + KernelSize), false);
auto newbmp =
Handle<Bitmap>::New(orig.GetWidth() + KernelSize, orig.GetHeight() + KernelSize);
int const origW = orig.GetWidth();
int const origH = orig.GetHeight();

View File

@ -42,6 +42,7 @@ namespace spades {
struct FTFaceWrapper;
class FTFont;
// TODO: Use `shared_ptr` instead of `RefCountedObject`
class FTFontSet : public RefCountedObject {
friend class FTFont;
std::list<std::unique_ptr<FTFaceWrapper>> faces;
@ -57,7 +58,7 @@ namespace spades {
/**
* FreeType2 based font renderer.
*
* Warning: only one thread can access multiple FTFonts sharing the same FTFontSet
* at the same time.
*/

View File

@ -37,7 +37,7 @@ namespace spades {
GlobalFontInfo() {
SPLog("Loading built-in fonts");
guiFontSet.Set(new ngclient::FTFontSet(), false);
guiFontSet = Handle<ngclient::FTFontSet>::New();
if (FileManager::FileExists("Gfx/Fonts/AlteDIN1451.ttf")) {
guiFontSet->AddFace("Gfx/Fonts/AlteDIN1451.ttf");

View File

@ -523,7 +523,7 @@ namespace spades {
size_t pos = 0;
Handle<GameMap> map{new GameMap(), false};
auto map = Handle<GameMap>::New();
if (onProgress) {
onProgress(0);

View File

@ -43,7 +43,7 @@ namespace spades {
public:
Port() {
SPADES_MARK_FUNCTION();
bmp.Set(new Bitmap(512, 512), false);
bmp = Handle<Bitmap>::New(512, 512);
}
Bitmap &GetFramebuffer() override { return *bmp; }
void Swap() override {
@ -53,8 +53,8 @@ namespace spades {
HitTestDebugger::HitTestDebugger(World *world) : world(world) {
SPADES_MARK_FUNCTION();
port.Set(new Port(), false);
renderer.Set(new draw::SWRenderer(port.Cast<draw::SWPort>()), false);
port = Handle<Port>::New();
renderer = Handle<draw::SWRenderer>::New(port.Cast<draw::SWPort>()).Cast<IRenderer>();
renderer->Init();
}

View File

@ -110,7 +110,7 @@ namespace spades {
}
template <class... Args> static Handle New(Args &&... args) {
T *ptr = new T{std::forward<Args>(args)...};
T *ptr = new T(std::forward<Args>(args)...);
return {ptr, false};
}

View File

@ -62,27 +62,22 @@ namespace spades {
int height = img->h;
int pitch = img->pitch;
Handle<Bitmap> bmp;
bmp.Set(new Bitmap(width, height), false);
try {
unsigned char *outPixels = (unsigned char *)bmp->GetPixels();
auto bmp = Handle<Bitmap>::New(width, height);
unsigned char *outPixels = (unsigned char *)bmp->GetPixels();
if (pitch == width * 4) {
// if the pitch matches the requirement of Bitmap,
// just use it
memcpy(outPixels, inPixels, pitch * height);
} else {
// convert
for (int y = 0; y < height; y++) {
memcpy(outPixels, inPixels, width * 4);
outPixels += width * 4;
inPixels += pitch;
}
if (pitch == width * 4) {
// if the pitch matches the requirement of Bitmap,
// just use it
memcpy(outPixels, inPixels, pitch * height);
} else {
// convert
for (int y = 0; y < height; y++) {
memcpy(outPixels, inPixels, width * 4);
outPixels += width * 4;
inPixels += pitch;
}
return std::move(bmp).Unmanage();
} catch (...) {
throw;
}
return std::move(bmp).Unmanage();
}
void Save(IStream *, Bitmap *) override {

View File

@ -51,7 +51,7 @@ namespace spades {
Bitmap *GLFlatMapRenderer::GenerateBitmap(int mx, int my, int w, int h) {
SPADES_MARK_FUNCTION();
Handle<Bitmap> bmp(new Bitmap(w, h), false);
auto bmp = Handle<Bitmap>::New(w, h);
try {
uint32_t *pixels = bmp->GetPixels();

View File

@ -1037,9 +1037,8 @@ namespace spades {
device->BindFramebuffer(IGLDevice::Framebuffer, 0);
device->Enable(IGLDevice::Blend, false);
device->Viewport(0, 0, handle.GetWidth(), handle.GetHeight());
Handle<GLImage> image(new GLImage(handle.GetTexture(), device.GetPointerOrNull(), handle.GetWidth(),
handle.GetHeight(), false),
false);
auto image = Handle<GLImage>::New(handle.GetTexture(), device.GetPointerOrNull(),
handle.GetWidth(), handle.GetHeight(), false);
SetColorAlphaPremultiplied(MakeVector4(1, 1, 1, 1));
DrawImage(*image,
AABB2(0, handle.GetHeight(), handle.GetWidth(), -handle.GetHeight()));
@ -1233,9 +1232,9 @@ namespace spades {
device->BindFramebuffer(IGLDevice::Framebuffer, 0);
device->Enable(IGLDevice::Blend, false);
device->Viewport(0, 0, w, h);
// TODO: Replace this with `Handle::New`
Handle<GLImage> image(new GLImage(lastColorBufferTexture, device.GetPointerOrNull(), w, h, false),
false);
auto image = Handle<GLImage>::New(lastColorBufferTexture, device.GetPointerOrNull(),
w, h, false);
SetColorAlphaPremultiplied(MakeVector4(1, 1, 1, 1));
DrawImage(*image, AABB2(0, h, w, -h));
imageRenderer->Flush(); // must flush now because handle is released soon

View File

@ -38,7 +38,7 @@ namespace spades {
SPRaise("Map width must be a multiple of 32.");
}
img.Set(new SWImage(map->Width(), map->Height()), false);
img = Handle<SWImage>::New(map->Width(), map->Height());
updateMap.resize(w * h / 32);
std::fill(updateMap.begin(), updateMap.end(), 0xffffffff);
updateMap2.resize(w * h / 32);

View File

@ -115,7 +115,7 @@ namespace spades {
Handle<ConsoleCommandCandidateIterator>
ConfigConsoleResponder::AutocompleteCommandName(const std::string &name) {
return {new ConfigNameIterator(name), false};
return Handle<ConfigNameIterator>::New(name).Cast<ConsoleCommandCandidateIterator>();
}
} // namespace gui
} // namespace spades

View File

@ -84,7 +84,8 @@ namespace spades {
Handle<ConsoleCommandCandidateIterator> second) {
SPADES_MARK_FUNCTION();
return {new MergeConsoleCommandCandidates{std::move(first), std::move(second)}, false};
return Handle<MergeConsoleCommandCandidates>::New(std::move(first), std::move(second))
.Cast<ConsoleCommandCandidateIterator>();
}
namespace {
@ -135,7 +136,7 @@ namespace spades {
Handle<ConsoleCommandCandidateIterator>
MakeCandidates(const std::map<std::string, std::string> &items, const std::string &query) {
return {new MapIterator{items, query}, false};
return Handle<MapIterator>::New(items, query).Cast<ConsoleCommandCandidateIterator>();
}
} // namespace gui
} // namespace spades

View File

@ -33,7 +33,7 @@ namespace spades {
: renderer{renderer}, audioDevice{audioDevice}, subview{subview} {
SPADES_MARK_FUNCTION();
helper.Set(new ConsoleHelper(this), true);
helper = Handle<ConsoleHelper>::New(this);
ScopedPrivilegeEscalation privilege;
static ScriptFunction uiFactory("ConsoleUI@ CreateConsoleUI(Renderer@, "

View File

@ -233,9 +233,10 @@ namespace spades {
protected:
spades::gui::View *CreateView(spades::client::IRenderer *renderer,
spades::client::IAudioDevice *audio) override {
Handle<client::FontManager> fontManager(new client::FontManager(renderer), false);
Handle<gui::View> innerView{new spades::client::Client(renderer, audio, addr, fontManager), false};
return new spades::gui::ConsoleScreen(renderer, audio, fontManager, std::move(innerView));
auto fontManager = Handle<client::FontManager>::New(renderer);
auto innerView = Handle<client::Client>::New(renderer, audio, addr, fontManager);
return new spades::gui::ConsoleScreen(renderer, audio, fontManager,
std::move(innerView).Cast<gui::View>());
}
public:
@ -249,9 +250,10 @@ namespace spades {
protected:
spades::gui::View *CreateView(spades::client::IRenderer *renderer,
spades::client::IAudioDevice *audio) override {
Handle<client::FontManager> fontManager(new client::FontManager(renderer), false);
Handle<gui::View> innerView{new spades::gui::MainScreen(renderer, audio, fontManager), false};
return new spades::gui::ConsoleScreen(renderer, audio, fontManager, std::move(innerView));
auto fontManager = Handle<client::FontManager>::New(renderer);
auto innerView = Handle<gui::MainScreen>::New(renderer, audio, fontManager);
return new spades::gui::ConsoleScreen(renderer, audio, fontManager,
std::move(innerView).Cast<gui::View>());
}
public:

View File

@ -358,8 +358,8 @@ namespace spades {
std::string MainScreen::Connect(const ServerAddress &host) {
try {
subview.Set(new client::Client(&*renderer, &*audioDevice, host, fontManager),
false);
subview = Handle<client::Client>::New(&*renderer, &*audioDevice, host, fontManager)
.Cast<View>();
} catch (const std::exception &ex) {
SPLog("[!] Error while initializing a game client: %s", ex.what());
return ex.what();

View File

@ -324,11 +324,10 @@ namespace spades {
void SetFramebufferBitmap() {
if (adjusted) {
framebuffer.Set(new Bitmap(actualW, actualH), false);
framebuffer = Handle<Bitmap>::New(actualW, actualH);
} else {
framebuffer.Set(new Bitmap(reinterpret_cast<uint32_t *>(surface->pixels),
surface->w, surface->h),
false);
framebuffer = Handle<Bitmap>::New(reinterpret_cast<uint32_t *>(surface->pixels),
surface->w, surface->h);
}
}

View File

@ -284,10 +284,9 @@ namespace spades {
return new audio::NullDevice();
}
View *CreateView(client::IRenderer *renderer, client::IAudioDevice *dev) override {
Handle<client::FontManager> fontManager(new client::FontManager(renderer),
false);
view.Set(new StartupScreen(renderer, dev, helper, fontManager), true);
return view.GetPointerOrNull();
auto fontManager = Handle<client::FontManager>::New(renderer);
view = Handle<StartupScreen>::New(renderer, dev, helper, fontManager);
return Handle<StartupScreen>{view}.Unmanage();
}
public:

View File

@ -23,7 +23,8 @@ namespace spades {
namespace gui {
Handle<ConsoleCommandCandidateIterator>
View::AutocompleteCommandName(const std::string &name) {
return {new EmptyIterator<const ConsoleCommandCandidate &>(), false};
return Handle<EmptyIterator<const ConsoleCommandCandidate &>>::New()
.Cast<ConsoleCommandCandidateIterator>();
}
} // namespace gui
} // namespace spades