Allows UniqPtr to do upcast.
This commit is contained in:
parent
7fa5227f42
commit
82c40b10d2
@ -14,5 +14,5 @@ gj::Game::Game(gj::Game::Param&& p) :
|
||||
param.alloc = alloc_;
|
||||
param.clock = &clock_;
|
||||
param.audio = p.audio;
|
||||
scene_ = alloc_->MakeUniq<gj::iScene, gj::TitleScene>(param);
|
||||
scene_ = alloc_->MakeUniq<gj::TitleScene>(param);
|
||||
}
|
@ -32,7 +32,7 @@ class GlyphElementFactory : public iElementFactory {
|
||||
auto& font = FindOrCreateFont(name);
|
||||
auto tex = std::move(font.RenderGlyphs(ConvertStrToWstr(text), size)); /* TODO */
|
||||
|
||||
return alloc_->MakeUniq<iElement, TextureElement>(
|
||||
return alloc_->MakeUniq<TextureElement>(
|
||||
param.period, std::move(tex), std::move(param.driver));
|
||||
}
|
||||
|
||||
|
@ -32,10 +32,10 @@ class InputWindowElementFactory : public iElementFactory {
|
||||
p.period = param.period;
|
||||
p.scoreboard = sb_;
|
||||
p.driver = std::move(param.driver);
|
||||
p.matcher = alloc_->MakeUniq<iInputMatcher, HiraganaMatcher>(ConvertStrToWstr(kana));
|
||||
p.matcher = alloc_->MakeUniq<HiraganaMatcher>(ConvertStrToWstr(kana));
|
||||
p.text = ConvertStrToWstr(text);
|
||||
|
||||
return alloc_->MakeUniq<iElement, InputWindowElement>(std::move(p));
|
||||
return alloc_->MakeUniq<InputWindowElement>(std::move(p));
|
||||
}
|
||||
|
||||
private:
|
||||
|
@ -12,7 +12,7 @@ gj::LoadScene::LoadScene(Param&& p) :
|
||||
gj::UniqPtr<gj::iScene> gj::LoadScene::Update(Frame& frame) {
|
||||
if (prod_->HasPrepared() && !(orphan_ && orphan_->IsBusy())) {
|
||||
prod_->Start();
|
||||
return UniqPtr<iScene>(prod_.release(), iAllocator::Deleter<iScene>(alloc_));
|
||||
return std::move(prod_);
|
||||
}
|
||||
|
||||
const uint64_t now = clock_->now();
|
||||
|
@ -118,7 +118,7 @@ static int CallFactory_(lua_State* L) {
|
||||
|
||||
gj::iElementFactory::Param param;
|
||||
param.period = gj::Period(st, ed);
|
||||
param.driver = alloc->MakeUniq<gj::iElementDriver, LuaFunc>(L, n);
|
||||
param.driver = alloc->MakeUniq<LuaFunc>(L, n);
|
||||
|
||||
for (int i = 3; i < n; ++i) {
|
||||
gj::iElementFactory::Param::CustomValue v;
|
||||
|
@ -33,7 +33,7 @@ class MusicElementFactory : public iElementFactory {
|
||||
p.path = path;
|
||||
p.offset = offset;
|
||||
p.driver = std::move(param.driver);
|
||||
return alloc_->MakeUniq<iElement, MusicElement>(std::move(p));
|
||||
return alloc_->MakeUniq<MusicElement>(std::move(p));
|
||||
}
|
||||
|
||||
private:
|
||||
|
@ -9,7 +9,7 @@
|
||||
|
||||
gj::UniqPtr<gj::iScene> gj::PlayScene::Update(Frame& f) {
|
||||
if (store_.IsEmpty()) {
|
||||
return param_.alloc->MakeUniq<iScene, ResultScene>(param_, sb_);
|
||||
return param_.alloc->MakeUniq<ResultScene>(param_, sb_);
|
||||
}
|
||||
|
||||
store_.Update(f, clock_.now());
|
||||
|
@ -54,7 +54,7 @@ gj::UniqPtr<gj::iScene> gj::ResultScene::Update(Frame& f) {
|
||||
f.Add(&guide_);
|
||||
|
||||
if (f.input.find(' ') != std::string::npos) {
|
||||
return param_.alloc->MakeUniq<iScene, TitleScene>(param_);
|
||||
return param_.alloc->MakeUniq<TitleScene>(param_);
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
|
@ -63,7 +63,7 @@ gj::UniqPtr<gj::iScene> gj::TitleScene::Update(Frame& frame) {
|
||||
param.path = s.path;
|
||||
param.title = s.title;
|
||||
param.orphan = std::move(music_);
|
||||
return param_.alloc->MakeUniq<iScene, LoadScene>(std::move(param));
|
||||
return param_.alloc->MakeUniq<LoadScene>(std::move(param));
|
||||
}
|
||||
case 'h':
|
||||
SelectScore_(select_index_? select_index_-1: list_.size()-1);
|
||||
|
@ -19,7 +19,11 @@ public:
|
||||
Deleter& operator=(Deleter&&) = default;
|
||||
Deleter& operator=(const Deleter&) = delete;
|
||||
|
||||
Deleter(iAllocator* alloc) : alloc_(alloc) {
|
||||
template <typename I>
|
||||
Deleter(Deleter<I>&& src) {
|
||||
alloc_ = src.alloc_;
|
||||
}
|
||||
explicit Deleter(iAllocator* alloc) : alloc_(alloc) {
|
||||
}
|
||||
|
||||
void operator()(T* ptr) {
|
||||
@ -57,11 +61,6 @@ public:
|
||||
T* ptr = Alloc<T>();
|
||||
return std::unique_ptr<T, Deleter<T>>(new(ptr) T(std::forward<Args>(args)...), Deleter<T>(this));
|
||||
}
|
||||
template <typename I, typename T, typename... Args>
|
||||
UniqPtr<I> MakeUniq(Args&&... args) {
|
||||
T* ptr = Alloc<T>();
|
||||
return std::unique_ptr<I, Deleter<I>>(new(ptr) T(std::forward<Args>(args)...), Deleter<I>(this));
|
||||
}
|
||||
template <typename T>
|
||||
UniqPtr<T> MakeUniqArray(size_t n) {
|
||||
T* ptr = Alloc<T>(n);
|
||||
|
Reference in New Issue
Block a user