1 | // Copyright 2009-2021 Intel Corporation |
2 | // SPDX-License-Identifier: Apache-2.0 |
3 | |
4 | #pragma once |
5 | |
6 | #include "parallel_sort.h" |
7 | |
8 | namespace embree |
9 | { |
10 | /* implementation of a set of values with parallel construction */ |
11 | template<typename T> |
12 | class parallel_set |
13 | { |
14 | public: |
15 | |
16 | /*! default constructor for the parallel set */ |
17 | parallel_set () {} |
18 | |
19 | /*! construction from vector */ |
20 | template<typename Vector> |
21 | parallel_set (const Vector& in) { init(in); } |
22 | |
23 | /*! initialized the parallel set from a vector */ |
24 | template<typename Vector> |
25 | void init(const Vector& in) |
26 | { |
27 | /* copy data to internal vector */ |
28 | vec.resize(in.size()); |
29 | parallel_for( size_t(0), in.size(), size_t(4*4096), [&](const range<size_t>& r) { |
30 | for (size_t i=r.begin(); i<r.end(); i++) |
31 | vec[i] = in[i]; |
32 | }); |
33 | |
34 | /* sort the data */ |
35 | std::vector<T> temp(in.size()); |
36 | radix_sort<T>(vec.data(),temp.data(),vec.size()); |
37 | } |
38 | |
39 | /*! tests if some element is in the set */ |
40 | __forceinline bool lookup(const T& elt) const { |
41 | return std::binary_search(vec.begin(), vec.end(), elt); |
42 | } |
43 | |
44 | /*! clears all state */ |
45 | void clear() { |
46 | vec.clear(); |
47 | } |
48 | |
49 | private: |
50 | std::vector<T> vec; //!< vector containing sorted elements |
51 | }; |
52 | } |
53 | |