1d86ed7fbStbbdev /*
2*b15aabb3Stbbdev Copyright (c) 2005-2021 Intel Corporation
3d86ed7fbStbbdev
4d86ed7fbStbbdev Licensed under the Apache License, Version 2.0 (the "License");
5d86ed7fbStbbdev you may not use this file except in compliance with the License.
6d86ed7fbStbbdev You may obtain a copy of the License at
7d86ed7fbStbbdev
8d86ed7fbStbbdev http://www.apache.org/licenses/LICENSE-2.0
9d86ed7fbStbbdev
10d86ed7fbStbbdev Unless required by applicable law or agreed to in writing, software
11d86ed7fbStbbdev distributed under the License is distributed on an "AS IS" BASIS,
12d86ed7fbStbbdev WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d86ed7fbStbbdev See the License for the specific language governing permissions and
14d86ed7fbStbbdev limitations under the License.
15d86ed7fbStbbdev */
16d86ed7fbStbbdev
17d86ed7fbStbbdev #include <iostream>
18d86ed7fbStbbdev #include <string>
19d86ed7fbStbbdev #include <vector>
20d86ed7fbStbbdev #include <algorithm> // std::max
21d86ed7fbStbbdev
22d86ed7fbStbbdev #include "oneapi/tbb/parallel_for.h"
23d86ed7fbStbbdev #include "oneapi/tbb/blocked_range.h"
24d86ed7fbStbbdev
25d86ed7fbStbbdev #include "common/utility/utility.hpp"
26d86ed7fbStbbdev
27d86ed7fbStbbdev bool silent = false;
28d86ed7fbStbbdev
29d86ed7fbStbbdev static const std::size_t N = 23;
30d86ed7fbStbbdev
31d86ed7fbStbbdev class SubStringFinder {
32d86ed7fbStbbdev const std::string &str;
33d86ed7fbStbbdev std::vector<std::size_t> &max_array;
34d86ed7fbStbbdev std::vector<std::size_t> &pos_array;
35d86ed7fbStbbdev
36d86ed7fbStbbdev public:
operator ()(const oneapi::tbb::blocked_range<std::size_t> & r) const37d86ed7fbStbbdev void operator()(const oneapi::tbb::blocked_range<std::size_t> &r) const {
38d86ed7fbStbbdev for (std::size_t i = r.begin(); i != r.end(); ++i) {
39d86ed7fbStbbdev std::size_t max_size = 0, max_pos = 0;
40d86ed7fbStbbdev for (std::size_t j = 0; j < str.size(); ++j) {
41d86ed7fbStbbdev if (j != i) {
42d86ed7fbStbbdev std::size_t limit = str.size() - (std::max)(i, j);
43d86ed7fbStbbdev for (std::size_t k = 0; k < limit; ++k) {
44d86ed7fbStbbdev if (str[i + k] != str[j + k])
45d86ed7fbStbbdev break;
46d86ed7fbStbbdev if (k > max_size) {
47d86ed7fbStbbdev max_size = k;
48d86ed7fbStbbdev max_pos = j;
49d86ed7fbStbbdev }
50d86ed7fbStbbdev }
51d86ed7fbStbbdev }
52d86ed7fbStbbdev }
53d86ed7fbStbbdev max_array[i] = max_size;
54d86ed7fbStbbdev pos_array[i] = max_pos;
55d86ed7fbStbbdev }
56d86ed7fbStbbdev }
57d86ed7fbStbbdev
SubStringFinder(const std::string & s,std::vector<std::size_t> & m,std::vector<std::size_t> & p)58d86ed7fbStbbdev SubStringFinder(const std::string &s, std::vector<std::size_t> &m, std::vector<std::size_t> &p)
59d86ed7fbStbbdev : str(s),
60d86ed7fbStbbdev max_array(m),
61d86ed7fbStbbdev pos_array(p) {}
62d86ed7fbStbbdev };
63d86ed7fbStbbdev
main(int argc,char * argv[])64d86ed7fbStbbdev int main(int argc, char *argv[]) {
65d86ed7fbStbbdev // command line parsing
66d86ed7fbStbbdev utility::parse_cli_arguments(argc,
67d86ed7fbStbbdev argv,
68d86ed7fbStbbdev utility::cli_argument_pack()
69d86ed7fbStbbdev //"-h" option for displaying help is present implicitly
70d86ed7fbStbbdev .arg(silent, "silent", "no output"));
71d86ed7fbStbbdev
72d86ed7fbStbbdev std::string str[N] = { std::string("a"), std::string("b") };
73d86ed7fbStbbdev for (std::size_t i = 2; i < N; ++i)
74d86ed7fbStbbdev str[i] = str[i - 1] + str[i - 2];
75d86ed7fbStbbdev std::string &to_scan = str[N - 1];
76d86ed7fbStbbdev const std::size_t num_elem = to_scan.size();
77d86ed7fbStbbdev
78d86ed7fbStbbdev std::vector<std::size_t> max(num_elem);
79d86ed7fbStbbdev std::vector<std::size_t> pos(num_elem);
80d86ed7fbStbbdev
81d86ed7fbStbbdev oneapi::tbb::parallel_for(oneapi::tbb::blocked_range<std::size_t>(0, num_elem),
82d86ed7fbStbbdev SubStringFinder(to_scan, max, pos));
83d86ed7fbStbbdev
84d86ed7fbStbbdev for (std::size_t i = 0; i < num_elem; ++i)
85d86ed7fbStbbdev if (!silent)
86d86ed7fbStbbdev std::cout << " " << max[i] << "(" << pos[i] << ")"
87d86ed7fbStbbdev << "\n";
88d86ed7fbStbbdev
89d86ed7fbStbbdev return 0;
90d86ed7fbStbbdev }
91