Revert "core: special-case deleter for raw memory"

This reverts commit f75d1822cc.
This commit is contained in:
Asias He
2014-11-11 21:55:05 +08:00
parent 5eaecc8805
commit cfd8a1f997

View File

@@ -6,23 +6,17 @@
#define DELETER_HH_
#include <memory>
#include <cstdlib>
#include <type_traits>
class deleter {
public:
struct impl;
struct raw_object_tag {};
private:
// if bit 0 set, point to object to be freed directly.
impl* _impl = nullptr;
public:
deleter() = default;
deleter(const deleter&) = delete;
deleter(deleter&& x) : _impl(x._impl) { x._impl = nullptr; }
explicit deleter(impl* i) : _impl(i) {}
deleter(raw_object_tag tag, void* object)
: _impl(from_raw_object(object)) {}
~deleter();
deleter& operator=(deleter&& x);
deleter& operator=(deleter&) = delete;
@@ -36,19 +30,6 @@ public:
this->~deleter();
new (this) deleter(i);
}
private:
bool is_raw_object() const {
auto x = reinterpret_cast<uintptr_t>(_impl);
return x & 1;
}
void* to_raw_object() const {
auto x = reinterpret_cast<uintptr_t>(_impl);
return reinterpret_cast<void*>(x & ~uintptr_t(1));
}
impl* from_raw_object(void* object) {
auto x = reinterpret_cast<uintptr_t>(object);
return reinterpret_cast<impl*>(x | 1);
}
};
struct deleter::impl {
@@ -60,10 +41,6 @@ struct deleter::impl {
inline
deleter::~deleter() {
if (is_raw_object()) {
std::free(to_raw_object());
return;
}
if (_impl && --_impl->refs == 0) {
delete _impl;
}
@@ -92,29 +69,14 @@ make_deleter(deleter next, Deleter d) {
return deleter(new lambda_deleter_impl<Deleter>(std::move(next), std::move(d)));
}
struct free_deleter_impl final : deleter::impl {
void* obj;
free_deleter_impl(void* obj) : impl(deleter()), obj(obj) {}
virtual ~free_deleter_impl() override { std::free(obj); }
};
inline
deleter
deleter::share() {
if (!_impl) {
return deleter();
}
if (is_raw_object()) {
_impl = new free_deleter_impl(to_raw_object());
}
++_impl->refs;
return deleter(_impl);
}
inline
deleter
make_free_deleter(void* obj) {
return deleter(deleter::raw_object_tag(), obj);
}
#endif /* DELETER_HH_ */