-
Notifications
You must be signed in to change notification settings - Fork 0
/
Task.cpp
87 lines (71 loc) · 2 KB
/
Task.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/*
* Copyright (C) 2021 Ilya Entin
*/
#include "Task.h"
#include <algorithm>
#include "Logger.h"
#include "Utility.h"
PreprocessRequest Task::_preprocessRequest = nullptr;
ProcessRequest Task::_function;
Response Task::_emptyResponse;
RequestRow::RequestRow(std::string_view::const_iterator beg,
std::string_view::const_iterator end) :
_value(beg, end) {}
Task::Task(Response& response) : _response(response) {}
Task::~Task() {
Trace << '\n';
}
void Task::setProcessFunction(ProcessRequest function) {
_function = function;
}
void Task::update(std::string_view request) {
_promise = std::promise<void>();
_diagnostics = isDiagnosticsEnabled(_header);
_rows.clear();
utility::splitFast(request, _rows);
_indices.resize(_rows.size());
for (unsigned i = 0; i < _indices.size(); ++i) {
_indices[i] = i;
_rows[i]._orgIndex = i;
}
_response.resize(_rows.size());
}
void Task::sortIndices() {
std::sort(_indices.begin(), _indices.end(), [this] (int idx1, int idx2) {
return _rows[idx1]._sizeKey < _rows[idx2]._sizeKey;
});
}
bool Task::preprocessNext() {
unsigned index = _index.fetch_add(1);
if (index < _rows.size()) {
RequestRow& row = _rows[index];
row._sizeKey = _preprocessRequest(row._value);
return true;
}
return false;
}
bool Task::processNext() {
unsigned index = _index.fetch_add(1);
if (index < _rows.size()) {
RequestRow& row = _rows[_indices[index]];
std::size_t typeIndex = _function.index();
switch (typeIndex) {
case SORTFUNCTION:
_response[row._orgIndex] = std::get<SORTFUNCTION>(_function)(row._sizeKey, row._value, _diagnostics);
break;
case NOSORTFUNCTION:
_response[row._orgIndex] = std::get<NOSORTFUNCTION>(_function)(row._value, _diagnostics);
break;
case ECHOFUNCTION:
_response[row._orgIndex] = std::get<ECHOFUNCTION>(_function)(row._value);
break;
default:
return false;
}
return true;
}
return false;
}
void Task::finish() {
_promise.set_value();
}