#ifndef TMWA_COMMON_DUMB_PTR_HPP #define TMWA_COMMON_DUMB_PTR_HPP // ptr.hpp - temporary new/delete wrappers // // Copyright © 2013 Ben Longbons // // This file is part of The Mana World (Athena server) // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include "sanity.hpp" #include // unmanaged new/delete-able pointer // should be replaced by std::unique_ptr template class dumb_ptr { T *impl; public: explicit dumb_ptr(T *p=nullptr) : impl(p) {} void delete_() { delete impl; forget(); } template void new_(A&&... a) { impl = new T(std::forward(a)...); } template static dumb_ptr make(A&&... a) { return dumb_ptr(new T(std::forward(a)...)); } void forget() { impl = nullptr; } T& operator *() const { return *impl; } T *operator->() const { return impl; } explicit operator bool() const { return impl; } bool operator !() const { return !impl; } }; // unmanaged new/delete-able pointer // should be replaced by std::unique_ptr or std::vector template class dumb_ptr { T *impl; size_t sz; public: dumb_ptr() : impl(), sz() {} dumb_ptr(T *p, size_t z) : impl(p) , sz(z) {} void delete_() { delete[] impl; forget(); } void new_(size_t z) { impl = new T[z](); sz = z; } static dumb_ptr make(size_t z) { return dumb_ptr(new T[z](), z); } void forget() { impl = nullptr; sz = 0; } size_t size() const { return sz; } void resize(size_t z) { if (z == sz) return; T *np = new T[z](); // not exception-safe, but we don't have a dtor anyway size_t i = std::min(z, sz); while (i-->0) np[i] = std::move(impl[i]); delete[] impl; impl = np; sz = z; } T& operator[](size_t i) const { return impl[i]; } explicit operator bool() const { return impl; } bool operator !() const { return !impl; } }; #endif // TMWA_COMMON_DUMB_PTR_HPP