15 #include <string_view>
21 std::vector<std::string_view>
tokenize(
const std::string &Filter,
22 const std::string &Delim) {
23 std::vector<std::string_view> Tokens;
27 while ((Pos = Filter.find(Delim, LastPos)) != std::string::npos) {
28 std::string_view Tok(Filter.data() + LastPos, (Pos - LastPos));
31 Tokens.push_back(Tok);
38 if (LastPos < Filter.size()) {
39 std::string_view Tok(Filter.data() + LastPos, Filter.size() - LastPos);
40 Tokens.push_back(Tok);
45 device_filter::device_filter(
const std::string &FilterString) {
46 std::vector<std::string_view> Tokens =
tokenize(FilterString,
":");
47 size_t TripleValueID = 0;
49 auto FindElement = [&](
auto Element) {
50 return std::string::npos != Tokens[TripleValueID].find(Element.first);
68 if (TripleValueID >= Tokens.size()) {
78 DeviceType = Iter->second;
86 if (TripleValueID < Tokens.size()) {
88 DeviceNum = std::stoi(Tokens[TripleValueID].data());
92 std::string(
"Invalid device filter: ") + FilterString +
93 "\nPossible backend values are "
94 "{host,opencl,level_zero,cuda,hip,esimd_emulator,*}.\n"
95 "Possible device types are {host,cpu,gpu,acc,*}.\n"
96 "Device number should be an non-negative integer.\n";
102 device_filter_list::device_filter_list(
const std::string &FilterStr) {
105 std::string FilterString = FilterStr;
106 std::transform(FilterString.begin(), FilterString.end(), FilterString.begin(),
111 while (Pos < FilterString.size()) {
112 size_t CommaPos = FilterString.find(
",", Pos);
113 if (CommaPos == std::string::npos) {
114 CommaPos = FilterString.size();
116 std::string SubString = FilterString.substr(Pos, CommaPos - Pos);
123 FilterList.push_back(Filter);
127 FilterList.push_back(Filter);
133 bool device_filter_list::backendCompatible(
backend Backend) {
135 backend FilterBackend = Filter.Backend;
136 if (FilterBackend == Backend || FilterBackend ==
backend::all)
151 bool device_filter_list::deviceNumberCompatible(
int DeviceNum) {
153 int FilterDevNum = Filter.DeviceNum;
154 if (!Filter.HasDeviceNum || FilterDevNum == DeviceNum)
160 bool device_filter_list::containsHost() {
162 if (Filter.Backend == backend::host || Filter.Backend ==
backend::all)
163 if (Filter.DeviceType == info::device_type::host ||
167 if (!Filter.HasDeviceNum || Filter.DeviceNum == 0)