Merge pull request #9 from cynnyx/master

removed BaseWrapper
This commit is contained in:
Michele Caini 2016-07-16 23:23:04 +02:00 committed by GitHub
commit 65e07c42a9

View File

@ -14,28 +14,22 @@ namespace uvw {
template<typename T>
class Resource: public Emitter<T>, public Self<T> {
using Deleter = void(*)(void *);
template<typename U>
friend class Resource;
struct BaseWrapper {
virtual ~BaseWrapper() = default;
virtual void * get() const noexcept = 0;
};
template<typename U>
struct Wrapper: BaseWrapper {
Wrapper(): resource{std::make_unique<U>()} { }
void * get() const noexcept override { return resource.get(); }
private:
std::unique_ptr<U> resource;
};
static void proto(void *resource) {
delete static_cast<U*>(resource);
}
protected:
template<typename U, template<typename> class R>
explicit Resource(R<U>, std::shared_ptr<Loop> ref)
: Emitter<T>{},
Self<T>{},
wrapper{std::make_unique<Wrapper<U>>()},
resource{new U, &proto<U>},
pLoop{std::move(ref)}
{
this->template get<U>()->data = static_cast<T*>(this);
@ -44,7 +38,7 @@ protected:
uv_loop_t* parent() const noexcept { return pLoop->loop.get(); }
template<typename U>
U* get() const noexcept { return reinterpret_cast<U*>(wrapper->get()); }
U* get() const noexcept { return reinterpret_cast<U*>(resource.get()); }
template<typename F, typename... Args>
auto invoke(F &&f, Args&&... args) {
@ -54,6 +48,12 @@ protected:
}
public:
Resource(const Resource &) = delete;
Resource(Resource &&) = delete;
Resource& operator=(const Resource &) = delete;
Resource& operator=(Resource &&) = delete;
virtual ~Resource() {
static_assert(std::is_base_of<Resource<T>, T>::value, "!");
}
@ -61,7 +61,7 @@ public:
Loop& loop() const noexcept { return *pLoop; }
private:
std::unique_ptr<BaseWrapper> wrapper;
std::unique_ptr<void, Deleter> resource;
std::shared_ptr<Loop> pLoop;
};