MADARA  3.2.3
Queue.inl
Go to the documentation of this file.
1 
2 #ifndef _MADARA_CONTAINERS_QUEUE_INL_
3 #define _MADARA_CONTAINERS_QUEUE_INL_
4 
5 #include <sstream>
6 
7 #include "Queue.h"
9 
11  const KnowledgeUpdateSettings & settings)
12 : context_ (0), settings_ (settings)
13 {
14 }
15 
17  const std::string & name,
19  const KnowledgeUpdateSettings & settings)
20 : context_ (&(knowledge.get_context ())), name_ (name),
21  count_ (name + ".count", knowledge, 0),
22  head_ (name + ".head", knowledge, 0),
23  tail_ (name + ".tail", knowledge, 0),
24  queue_ (name, knowledge),
25  settings_ (settings)
26 {
27  resize ();
28 }
29 
31  const std::string & name,
33  const KnowledgeUpdateSettings & settings)
34 : context_ (knowledge.get_context ()), name_ (name),
35  count_ (name + ".count", knowledge),
36  head_ (name + ".head", knowledge),
37  tail_ (name + ".tail", knowledge),
38  queue_ (name, knowledge),
39  settings_ (settings)
40 {
41  resize ();
42 }
43 
45  const std::string & name,
47  int size,
48  const KnowledgeUpdateSettings & settings)
49 : context_ (&(knowledge.get_context ())), name_ (name),
50  count_ (name + ".count", knowledge, 0),
51  head_ (name + ".head", knowledge, 0),
52  tail_ (name + ".tail", knowledge, 0),
53  queue_ (name, knowledge, size, false, settings),
54  settings_ (settings)
55 {
56 }
57 
59  const std::string & name,
61  int size,
62  const KnowledgeUpdateSettings & settings)
63 : context_ (knowledge.get_context ()), name_ (name),
64  count_ (name + ".count", knowledge, 0),
65  head_ (name + ".head", knowledge, 0),
66  tail_ (name + ".tail", knowledge, 0),
67  queue_ (name, knowledge, size, false, settings),
68  settings_ (settings)
69 {
70 }
71 
72 
74  : context_ (rhs.context_),
75  name_ (rhs.name_),
76  count_ (rhs.count_),
77  head_ (rhs.head_),
78  tail_ (rhs.tail_),
79  queue_ (rhs.queue_),
80  settings_ (rhs.settings_)
81 {
82 
83 }
84 
85 inline void
87 {
88  if (this != &rhs)
89  {
90  MADARA_GUARD_TYPE guard (mutex_), guard2 (rhs.mutex_);
91 
92  this->context_ = rhs.context_;
93  this->name_ = rhs.name_;
94  this->count_ = rhs.count_;
95  this->head_ = rhs.head_;
96  this->tail_ = rhs.tail_;
97  this->queue_ = rhs.queue_;
98  this->settings_ = rhs.settings_;
99  }
100 }
101 
102 
103 inline bool
105  const Queue & value) const
106 {
107  return name_ == value.get_name ();
108 }
109 
110 inline bool
112  const Queue & value) const
113 {
114  return name_ != value.get_name ();
115 }
116 
117 template<typename... Args>
118 inline bool
120 {
121  return enqueue (KnowledgeRecord (std::forward<Args>(args)...));
122 }
123 
124 inline void
126 {
127  if (context_ && name_ != "" && count_ > 0)
128  {
129  ContextGuard context_guard (*context_);
130  MADARA_GUARD_TYPE guard (mutex_);
131 
132  count_ = 0;
133  head_ = *tail_;
134  }
135 }
136 
139 {
141  if (context_ && name_ != "" &&
142  (KnowledgeRecord::Integer)position < *count_)
143  {
144  ContextGuard context_guard (*context_);
145  MADARA_GUARD_TYPE guard (mutex_);
146 
147  size_t index = (size_t)increment (
148  *head_, (KnowledgeRecord::Integer)position);
149 
150  result = context_->get (queue_.vector_[index], settings_);
151  }
152  return result;
153 }
154 
155 inline std::string
157 {
158  MADARA_GUARD_TYPE guard (mutex_);
159  return name_;
160 }
161 
162 inline size_t
164 {
165  return queue_.size ();
166 }
167 
168 inline size_t
170 {
171  return (size_t)(*count_);
172 }
173 
174 inline void
176 {
177  if (context_)
178  {
179  ContextGuard context_guard (*context_);
180  MADARA_GUARD_TYPE guard (mutex_);
181 
182  queue_.resize (size, false);
183 
185  {
187  }
188  }
189 }
190 
193  const KnowledgeUpdateSettings & settings)
194 {
195  MADARA_GUARD_TYPE guard (mutex_);
196 
197  KnowledgeUpdateSettings old_settings = settings_;
198 
199  settings_ = settings;
200 
201  return old_settings;
202 }
203 
204 inline void
206  uint32_t quality,
207  const KnowledgeReferenceSettings & settings)
208 {
209  if (context_)
210  {
211  ContextGuard context_guard (*context_);
212  MADARA_GUARD_TYPE guard (mutex_);
213  context_->set_quality (name_, quality, true, settings);
214  }
215 }
216 
217 #endif // _MADARA_CONTAINERS_QUEUE_INL_
This class encapsulates an entry in a KnowledgeBase.
bool operator==(const Queue &value) const
Checks for equality.
Definition: Queue.inl:104
Queue(const KnowledgeUpdateSettings &settings=KnowledgeUpdateSettings())
Default constructor.
Definition: Queue.inl:10
void resize(int size=-1)
Resizes the queue.
Definition: Queue.inl:175
bool emplace(Args &&...args)
Enqueues a new record to the end of the queue.
Definition: Queue.inl:119
bool operator!=(const Queue &value) const
Checks for inequality.
Definition: Queue.inl:111
void clear(void)
Clears the queue.
Definition: Queue.inl:125
Integer tail_
Tail of the queue.
Definition: Queue.h:269
size_t count(void)
Returns the number of records in the queue.
Definition: Queue.inl:169
size_t size(void) const
Returns the size of the local vector.
Definition: Vector.cpp:310
std::vector< VariableReference > vector_
Values of the array.
Definition: Vector.h:612
size_t size(void)
Returns the maximum size of the queue.
Definition: Queue.inl:163
Integer count_
Count of elements in queue.
Definition: Queue.h:259
knowledge::KnowledgeRecord::Integer increment(knowledge::KnowledgeRecord::Integer base, knowledge::KnowledgeRecord::Integer value)
Increments the base by the value, using size as a boundary.
Definition: Queue.h:230
void set_quality(uint32_t quality, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings(false))
Sets the quality of writing to the counter variables.
Definition: Queue.inl:205
std::string name_
Prefix of variable.
Definition: Queue.h:254
std::string get_name(void) const
Returns the name of the variable.
Definition: Queue.inl:156
A thread-safe guard for a context or knowledge base.
Definition: ContextGuard.h:23
void resize(int size=-1, bool delete_vars=true)
Resizes the vector.
Definition: Vector.cpp:221
ThreadSafeContext * context_
Variable context that we are modifying.
Definition: Queue.h:249
bool enqueue(const knowledge::KnowledgeRecord &record)
Enqueues a record to the end of the queue.
Definition: Queue.cpp:7
static struct madara::knowledge::tags::string_t string
Vector queue_
Underlying array of records.
Definition: Queue.h:274
knowledge::KnowledgeRecord inspect(size_t position)
Retrieves a record at a position in the queue.
Definition: Queue.inl:138
This class provides a distributed knowledge base to users.
Definition: KnowledgeBase.h:45
Integer head_
Head of the queue.
Definition: Queue.h:264
KnowledgeUpdateSettings settings_
Settings for modifications.
Definition: Queue.h:279
This class stores thread-safe queue within the knowledge base.
Definition: Queue.h:34
Provides functions and classes for the distributed knowledge base.
void operator=(const Queue &rhs)
Assignment operator.
Definition: Queue.inl:86
Settings for applying knowledge updates.
madara::knowledge::KnowledgeRecord get(const std::string &key, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
Atomically returns the value of a variable.
uint32_t set_quality(const std::string &key, uint32_t quality, bool force_update, const KnowledgeReferenceSettings &settings)
Atomically sets quality of this process for a variable.
KnowledgeUpdateSettings set_settings(const KnowledgeUpdateSettings &settings)
Sets the update settings for the variable.
Definition: Queue.inl:192
Settings for applying knowledge updates.
MADARA_LOCK_TYPE mutex_
guard for access and changes
Definition: Queue.h:244
Provides an interface for external functions into the MADARA KaRL variable settings.