MADARA  3.2.3
BaseTracker.h
Go to the documentation of this file.
1 
2 
3 #ifndef INCL_MADARA_RCW_BASE_TRACKER_H
4 #define INCL_MADARA_RCW_BASE_TRACKER_H
5 
14 #include <string>
15 #include <vector>
16 #include <map>
17 #include <list>
18 #include <type_traits>
19 #include <initializer_list>
22 #include "madara/utility/StdInt.h"
23 #include "madara/MadaraExport.h"
29 
30 namespace madara { namespace knowledge { namespace rcw
31 {
33  template<typename T>
34  const T &get_value(const T &t)
35  {
36  return t;
37  }
38 
40  template<typename T>
41  void set_value(T &t, const T &v)
42  {
43  t = v;
44  }
45 
47  template<typename T>
48  auto get_value(const std::vector<T> &t, size_t i) ->
49  decltype(get_value(t[i]))
50  {
51  return get_value(t[i]);
52  }
53 
55  template<typename T, typename V>
56  void set_value(std::vector<T> &t, size_t i, V v)
57  {
58  set_value(t[i], v);
59  }
60 
64  {
65  public:
66  virtual ~BaseTracker() {}
67 
68  private:
71 
73  BaseTracker(VariableReference ref) : ref_(ref) {}
74 
76  virtual void pull() = 0;
78  virtual void push(KnowledgeBase &kb) = 0;
80  virtual void force_push(KnowledgeBase &kb) = 0;
82  virtual const char *get_name() const = 0;
84  virtual const void *get_tracked() const = 0;
85 
87  const KnowledgeRecord &get() const
88  {
89  return get(ref_);
90  }
91 
94  {
95  return get_mut(ref_);
96  }
97 
99  static const KnowledgeRecord &get(const VariableReference &ref)
100  {
101  return *ref.get_record_unsafe();
102  }
103 
106  {
107  return *ref.get_record_unsafe();
108  }
109 
111  template<typename T>
112  void set(KnowledgeBase &kb, T&& val)
113  {
114  return set(kb, ref_, std::forward<T>(val));
115  }
116 
118  template<typename T>
119  static void set(KnowledgeBase &kb, const VariableReference &ref, T&& val)
120  {
121  kb.get_context().set_unsafe(ref, std::forward<T>(val), EvalSettings());
122  }
123 
125  template<typename I>
126  auto set_index(KnowledgeBase &kb, size_t idx, I val) ->
127  typename std::enable_if<std::is_integral<I>::value>::type
128  {
129  kb.get_context().set_index_unsafe_impl(ref_, idx, val, EvalSettings());
130  }
131 
133  template<typename I>
134  auto set_index(KnowledgeBase &kb, size_t idx, I val) ->
135  typename std::enable_if<std::is_floating_point<I>::value>::type
136  {
137  kb.get_context().set_index_unsafe_impl(ref_, idx, val, EvalSettings());
138  }
139 
142  {
143  post_set(kb, ref_);
144  }
145 
148  {
150  }
151 
152  friend class Transaction;
153 
154  template<class, class, bool, bool, class>
155  friend class Tracker;
156 
157  template<class, class, bool, bool, class>
158  friend class PrefixTracker;
159  };
160 
163 
166 
169 
171  MADARA_MAKE_SUPPORT_TEST(indexed_is_dirty, p, (is_dirty(*p, 0), clear_dirty(*p, 0)));
172 
175 
177  MADARA_MAKE_SUPPORT_TEST(indexed_get_value, p, (set_value(*p, 0, get_value(*p, 0))));
178 
180  MADARA_MAKE_SUPPORT_TEST(const_iter, p, (p->cbegin(), p->cend()));
181 
183  MADARA_MAKE_SUPPORT_TEST(size, p, (p->size()));
184 
188  knowledge_cast<typename std::decay<decltype(get_value(*p))>::type>(
189  std::declval<KnowledgeRecord>())));
190 
192  MADARA_MAKE_SUPPORT_TEST(self_eq, p, (
193  get_value(*p) == get_value(*p),
194  get_value(*p) != get_value(*p)));
195 } } } // end namespace madara::knowledge::rcw
196 
197 #endif // INCL_MADARA_RCW_BASE_TRACKER_H
This class encapsulates an entry in a KnowledgeBase.
MADARA_MAKE_SUPPORT_TEST(is_dirty, p,(is_dirty(*p), clear_dirty(*p)))
Trait to test for an is_dirty overload for a given type.
helper type for specifying template type parameters using a function argument instead of inside expli...
Definition: KnowledgeCast.h:72
auto set_index(KnowledgeBase &kb, size_t idx, I val) -> typename std::enable_if< std::is_integral< I >::value >::type
Set index in record points to. No locking, so be careful!
Definition: BaseTracker.h:126
bool is_size_dirty(const Tracked< std::vector< T >> &t)
Return size changed dirty flag of Tracked vector.
Definition: Tracked.h:836
void mark_and_signal(VariableReference ref, const KnowledgeUpdateSettings &settings=KnowledgeUpdateSettings())
method for marking a record modified and signaling changes
Manages a Read-Compute-Write cycle for registered variables.
Definition: Transaction.h:43
VariableReference ref_
Reference to tracked variable.
Definition: BaseTracker.h:70
KnowledgeRecord * get_record_unsafe(void) const
Returns a pointer to the variable&#39;s KnowledgeRecord Do not use this pointer unless you&#39;ve locked the ...
KnowledgeRecord & get_mut()
Get record points to. No locking, so be careful!
Definition: BaseTracker.h:93
BaseTracker(VariableReference ref)
Constructor from a VariableReference.
Definition: BaseTracker.h:73
Base type for Trackers.
Definition: BaseTracker.h:63
auto set_index(KnowledgeBase &kb, size_t idx, I val) -> typename std::enable_if< std::is_floating_point< I >::value >::type
Set index in record points to. No locking, so be careful!
Definition: BaseTracker.h:134
virtual void force_push(KnowledgeBase &kb)=0
As push, but ignore any modification status tracking.
Optimized reference to a variable within the knowledge base.
bool is_dirty(const Tracked< T > &t)
Returns dirty flag of Tracked types.
Definition: Tracked.h:533
virtual const char * get_name() const =0
Get name of MADARA variable.
void post_set(KnowledgeBase &kb, const VariableReference &ref)
Call after setting to perform any necessary after-setting logic.
Definition: BaseTracker.h:147
virtual const void * get_tracked() const =0
Get pointer to tracked object.
virtual void push(KnowledgeBase &kb)=0
Override to implement pushing logic (into ref_)
bool is_all_dirty(const Tracked< std::vector< T >> &t)
Return global dirty flag of Tracked vector.
Definition: Tracked.h:829
void clear_dirty(Tracked< T > &t)
Clears dirty flag of Tracked types.
Definition: Tracked.h:540
This class provides a distributed knowledge base to users.
Definition: KnowledgeBase.h:45
Tracker which puts variable values into a single KnowledgeRecord.
Definition: Tracker.h:34
Tracker that puts values into a multiple prefixed KnowledgeRecord.
Definition: PrefixTracker.h:35
const T & get_value(const T &t)
Fallback definition of get_value; simply passes through the value.
Definition: BaseTracker.h:34
ThreadSafeContext & get_context(void)
Returns the ThreadSafeContext associated with this Knowledge Base.
Encapsulates settings for an evaluation statement.
Definition: EvalSettings.h:27
Provides functions and classes for the distributed knowledge base.
Out knowledge_cast(const KnowledgeRecord &in)
Convert a KnowledgeRecord into a specified type.
static KnowledgeRecord & get_mut(const VariableReference &ref)
Get record points to. No locking, so be careful!
Definition: BaseTracker.h:105
void set_value(T &t, const T &v)
Fallback definition of set_value; simply passes through the value.
Definition: BaseTracker.h:41
Copyright (c) 2015 Carnegie Mellon University.
virtual void pull()=0
Override to implement pulling logic (from ref_)
void post_set(KnowledgeBase &kb)
Call after setting to perform any necessary after-setting logic.
Definition: BaseTracker.h:141