108 lines
3.1 KiB
C++
108 lines
3.1 KiB
C++
// Copyright 2020 The Marl Authors.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// https://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
#ifndef marl_task_h
|
|
#define marl_task_h
|
|
|
|
#include "export.h"
|
|
|
|
#include <functional>
|
|
|
|
namespace marl {
|
|
|
|
// Task is a unit of work for the scheduler.
|
|
class Task {
|
|
public:
|
|
using Function = std::function<void()>;
|
|
|
|
enum class Flags {
|
|
None = 0,
|
|
|
|
// SameThread ensures the task will be run on the same thread that scheduled
|
|
// the task. This can offer performance improvements if the current thread
|
|
// is immediately going to block on the newly scheduled task, by reducing
|
|
// overheads of waking another thread.
|
|
SameThread = 1,
|
|
};
|
|
|
|
MARL_NO_EXPORT inline Task();
|
|
MARL_NO_EXPORT inline Task(const Task&);
|
|
MARL_NO_EXPORT inline Task(Task&&);
|
|
MARL_NO_EXPORT inline Task(const Function& function,
|
|
Flags flags = Flags::None);
|
|
MARL_NO_EXPORT inline Task(Function&& function, Flags flags = Flags::None);
|
|
MARL_NO_EXPORT inline Task& operator=(const Task&);
|
|
MARL_NO_EXPORT inline Task& operator=(Task&&);
|
|
MARL_NO_EXPORT inline Task& operator=(const Function&);
|
|
MARL_NO_EXPORT inline Task& operator=(Function&&);
|
|
|
|
// operator bool() returns true if the Task has a valid function.
|
|
MARL_NO_EXPORT inline operator bool() const;
|
|
|
|
// operator()() runs the task.
|
|
MARL_NO_EXPORT inline void operator()() const;
|
|
|
|
// is() returns true if the Task was created with the given flag.
|
|
MARL_NO_EXPORT inline bool is(Flags flag) const;
|
|
|
|
private:
|
|
Function function;
|
|
Flags flags = Flags::None;
|
|
};
|
|
|
|
Task::Task() = default;
|
|
Task::Task(const Task& o) : function(o.function), flags(o.flags) {}
|
|
Task::Task(Task&& o) : function(std::move(o.function)), flags(o.flags) {}
|
|
Task::Task(const Function& function_, Flags flags_ /* = Flags::None */)
|
|
: function(function_), flags(flags_) {}
|
|
Task::Task(Function&& function_, Flags flags_ /* = Flags::None */)
|
|
: function(std::move(function_)), flags(flags_) {}
|
|
Task& Task::operator=(const Task& o) {
|
|
function = o.function;
|
|
flags = o.flags;
|
|
return *this;
|
|
}
|
|
Task& Task::operator=(Task&& o) {
|
|
function = std::move(o.function);
|
|
flags = o.flags;
|
|
return *this;
|
|
}
|
|
|
|
Task& Task::operator=(const Function& f) {
|
|
function = f;
|
|
flags = Flags::None;
|
|
return *this;
|
|
}
|
|
Task& Task::operator=(Function&& f) {
|
|
function = std::move(f);
|
|
flags = Flags::None;
|
|
return *this;
|
|
}
|
|
Task::operator bool() const {
|
|
return function.operator bool();
|
|
}
|
|
|
|
void Task::operator()() const {
|
|
function();
|
|
}
|
|
|
|
bool Task::is(Flags flag) const {
|
|
return (static_cast<int>(flags) & static_cast<int>(flag)) ==
|
|
static_cast<int>(flag);
|
|
}
|
|
|
|
} // namespace marl
|
|
|
|
#endif // marl_task_h
|