neoGFX
Cross-platform C++ app/game engine
Loading...
Searching...
No Matches
task.hpp
Go to the documentation of this file.
1// task.hpp v1.0
2/*
3 * Copyright (c) 2007 Leigh Johnston.
4 *
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions are
9 * met:
10 *
11 * * Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 *
14 * * Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 *
18 * * Neither the name of Leigh Johnston nor the names of any
19 * other contributors to this software may be used to endorse or
20 * promote products derived from this software without specific prior
21 * written permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
24 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
25 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
26 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
27 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
28 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
29 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
30 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
31 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
32 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 */
35
36#pragma once
37
38#include <neolib/neolib.hpp>
39#include <future>
40#include <atomic>
43
44namespace neolib
45{
46 template <typename Base = i_task>
47 class task : public Base
48 {
49 // construction
50 public:
51 task(const std::string& aName = std::string{}) : iName{ aName }, iCancelled{ false }
52 {
53 }
54 // operations
55 public:
56 const std::string& name() const override
57 {
58 return iName;
59 }
60 // implementation
61 public:
62 bool do_work(yield_type aYieldType = yield_type::NoYield) override
63 {
64 return false;
65 }
66 void cancel() noexcept override
67 {
68 iCancelled = true;
69 }
70 bool cancelled() const override
71 {
72 return iCancelled;
73 }
74 // attributes
75 private:
76 std::string iName;
77 std::atomic<bool> iCancelled;
78 };
79
80 template <typename T>
81 class function_task : public task<>
82 {
83 public:
84 function_task(std::function<T()> aFunction) : task{}, iFunction{ aFunction }
85 {
86 }
87 public:
88 std::future<T> get_future()
89 {
90 return iPromise.get_future();
91 }
92 public:
93 const std::string& name() const override
94 {
95 static std::string sName = "neolib::function_task";
96 return sName;
97 }
98 void run(yield_type) override
99 {
100 iPromise.set_value(iFunction());
101 }
102 private:
103 std::function<T()> iFunction;
104 std::promise<T> iPromise;
105 };
106
107 template <>
109 {
110 iFunction();
111 iPromise.set_value();
112 }
113}
std::future< T > get_future()
Definition task.hpp:88
const std::string & name() const override
Definition task.hpp:93
function_task(std::function< T()> aFunction)
Definition task.hpp:84
void run(yield_type) override
Definition task.hpp:98
bool cancelled() const override
Definition task.hpp:70
void cancel() noexcept override
Definition task.hpp:66
task(const std::string &aName=std::string{})
Definition task.hpp:51
const std::string & name() const override
Definition task.hpp:56
bool do_work(yield_type aYieldType=yield_type::NoYield) override
Definition task.hpp:62