Support move-only closures in TaskQueue

it allows to create less boil-plate code when marshaling call
with move-only parameters (e.g. unique_ptr) to TaskQueue

Bug: None
Change-Id: I97ddf4f8409af2f83d69fd33267e9a87fb60d901
Reviewed-on: https://webrtc-review.googlesource.com/7619
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Reviewed-by: Karl Wiberg <kwiberg@webrtc.org>
Reviewed-by: Per Kjellander <perkj@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#20271}
This commit is contained in:
Danil Chapovalov
2017-10-12 14:39:25 +02:00
committed by Commit Bot
parent 75dfd1c174
commit 6f09ae20bd
3 changed files with 145 additions and 44 deletions

View File

@ -15,6 +15,7 @@
#include <algorithm>
#include <queue>
#include <utility>
#include "rtc_base/arraysize.h"
#include "rtc_base/checks.h"
@ -170,10 +171,11 @@ class TaskQueue::Impl : public RefCountInterface {
bool IsCurrent() const;
template <class Closure,
typename std::enable_if<
std::is_copy_constructible<Closure>::value>::type* = nullptr>
void PostTask(const Closure& closure) {
PostTask(std::unique_ptr<QueuedTask>(new ClosureTask<Closure>(closure)));
typename std::enable_if<!std::is_convertible<
Closure,
std::unique_ptr<QueuedTask>>::value>::type* = nullptr>
void PostTask(Closure&& closure) {
PostTask(NewClosure(std::forward<Closure>(closure)));
}
void PostTask(std::unique_ptr<QueuedTask> task);