Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Please cppcheck (codacy).
[simgrid.git] / include / xbt / functional.hpp
index 6f093af..8b73dab 100644 (file)
@@ -171,7 +171,7 @@ private:
 
 public:
   Task() { /* Nothing to do */}
-  Task(std::nullptr_t) { /* Nothing to do */}
+  explicit Task(std::nullptr_t) { /* Nothing to do */}
   ~Task()
   {
     this->clear();
@@ -184,7 +184,8 @@ public:
     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;
   }
@@ -194,7 +195,7 @@ public:
     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;
@@ -208,11 +209,11 @@ private:
   {
     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 ?
@@ -237,7 +238,7 @@ private:
   {
     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)...);
@@ -255,12 +256,7 @@ private:
   }
 
 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; }
@@ -297,7 +293,7 @@ auto makeTask(F code, Args... args)
 -> 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));
 }
 
 }