public:
Task() { /* Nothing to do */}
- Task(std::nullptr_t) { /* Nothing to do */}
+ explicit Task(std::nullptr_t) { /* Nothing to do */}
~Task()
{
this->clear();
if (that.vtable_ && that.vtable_->move)
that.vtable_->move(buffer_, that.buffer_);
else
- std::memcpy(&buffer_, &that.buffer_, sizeof(buffer_));
+ std::memcpy(static_cast<void*>(&buffer_), static_cast<void*>(&that.buffer_), sizeof(buffer_));
+
vtable_ = that.vtable_;
that.vtable_ = nullptr;
}
if (that.vtable_ && that.vtable_->move)
that.vtable_->move(buffer_, that.buffer_);
else
- std::memcpy(&buffer_, &that.buffer_, sizeof(buffer_));
+ std::memcpy(static_cast<void*>(&buffer_), static_cast<void*>(&that.buffer_), sizeof(buffer_));
vtable_ = that.vtable_;
that.vtable_ = nullptr;
return *this;
{
const static TaskVtable vtable {
// Call:
- [](TaskUnion& buffer, Args... args) -> R {
+ [](TaskUnion& buffer, Args... args) {
F* src = reinterpret_cast<F*>(&buffer);
F code = std::move(*src);
src->~F();
- code(std::forward<Args>(args)...);
+ return code(std::forward<Args>(args)...);
},
// Destroy:
std::is_trivially_destructible<F>::value ?
{
const static TaskVtable vtable {
// Call:
- [](TaskUnion& buffer, Args... args) -> R {
+ [](TaskUnion& buffer, Args... args) {
// Delete F when we go out of scope:
std::unique_ptr<F> code(*reinterpret_cast<F**>(&buffer));
return (*code)(std::forward<Args>(args)...);
}
public:
-
- template<class F>
- Task(F code)
- {
- this->init(std::move(code));
- }
+ template <class F> explicit Task(F code) { this->init(std::move(code)); }
operator bool() const { return vtable_ != nullptr; }
bool operator!() const { return vtable_ == nullptr; }
-> Task< decltype(code(std::move(args)...))() >
{
TaskImpl<F, Args...> task(std::move(code), std::make_tuple(std::move(args)...));
- return std::move(task);
+ return Task<decltype(code(std::move(args)...))()>(std::move(task));
}
}