Viskores  1.0
TaskQueue.h
Go to the documentation of this file.
1 //============================================================================
2 // The contents of this file are covered by the Viskores license. See
3 // LICENSE.txt for details.
4 //
5 // By contributing to this file, all contributors agree to the Developer
6 // Certificate of Origin Version 1.1 (DCO 1.1) as stated in DCO.txt.
7 //============================================================================
8 
9 //============================================================================
10 // Copyright (c) Kitware, Inc.
11 // All rights reserved.
12 // See LICENSE.txt for details.
13 //
14 // This software is distributed WITHOUT ANY WARRANTY; without even
15 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
16 // PURPOSE. See the above copyright notice for more information.
17 //============================================================================
18 #ifndef viskores_filter_TaskQueue_h
19 #define viskores_filter_TaskQueue_h
20 
21 #include <queue>
22 
23 namespace viskores
24 {
25 namespace filter
26 {
27 
28 template <typename T>
29 class TaskQueue
30 {
31 public:
32  TaskQueue() = default;
33 
34  //Add a task to the Queue.
35  void Push(T&& item)
36  {
37  std::unique_lock<std::mutex> lock(this->Lock);
38  this->Queue.push(item);
39  }
40 
41  bool HasTasks()
42  {
43  std::unique_lock<std::mutex> lock(this->Lock);
44  return !(this->Queue.empty());
45  }
46 
47  bool GetTask(T& item)
48  {
49  std::unique_lock<std::mutex> lock(this->Lock);
50  if (this->Queue.empty())
51  return false;
52 
53  item = this->Queue.front();
54  this->Queue.pop();
55  return true;
56  }
57 
58  T Pop()
59  {
60  T item;
61  std::unique_lock<std::mutex> lock(this->Lock);
62  if (!this->Queue.empty())
63  {
64  item = this->Queue.front();
65  this->Queue.pop();
66  }
67 
68  return item;
69  }
70 
71 protected:
73  {
74  std::unique_lock<std::mutex> lock(this->Lock);
75  return static_cast<viskores::Id>(this->Queue.size());
76  }
77 
78 private:
79  std::mutex Lock;
80  std::queue<T> Queue;
81 
82  //don't want copies of this
83  TaskQueue(const TaskQueue& rhs) = delete;
84  TaskQueue& operator=(const TaskQueue& rhs) = delete;
85  TaskQueue(TaskQueue&& rhs) = delete;
86  TaskQueue& operator=(TaskQueue&& rhs) = delete;
87 };
88 
89 
90 class DataSetQueue : public TaskQueue<std::pair<viskores::Id, viskores::cont::DataSet>>
91 {
92 public:
94  {
95  viskores::Id idx = 0;
96  for (auto ds : input)
97  this->Push(std::make_pair(idx++, std::move(ds)));
98  }
99 
101 
103  {
105  viskores::Id num = this->Length();
106 
107  if (num > 0)
108  {
109  std::vector<viskores::cont::DataSet> dataSets(static_cast<std::size_t>(num));
110 
111  //Insert them back in the same order.
112  std::pair<viskores::Id, viskores::cont::DataSet> task;
113  while (this->GetTask(task))
114  {
115  dataSets[static_cast<std::size_t>(task.first)] = std::move(task.second);
116  }
117 
118  pds.AppendPartitions(dataSets);
119  }
120 
121  return pds;
122  }
123 
124 private:
125 };
126 
127 }
128 }
129 
130 #endif
viskores::filter::DataSetQueue::DataSetQueue
DataSetQueue()
Definition: TaskQueue.h:100
viskores::filter::DataSetQueue::Get
viskores::cont::PartitionedDataSet Get()
Definition: TaskQueue.h:102
viskores::filter::TaskQueue::Lock
std::mutex Lock
Definition: TaskQueue.h:79
viskores::filter::TaskQueue::Length
viskores::Id Length()
Definition: TaskQueue.h:72
viskores::Id
viskores::Int64 Id
Base type to use to index arrays.
Definition: Types.h:235
viskores
Groups connected points that have the same field value.
Definition: Atomic.h:27
viskores::filter::DataSetQueue
Definition: TaskQueue.h:90
viskores::filter::TaskQueue::TaskQueue
TaskQueue()=default
viskores::cont::PartitionedDataSet::AppendPartitions
void AppendPartitions(const std::vector< viskores::cont::DataSet > &partitions)
Append the DataSet vector partitions to the end of list of partitions.
viskores::filter::TaskQueue::Queue
std::queue< T > Queue
Definition: TaskQueue.h:80
viskores::cont::PartitionedDataSet
Comprises a set of viskores::cont::DataSet objects.
Definition: PartitionedDataSet.h:34
viskores::filter::TaskQueue::HasTasks
bool HasTasks()
Definition: TaskQueue.h:41
viskores::filter::TaskQueue::operator=
TaskQueue & operator=(const TaskQueue &rhs)=delete
viskores::filter::TaskQueue::Pop
T Pop()
Definition: TaskQueue.h:58
viskores::filter::TaskQueue::Push
void Push(T &&item)
Definition: TaskQueue.h:35
viskores::filter::TaskQueue::GetTask
bool GetTask(T &item)
Definition: TaskQueue.h:47
viskores::filter::DataSetQueue::DataSetQueue
DataSetQueue(const viskores::cont::PartitionedDataSet &input)
Definition: TaskQueue.h:93
viskores::filter::TaskQueue
Definition: TaskQueue.h:29