MADARA  3.4.1
KnowledgeBase.h
Go to the documentation of this file.
1 #ifndef _MADARA_KNOWLEDGE_BASE_H
2 #define _MADARA_KNOWLEDGE_BASE_H
3 
11 #include <ostream>
12 #include <string>
13 #include <map>
14 #include <memory>
15 
20 #include "madara/MadaraExport.h"
30 
31 #ifdef _MADARA_PYTHON_CALLBACKS_
32 #include "madara/Boost.h"
33 #include "boost/python/object.hpp"
34 #endif
35 
36 namespace madara
37 {
38 namespace knowledge
39 {
44 class MADARA_EXPORT KnowledgeBase
45 {
46 public:
50  KnowledgeBase();
51 
57  KnowledgeBase(const std::string& host, int transport);
58 
66  const std::string& host, int transport, const std::string& domain);
67 
73  KnowledgeBase(const std::string& host,
75 
80  KnowledgeBase(const KnowledgeBase& original) = default;
81 
86  void use(ThreadSafeContext& original);
87 
91  ~KnowledgeBase() = default;
92 
103  void copy(const KnowledgeBase& source, const KnowledgeRequirements& reqs,
104  const EvalSettings& settings = EvalSettings());
105 
126  void copy(const KnowledgeBase& source, const CopySet& copy_set = CopySet(),
127  bool clean_copy = false, const EvalSettings& settings = EvalSettings());
128 
133  KnowledgeBase& operator=(const KnowledgeBase& original) = default;
134 
138  void activate_transport(void);
139 
143  void close_transport(void);
144 
149  size_t get_num_transports(void);
150 
154  void lock(void);
155 
160  void unlock(void);
161 
170  false));
171 
181  false));
182 
191  VariableReference get_ref(const std::string& key,
193  false));
194 
199  std::shared_ptr<const std::string> share_string(
200  const std::string& key, const KnowledgeReferenceSettings& settings =
202  {
203  if (impl_)
204  {
205  return impl_->share_string(key, settings);
206  }
207  else if (context_)
208  {
209  return context_->share_string(key, settings);
210  }
211 
212  return nullptr;
213  }
214 
219  std::shared_ptr<const std::string> share_string(
220  const VariableReference& key, const KnowledgeReferenceSettings& settings =
222  {
223  if (impl_)
224  {
225  return impl_->share_string(key, settings);
226  }
227  else if (context_)
228  {
229  return context_->share_string(key, settings);
230  }
231 
232  return nullptr;
233  }
234 
239  std::shared_ptr<const std::vector<KnowledgeRecord::Integer>> share_integers(
240  const std::string& key, const KnowledgeReferenceSettings& settings =
242  {
243  if (impl_)
244  {
245  return impl_->share_integers(key, settings);
246  }
247  else if (context_)
248  {
249  return context_->share_integers(key, settings);
250  }
251 
252  return nullptr;
253  }
254 
259  std::shared_ptr<const std::vector<KnowledgeRecord::Integer>> share_integers(
260  const VariableReference& key, const KnowledgeReferenceSettings& settings =
262  {
263  if (impl_)
264  {
265  return impl_->share_integers(key, settings);
266  }
267  else if (context_)
268  {
269  return context_->share_integers(key, settings);
270  }
271 
272  return nullptr;
273  }
274 
279  std::shared_ptr<const std::vector<double>> share_doubles(
280  const std::string& key, const KnowledgeReferenceSettings& settings =
282  {
283  if (impl_)
284  {
285  return impl_->share_doubles(key, settings);
286  }
287  else if (context_)
288  {
289  return context_->share_doubles(key, settings);
290  }
291 
292  return nullptr;
293  }
294 
299  std::shared_ptr<const std::vector<double>> share_doubles(
300  const VariableReference& key, const KnowledgeReferenceSettings& settings =
302  {
303  if (impl_)
304  {
305  return impl_->share_doubles(key, settings);
306  }
307  else if (context_)
308  {
309  return context_->share_doubles(key, settings);
310  }
311 
312  return nullptr;
313  }
314 
319  std::shared_ptr<const std::vector<unsigned char>> share_binary(
320  const std::string& key, const KnowledgeReferenceSettings& settings =
322  {
323  if (impl_)
324  {
325  return impl_->share_binary(key, settings);
326  }
327  else if (context_)
328  {
329  return context_->share_binary(key, settings);
330  }
331 
332  return nullptr;
333  }
334 
339  std::shared_ptr<const std::vector<unsigned char>> share_binary(
340  const VariableReference& key, const KnowledgeReferenceSettings& settings =
342  {
343  if (impl_)
344  {
345  return impl_->share_binary(key, settings);
346  }
347  else if (context_)
348  {
349  return context_->share_binary(key, settings);
350  }
351 
352  return nullptr;
353  }
354 
360  void mark_modified(const VariableReference& variable,
362 
368  void mark_modified(const std::string& name,
370 
378  madara::knowledge::KnowledgeRecord retrieve_index(const std::string& key,
379  size_t index,
381  false));
382 
389  int read_file(const std::string& knowledge_key, const std::string& filename,
390  const EvalSettings& settings = EvalSettings(
391  true, false, true, false, false));
392 
400  int read_file(const VariableReference& variable, const std::string& filename,
401  const EvalSettings& settings = EvalSettings(
402  true, false, true, false, false));
403 
411  int set(const VariableReference& variable, const std::string& value,
412  const EvalSettings& settings = EvalSettings(
413  true, false, true, false, false));
414 
422  int set(const VariableReference& variable, std::string&& value,
423  const EvalSettings& settings = EvalSettings(
424  true, false, true, false, false));
425 
433  int set(const VariableReference& variable, const KnowledgeRecord& value,
434  const EvalSettings& settings = EvalSettings(
435  true, false, true, false, false));
436 
444  int set(const VariableReference& variable, KnowledgeRecord&& value,
445  const EvalSettings& settings = EvalSettings(
446  true, false, true, false, false));
447 
455  int set(const std::string& key, const KnowledgeRecord& value,
456  const EvalSettings& settings = EvalSettings(
457  true, false, true, false, false));
458 
466  int set(const std::string& key, KnowledgeRecord&& value,
467  const EvalSettings& settings = EvalSettings(
468  true, false, true, false, false));
469 
476  int set(const VariableReference& variable,
477  const EvalSettings& settings = EvalSettings(
478  true, false, true, false, false))
479  {
480  return set(variable, 1, settings);
481  }
482 
490  int set(const VariableReference& variable, const std::vector<double>& value,
491  const EvalSettings& settings = EvalSettings(
492  true, false, true, false, false));
493 
501  int set(const VariableReference& variable, std::vector<double>&& value,
502  const EvalSettings& settings = EvalSettings(
503  true, false, true, false, false));
504 
513  int set(const VariableReference& variable, const double* value, uint32_t size,
514  const EvalSettings& settings = EvalSettings(
515  true, false, true, false, false));
516 
525  template<typename T>
526  int set_index(const VariableReference& variable, size_t index, T&& value,
527  const EvalSettings& settings = EvalSettings(
528  true, false, true, false, false));
529 
537  template<typename T, typename std::enable_if<std::is_floating_point<T>::value,
538  void*>::type = nullptr>
539  int set(const VariableReference& variable, T value,
540  const EvalSettings& settings = EvalSettings(
541  true, false, true, false, false));
542 
550  int set(const VariableReference& variable,
551  const std::vector<KnowledgeRecord::Integer>& value,
552  const EvalSettings& settings = EvalSettings(
553  true, false, true, false, false));
554 
562  int set(const VariableReference& variable,
563  std::vector<KnowledgeRecord::Integer>&& value,
564  const EvalSettings& settings = EvalSettings(
565  true, false, true, false, false));
566 
575  int set(const VariableReference& variable,
576  const madara::knowledge::KnowledgeRecord::Integer* value, uint32_t size,
577  const EvalSettings& settings = EvalSettings(
578  true, false, true, false, false));
579 
587  template<typename T, typename std::enable_if<std::is_integral<T>::value,
588  void*>::type = nullptr>
589  int set(const VariableReference& variable, T value,
590  const EvalSettings& settings = EvalSettings(
591  true, false, true, false, false));
592 
601  int set_text(const VariableReference& variable, const char* value,
602  size_t size,
603  const EvalSettings& settings = EvalSettings(
604  true, false, true, false, false));
605 
614  int set_file(const std::string& key, const unsigned char* value, size_t size,
615  const EvalSettings& settings = EvalSettings(
616  true, false, true, false, false));
617 
626  int set_jpeg(const std::string& key, const unsigned char* value, size_t size,
627  const EvalSettings& settings = EvalSettings(
628  true, false, true, false, false));
629 
638  int set_file(const VariableReference& variable, const unsigned char* value,
639  size_t size,
640  const EvalSettings& settings = EvalSettings(
641  true, false, true, false, false));
642 
651  int set_jpeg(const VariableReference& variable, const unsigned char* value,
652  size_t size,
653  const EvalSettings& settings = EvalSettings(
654  true, false, true, false, false));
655 
664  int set_xml(const VariableReference& variable, const char* value, size_t size,
665  const EvalSettings& settings = EvalSettings(
666  true, false, true, false, false));
667 
675  madara::knowledge::KnowledgeRecord retrieve_index(
676  const VariableReference& variable, size_t index,
677  const KnowledgeReferenceSettings& settings = EvalSettings(
678  true, false, true, false, false));
679 
685  ssize_t write_file(
686  const std::string& knowledge_key, const std::string& filename);
687 
696  std::string expand_statement(const std::string& statement);
697 
703  std::string debug_modifieds(void) const;
704 
705 #ifndef _MADARA_NO_KARL_
706 
714  CompiledExpression compile(const std::string& expression);
715 
724  madara::knowledge::KnowledgeRecord evaluate(const std::string& expression,
725  const EvalSettings& settings = EvalSettings());
726 
736  const EvalSettings& settings = EvalSettings());
737 
747  const EvalSettings& settings = EvalSettings());
748 
759  madara::knowledge::KnowledgeRecord wait(const std::string& expression,
760  const WaitSettings& settings = WaitSettings());
761 
773  const WaitSettings& settings = WaitSettings());
774 
780  void define_function(const std::string& name,
782 
789  void define_function(
790  const std::string& name, knowledge::KnowledgeRecord (*func)(const char*,
792 
793 #ifdef _MADARA_JAVA_
799  void define_function(const std::string& name, jobject callable);
800 #endif
801 
802 #ifdef _MADARA_PYTHON_CALLBACKS_
808  void define_function(const std::string& name, boost::python::object callable);
809 #endif
810 
816  void define_function(const std::string& name, const std::string& expression);
817 
823  void define_function(
824  const std::string& name, const CompiledExpression& expression);
825 
826 #endif // _MADARA_NO_KARL_
827 
837  template<typename T, typename std::enable_if<std::is_integral<T>::value,
838  void*>::type = nullptr>
839  int set(const std::string& key, T value,
840  const EvalSettings& settings = EvalSettings(
841  true, false, true, false, false));
842 
853  template<typename T>
854  int set_index(const std::string& key, size_t index, T&& value,
855  const EvalSettings& settings = EvalSettings(
856  true, false, true, false, false));
857 
868  int set(const std::string& key,
869  const madara::knowledge::KnowledgeRecord::Integer* value, uint32_t size,
870  const EvalSettings& settings = EvalSettings(
871  true, false, true, false, false));
872 
882  int set(const std::string& key,
883  const std::vector<KnowledgeRecord::Integer>& value,
884  const EvalSettings& settings = EvalSettings(
885  true, false, true, false, false));
886 
896  int set(const std::string& key, std::vector<KnowledgeRecord::Integer>&& value,
897  const EvalSettings& settings = EvalSettings(
898  true, false, true, false, false));
899 
906  int set(const std::string& key, const EvalSettings& settings = EvalSettings(
907  true, false, true, false, false))
908  {
909  return set(key, 1, settings);
910  }
911 
921  template<typename T, typename std::enable_if<std::is_floating_point<T>::value,
922  void*>::type = nullptr>
923  int set(const std::string& key, T value,
924  const EvalSettings& settings = EvalSettings(
925  true, false, true, false, false));
926 
937  int set(const std::string& key, const double* value, uint32_t size,
938  const EvalSettings& settings = EvalSettings(
939  true, false, true, false, false));
940 
950  int set(const std::string& key, const std::vector<double>& value,
951  const EvalSettings& settings = EvalSettings(
952  true, false, true, false, false));
953 
963  int set(const std::string& key, std::vector<double>&& value,
964  const EvalSettings& settings = EvalSettings(
965  true, false, true, false, false));
966 
976  int set(const std::string& key, const std::string& value,
977  const EvalSettings& settings = EvalSettings(
978  true, false, true, false, false));
979 
989  int set(const std::string& key, std::string&& value,
990  const EvalSettings& settings = EvalSettings(
991  true, false, true, false, false));
992 
1000  void set_quality(const std::string& key, uint32_t quality,
1002  false));
1003 
1013  std::string setup_unique_hostport(const std::string& host = "");
1014 
1019  madara::transport::TransportSettings& transport_settings(void);
1020 
1028  bool exists(const std::string& key,
1030  false)) const;
1031 
1039  bool exists(const VariableReference& variable,
1041  false)) const;
1042 
1049  int apply_modified(const EvalSettings& settings = EvalSettings());
1050 
1056  int modify(const EvalSettings& settings = EvalSettings());
1057 
1062  void print(unsigned int level = 0) const;
1063 
1069  void print_knowledge(unsigned int level = 0) const;
1070 
1079  void print(const std::string& statement, unsigned int level = 0) const;
1080 
1103  void to_string(std::string& target, const std::string& array_delimiter = ",",
1104  const std::string& record_delimiter = ";\n",
1105  const std::string& key_val_delimiter = "=") const;
1106 
1116  bool clear(
1117  const std::string& key, const KnowledgeReferenceSettings& settings =
1119 
1125  void clear(bool erase = false);
1126 
1130  void reset_checkpoint(void) const;
1131 
1135  void clear_map(void);
1136 
1142  void acquire(void);
1143 
1149  void release(void);
1150 
1158  size_t attach_transport(madara::transport::Base* transport);
1159 
1167  size_t attach_transport(
1168  const std::string& id, transport::TransportSettings& settings);
1169 
1176  size_t remove_transport(size_t index);
1177 
1184  ThreadSafeContext& get_context(void);
1185 
1192  const ThreadSafeContext& get_context(void) const;
1193 
1198  int get_log_level(void);
1199 
1204  void attach_logger(logger::Logger& logger) const;
1205 
1210  logger::Logger& get_logger(void) const;
1211 
1216  void set_log_level(int level);
1217 
1222  std::string get_id(void);
1223 
1231  void get_matches(const std::string& prefix, const std::string& suffix,
1232  VariableReferences& matches);
1233 
1248  size_t to_vector(const std::string& subject, unsigned int start,
1249  unsigned int end, std::vector<KnowledgeRecord>& target);
1250 
1261  size_t to_map(const std::string& subject,
1262  std::map<std::string, knowledge::KnowledgeRecord>& target);
1263 
1280  size_t to_map(const std::string& prefix, const std::string& delimiter,
1281  const std::string& suffix, std::vector<std::string>& next_keys,
1282  std::map<std::string, knowledge::KnowledgeRecord>& result,
1283  bool just_keys = false);
1284 
1293  knowledge::KnowledgeMap to_map(const std::string& prefix) const;
1294 
1306  knowledge::KnowledgeMap to_map_stripped(const std::string& prefix) const;
1307 
1314  int64_t save_context(const std::string& filename) const;
1315 
1324  int64_t save_context(CheckpointSettings& settings) const;
1325 
1331  int64_t save_as_json(const std::string& filename) const;
1332 
1338  int64_t save_as_json(const CheckpointSettings& settings) const;
1339 
1345  int64_t save_as_karl(const std::string& filename) const;
1346 
1352  int64_t save_as_karl(const CheckpointSettings& settings) const;
1353 
1362  int64_t save_checkpoint(
1363  const std::string& filename, bool reset_modifieds = true);
1364 
1374  int64_t save_checkpoint(CheckpointSettings& settings) const;
1375 
1385  std::unique_ptr<BaseStreamer> attach_streamer(
1386  std::unique_ptr<BaseStreamer> streamer)
1387  {
1388  if (impl_)
1389  {
1390  return impl_->attach_streamer(std::move(streamer));
1391  }
1392  else
1393  {
1394  return context_->attach_streamer(std::move(streamer));
1395  }
1396  throw_null_context();
1397  }
1398 
1409  int64_t load_context(const std::string& filename, bool use_id = true,
1411  true, true, true, false));
1412 
1427  int64_t load_context(const std::string& filename, FileHeader& meta,
1428  bool use_id = true,
1430  true, true, true, false));
1431 
1441  int64_t load_context(CheckpointSettings& checkpoint_settings,
1442  const KnowledgeUpdateSettings& update_settings = KnowledgeUpdateSettings(
1443  true, true, true, false));
1444 
1452  KnowledgeRecord evaluate_file(CheckpointSettings& checkpoint_settings,
1453  const KnowledgeUpdateSettings& update_settings = KnowledgeUpdateSettings(
1454  true, true, true, false));
1455 
1461  std::string file_to_string(CheckpointSettings& checkpoint_settings);
1462 
1467  void add_modifieds(const VariableReferences& modifieds) const;
1468 
1477  VariableReferences save_modifieds(void) const;
1478 
1486  int send_modifieds(
1487  const std::string& prefix = "KnowledgeBase::send_modifieds",
1488  const EvalSettings& settings = EvalSettings::SEND);
1489 
1497  void clear_modifieds(void);
1498 
1502  void wait_for_change(void);
1503 
1511  void facade_for(ThreadSafeContext& target);
1512 
1513 private:
1514  [[noreturn]] void throw_null_context() const {
1516  "KnowledgeBase as no context or impl set");
1517  }
1518 
1519 public :
1520 
1521  template<typename Callable>
1522  auto invoke(const std::string& key, Callable&& callable,
1523  const EvalSettings& settings = EvalSettings())
1524  -> decltype(utility::invoke_(
1525  std::forward<Callable>(callable), std::declval<KnowledgeRecord&>()))
1526  {
1527  if (impl_.get())
1528  {
1529  return impl_->invoke(key, std::forward<Callable>(callable), settings);
1530  }
1531  else if (context_)
1532  {
1533  return context_->invoke(key, std::forward<Callable>(callable), settings);
1534  }
1535  throw_null_context();
1536  }
1537 
1538  template<typename Callable>
1539  auto invoke(VariableReference key, Callable&& callable,
1540  const EvalSettings& settings = EvalSettings())
1541  -> decltype(utility::invoke_(
1542  std::forward<Callable>(callable), std::declval<KnowledgeRecord&>()))
1543  {
1544  if (impl_.get())
1545  {
1546  return impl_->invoke(key, std::forward<Callable>(callable), settings);
1547  }
1548  else if (context_)
1549  {
1550  return context_->invoke(key, std::forward<Callable>(callable), settings);
1551  }
1552  throw_null_context();
1553  }
1554 
1555  template<typename Callable>
1556  auto invoke(const std::string& key, Callable&& callable,
1558  const -> decltype(utility::invoke_(
1559  std::forward<Callable>(callable), std::declval<KnowledgeRecord&>()))
1560  {
1561  if (impl_.get())
1562  {
1563  return impl_->invoke(key, std::forward<Callable>(callable), settings);
1564  }
1565  else if (context_)
1566  {
1567  return context_->invoke(key, std::forward<Callable>(callable), settings);
1568  }
1569  throw_null_context();
1570  }
1571 
1572  template<typename Callable>
1573  auto invoke(const VariableReference& key, Callable&& callable,
1575  const -> decltype(utility::invoke_(
1576  std::forward<Callable>(callable), std::declval<KnowledgeRecord&>()))
1577  {
1578  if (impl_.get())
1579  {
1580  return impl_->invoke(key, std::forward<Callable>(callable), settings);
1581  }
1582  else if (context_)
1583  {
1584  return context_->invoke(key, std::forward<Callable>(callable), settings);
1585  }
1586  throw_null_context();
1587  }
1588 
1589  template<typename Callable>
1590  auto cinvoke(const std::string& key, Callable&& callable,
1592  const -> decltype(utility::invoke_(
1593  std::forward<Callable>(callable), std::declval<KnowledgeRecord&>()))
1594  {
1595  if (impl_.get())
1596  {
1597  return impl_->cinvoke(key, std::forward<Callable>(callable), settings);
1598  }
1599  else if (context_)
1600  {
1601  return context_->cinvoke(key, std::forward<Callable>(callable), settings);
1602  }
1603  throw_null_context();
1604  }
1605 
1606  template<typename Callable>
1607  auto cinvoke(const VariableReference& key, Callable&& callable,
1609  const -> decltype(utility::invoke_(
1610  std::forward<Callable>(callable), std::declval<KnowledgeRecord&>()))
1611  {
1612  if (impl_.get())
1613  {
1614  return impl_->cinvoke(key, std::forward<Callable>(callable), settings);
1615  }
1616  else if (context_)
1617  {
1618  return context_->cinvoke(key, std::forward<Callable>(callable), settings);
1619  }
1620  throw_null_context();
1621  }
1622 
1628  const std::string& key, const KnowledgeReferenceSettings& settings =
1630  {
1631  return invoke(key, &KnowledgeRecord::has_history, settings);
1632  }
1633 
1638  const std::string& key, const KnowledgeReferenceSettings& settings =
1640  {
1641  return invoke(key, &KnowledgeRecord::get_history_size, settings);
1642  }
1643 
1649  const std::string& key, const KnowledgeReferenceSettings& settings =
1651  {
1652  return invoke(key, &KnowledgeRecord::get_history_capacity, settings);
1653  }
1654 
1661  void set_history_capacity(const std::string& key, size_t size,
1662  const EvalSettings& settings = EvalSettings())
1663  {
1664  return invoke(key,
1665  [&](KnowledgeRecord& ref) { return ref.set_history_capacity(size); },
1666  settings);
1667  }
1668 
1673  const std::string& key, const EvalSettings& settings = EvalSettings())
1674  {
1675  return invoke(key, &KnowledgeRecord::clear_history, settings);
1676  }
1677 
1682  template<typename OutputIterator>
1683  size_t get_oldest(const std::string& key, OutputIterator out, size_t count,
1684  const KnowledgeReferenceSettings& settings =
1686  {
1687  return invoke(key,
1688  [&](const KnowledgeRecord& ref) { return ref.get_oldest(out, count); },
1689  settings);
1690  }
1691 
1697  template<typename OutputIterator, typename ConstOutputIterator>
1698  auto get_oldest(const std::string& key, OutputIterator out,
1699  ConstOutputIterator out_end,
1700  const KnowledgeReferenceSettings& settings =
1702  -> utility::enable_if_<!std::is_arithmetic<ConstOutputIterator>::value, size_t>
1703  {
1704  return invoke(key,
1705  [&](const KnowledgeRecord& ref) {
1706  return ref.get_oldest(out, out_end);
1707  },
1708  settings);
1709  }
1710 
1715  template<typename OutputIterator>
1716  auto get_oldest(const std::string& key, OutputIterator out,
1717  const KnowledgeReferenceSettings& settings =
1718  KnowledgeReferenceSettings()) const -> decltype(*out, size_t{})
1719  {
1720  return invoke(key,
1721  [&](const KnowledgeRecord& ref) { return ref.get_oldest(out); },
1722  settings);
1723  }
1724 
1729  template<typename OutputIterator>
1730  size_t get_newest(const std::string& key, OutputIterator out, size_t count,
1731  const KnowledgeReferenceSettings& settings =
1733  {
1734  return invoke(key,
1735  [&](const KnowledgeRecord& ref) { return ref.get_newest(out, count); },
1736  settings);
1737  }
1738 
1744  template<typename OutputIterator, typename ConstOutputIterator>
1745  auto get_newest(const std::string& key, OutputIterator out,
1746  ConstOutputIterator out_end,
1747  const KnowledgeReferenceSettings& settings =
1749  -> utility::enable_if_<!std::is_arithmetic<ConstOutputIterator>::value, size_t>
1750  {
1751  return invoke(key,
1752  [&](const KnowledgeRecord& ref) {
1753  return ref.get_newest(out, out_end);
1754  },
1755  settings);
1756  }
1757 
1762  template<typename OutputIterator>
1763  auto get_newest(const std::string& key, OutputIterator out,
1764  const KnowledgeReferenceSettings& settings =
1765  KnowledgeReferenceSettings()) const -> decltype(*out, size_t{})
1766  {
1767  return invoke(key,
1768  [&](const KnowledgeRecord& ref) { return ref.get_newest(out); },
1769  settings);
1770  }
1771 
1776  const std::string& key, const KnowledgeReferenceSettings& settings =
1778  {
1779  return invoke(key,
1780  [&](const KnowledgeRecord& ref) { return ref.get_oldest(); }, settings);
1781  }
1782 
1787  template<typename T>
1789  const std::string& key, const KnowledgeReferenceSettings& settings =
1791  {
1792  return invoke(key,
1793  [&](const KnowledgeRecord& ref) { return ref.get_oldest<T>(); },
1794  settings);
1795  }
1796 
1801  const std::string& key, const KnowledgeReferenceSettings& settings =
1803  {
1804  return invoke(key,
1805  [&](const KnowledgeRecord& ref) { return ref.get_newest(); }, settings);
1806  }
1807 
1812  template<typename T>
1814  const std::string& key, const KnowledgeReferenceSettings& settings =
1816  {
1817  return invoke(key,
1818  [&](const KnowledgeRecord& ref) { return ref.get_newest<T>(); },
1819  settings);
1820  }
1821 
1826  std::vector<KnowledgeRecord> get_oldest(const std::string& key, size_t count,
1827  const KnowledgeReferenceSettings& settings =
1829  {
1830  return invoke(key,
1831  [&](const KnowledgeRecord& ref) { return ref.get_oldest(count); },
1832  settings);
1833  }
1834 
1840  template<typename T>
1841  std::vector<T> get_oldest(const std::string& key, size_t count,
1842  const KnowledgeReferenceSettings& settings =
1844  {
1845  return invoke(key,
1846  [&](const KnowledgeRecord& ref) { return ref.get_oldest<T>(count); },
1847  settings);
1848  }
1849 
1854  std::vector<KnowledgeRecord> get_newest(const std::string& key, size_t count,
1855  const KnowledgeReferenceSettings& settings =
1857  {
1858  return invoke(key,
1859  [&](const KnowledgeRecord& ref) { return ref.get_newest(count); },
1860  settings);
1861  }
1862 
1868  template<typename T>
1869  std::vector<T> get_newest(const std::string& key, size_t count,
1870  const KnowledgeReferenceSettings& settings =
1872  {
1873  return invoke(key,
1874  [&](const KnowledgeRecord& ref) { return ref.get_newest<T>(count); },
1875  settings);
1876  }
1877 
1881  std::vector<KnowledgeRecord> get_history(
1882  const std::string& key, const KnowledgeReferenceSettings& settings =
1884  {
1885  return invoke(key,
1886  [&](const KnowledgeRecord& ref) { return ref.get_history(); },
1887  settings);
1888  }
1889 
1895  template<typename T>
1896  std::vector<T> get_history(
1897  const std::string& key, const KnowledgeReferenceSettings& settings =
1899  {
1900  return invoke(key,
1901  [&](const KnowledgeRecord& ref) { return ref.get_history<T>(); },
1902  settings);
1903  }
1904 
1910  template<typename OutputIterator>
1911  size_t get_history(const std::string& key, OutputIterator out, ssize_t index,
1912  size_t count,
1913  const KnowledgeReferenceSettings& settings =
1915  {
1916  return invoke(key,
1917  [&](const KnowledgeRecord& ref) {
1918  return ref.get_history(out, index, count);
1919  },
1920  settings);
1921  }
1922 
1927  template<typename OutputIterator>
1928  auto get_history(const std::string& key, OutputIterator out,
1929  const KnowledgeReferenceSettings& settings =
1930  KnowledgeReferenceSettings()) const -> decltype(*out, size_t{})
1931  {
1932  return invoke(key,
1933  [&](const KnowledgeRecord& ref) { return ref.get_history(out); },
1934  settings);
1935  }
1936 
1942  std::vector<KnowledgeRecord> get_history(const std::string& key, size_t index,
1943  size_t count,
1944  const KnowledgeReferenceSettings& settings =
1946  {
1947  return invoke(key,
1948  [&](const KnowledgeRecord& ref) {
1949  return ref.get_history(index, count);
1950  },
1951  settings);
1952  }
1953 
1959  KnowledgeRecord get_history(const std::string& key, size_t index,
1960  const KnowledgeReferenceSettings& settings =
1962  {
1963  return invoke(key,
1964  [&](const KnowledgeRecord& ref) { return ref.get_history(index); },
1965  settings);
1966  }
1967 
1973  const VariableReference& key, const KnowledgeReferenceSettings& settings =
1975  {
1976  return invoke(key, &KnowledgeRecord::has_history, settings);
1977  }
1978 
1983  const VariableReference& key, const KnowledgeReferenceSettings& settings =
1985  {
1986  return invoke(key, &KnowledgeRecord::get_history_size, settings);
1987  }
1988 
1994  const VariableReference& key, const KnowledgeReferenceSettings& settings =
1996  {
1997  return invoke(key, &KnowledgeRecord::get_history_capacity, settings);
1998  }
1999 
2006  void set_history_capacity(const VariableReference& key, size_t size,
2007  const EvalSettings& settings = EvalSettings())
2008  {
2009  return invoke(key,
2010  [&](KnowledgeRecord& ref) { return ref.set_history_capacity(size); },
2011  settings);
2012  }
2013 
2018  const EvalSettings& settings = EvalSettings())
2019  {
2020  return invoke(key, &KnowledgeRecord::clear_history, settings);
2021  }
2022 
2027  template<typename OutputIterator>
2028  size_t get_oldest(const VariableReference& key, OutputIterator out,
2029  size_t count,
2030  const KnowledgeReferenceSettings& settings =
2032  {
2033  return invoke(key,
2034  [&](const KnowledgeRecord& ref) { return ref.get_oldest(out, count); },
2035  settings);
2036  }
2037 
2043  template<typename OutputIterator, typename ConstOutputIterator>
2044  auto get_oldest(const VariableReference& key, OutputIterator out,
2045  ConstOutputIterator out_end,
2046  const KnowledgeReferenceSettings& settings =
2048  -> utility::enable_if_<!std::is_arithmetic<ConstOutputIterator>::value, size_t>
2049  {
2050  return invoke(key,
2051  [&](const KnowledgeRecord& ref) {
2052  return ref.get_oldest(out, out_end);
2053  },
2054  settings);
2055  }
2056 
2061  template<typename OutputIterator>
2062  auto get_oldest(const VariableReference& key, OutputIterator out,
2063  const KnowledgeReferenceSettings& settings =
2064  KnowledgeReferenceSettings()) const -> decltype(*out, size_t{})
2065  {
2066  return invoke(key,
2067  [&](const KnowledgeRecord& ref) { return ref.get_oldest(out); },
2068  settings);
2069  }
2070 
2075  template<typename OutputIterator>
2076  size_t get_newest(const VariableReference& key, OutputIterator out,
2077  size_t count,
2078  const KnowledgeReferenceSettings& settings =
2080  {
2081  return invoke(key,
2082  [&](const KnowledgeRecord& ref) { return ref.get_newest(out, count); },
2083  settings);
2084  }
2085 
2091  template<typename OutputIterator, typename ConstOutputIterator>
2092  auto get_newest(const VariableReference& key, OutputIterator out,
2093  ConstOutputIterator out_end,
2094  const KnowledgeReferenceSettings& settings =
2096  -> utility::enable_if_<!std::is_arithmetic<ConstOutputIterator>::value, size_t>
2097  {
2098  return invoke(key,
2099  [&](const KnowledgeRecord& ref) {
2100  return ref.get_newest(out, out_end);
2101  },
2102  settings);
2103  }
2104 
2109  template<typename OutputIterator>
2110  auto get_newest(const VariableReference& key, OutputIterator out,
2111  const KnowledgeReferenceSettings& settings =
2112  KnowledgeReferenceSettings()) const -> decltype(*out, size_t{})
2113  {
2114  return invoke(key,
2115  [&](const KnowledgeRecord& ref) { return ref.get_newest(out); },
2116  settings);
2117  }
2118 
2123  const VariableReference& key, const KnowledgeReferenceSettings& settings =
2125  {
2126  return invoke(key,
2127  [&](const KnowledgeRecord& ref) { return ref.get_oldest(); }, settings);
2128  }
2129 
2134  template<typename T>
2136  const VariableReference& key, const KnowledgeReferenceSettings& settings =
2138  {
2139  return invoke(key,
2140  [&](const KnowledgeRecord& ref) { return ref.get_oldest<T>(); },
2141  settings);
2142  }
2143 
2148  const VariableReference& key, const KnowledgeReferenceSettings& settings =
2150  {
2151  return invoke(key,
2152  [&](const KnowledgeRecord& ref) { return ref.get_newest(); }, settings);
2153  }
2154 
2159  template<typename T>
2161  const VariableReference& key, const KnowledgeReferenceSettings& settings =
2163  {
2164  return invoke(key,
2165  [&](const KnowledgeRecord& ref) { return ref.get_newest<T>(); },
2166  settings);
2167  }
2168 
2173  std::vector<KnowledgeRecord> get_oldest(const VariableReference& key,
2174  size_t count,
2175  const KnowledgeReferenceSettings& settings =
2177  {
2178  return invoke(key,
2179  [&](const KnowledgeRecord& ref) { return ref.get_oldest(count); },
2180  settings);
2181  }
2182 
2188  template<typename T>
2189  std::vector<T> get_oldest(const VariableReference& key, size_t count,
2190  const KnowledgeReferenceSettings& settings =
2192  {
2193  return invoke(key,
2194  [&](const KnowledgeRecord& ref) { return ref.get_oldest<T>(count); },
2195  settings);
2196  }
2197 
2202  std::vector<KnowledgeRecord> get_newest(const VariableReference& key,
2203  size_t count,
2204  const KnowledgeReferenceSettings& settings =
2206  {
2207  return invoke(key,
2208  [&](const KnowledgeRecord& ref) { return ref.get_newest(count); },
2209  settings);
2210  }
2211 
2217  template<typename T>
2218  std::vector<T> get_newest(const VariableReference& key, size_t count,
2219  const KnowledgeReferenceSettings& settings =
2221  {
2222  return invoke(key,
2223  [&](const KnowledgeRecord& ref) { return ref.get_newest<T>(count); },
2224  settings);
2225  }
2226 
2230  std::vector<KnowledgeRecord> get_history(
2231  const VariableReference& key, const KnowledgeReferenceSettings& settings =
2233  {
2234  return invoke(key,
2235  [&](const KnowledgeRecord& ref) { return ref.get_history(); },
2236  settings);
2237  }
2238 
2244  template<typename T>
2245  std::vector<T> get_history(
2246  const VariableReference& key, const KnowledgeReferenceSettings& settings =
2248  {
2249  return invoke(key,
2250  [&](const KnowledgeRecord& ref) { return ref.get_history<T>(); },
2251  settings);
2252  }
2253 
2259  template<typename OutputIterator>
2260  size_t get_history(const VariableReference& key, OutputIterator out,
2261  ssize_t index, size_t count,
2262  const KnowledgeReferenceSettings& settings =
2264  {
2265  return invoke(key,
2266  [&](const KnowledgeRecord& ref) {
2267  return ref.get_history(out, index, count);
2268  },
2269  settings);
2270  }
2271 
2276  template<typename OutputIterator>
2277  auto get_history(const VariableReference& key, OutputIterator out,
2278  const KnowledgeReferenceSettings& settings =
2279  KnowledgeReferenceSettings()) const -> decltype(*out, size_t{})
2280  {
2281  return invoke(key,
2282  [&](const KnowledgeRecord& ref) { return ref.get_history(out); },
2283  settings);
2284  }
2285 
2291  std::vector<KnowledgeRecord> get_history(const VariableReference& key,
2292  size_t index, size_t count,
2293  const KnowledgeReferenceSettings& settings =
2295  {
2296  return invoke(key,
2297  [&](const KnowledgeRecord& ref) {
2298  return ref.get_history(index, count);
2299  },
2300  settings);
2301  }
2302 
2309  const KnowledgeReferenceSettings& settings =
2311  {
2312  return invoke(key,
2313  [&](const KnowledgeRecord& ref) { return ref.get_history(index); },
2314  settings);
2315  }
2316 
2326  template<typename Func>
2327  void for_each(Func&& func) const
2328  {
2329  if (impl_.get())
2330  {
2331  impl_->for_each(std::forward<Func>(func));
2332  }
2333  else if (context_)
2334  {
2335  context_->for_each(std::forward<Func>(func));
2336  }
2337  }
2338 
2339 private:
2342  std::shared_ptr<KnowledgeBaseImpl> impl_;
2343 
2346 };
2347 } // namespace knowledge
2348 } // namespace madara
2349 
2350 // include the inline functions
2351 #include "KnowledgeBase.inl"
2352 
2353 #endif // _MADARA_KNOWLEDGE_BASE_H
const ThreadSafeContext * context_
An exception for attempting to access an invalid context1.
An abstract base class defines a simple abstract implementation of an expression tree node.
Definition: ComponentNode.h:37
Holds settings for checkpoints to load or save.
Compiled, optimized KaRL logic.
Defines a file header which is the default for KaRL checkpointing.
Definition: FileHeader.h:37
This class provides a distributed knowledge base to users.
Definition: KnowledgeBase.h:45
std::vector< T > get_oldest(const VariableReference &key, size_t count, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
Return the count oldest stored history entries of this record in a vector of the given element type,...
auto get_history(const std::string &key, OutputIterator out, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const -> decltype(*out, size_t{})
Copy the stored history of this record to the given output iterator, in order from oldest to newest.
auto invoke(VariableReference key, Callable &&callable, const EvalSettings &settings=EvalSettings()) -> decltype(utility::invoke_(std::forward< Callable >(callable), std::declval< KnowledgeRecord & >()))
std::vector< KnowledgeRecord > get_oldest(const std::string &key, size_t count, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
Return the count oldest stored history entries of this record in a vector.
T get_newest(const VariableReference &key, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
Return the newest stored history entry of this record as the type given (which must support knowledge...
KnowledgeRecord get_history(const VariableReference &key, size_t index, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
Return the given entry in this record's history.
size_t get_newest(const std::string &key, OutputIterator out, size_t count, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
Copy the count newest stored history entries of this record to the given output iterator,...
auto get_newest(const std::string &key, OutputIterator out, ConstOutputIterator out_end, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const -> utility::enable_if_<!std::is_arithmetic< ConstOutputIterator >::value, size_t >
Copy the newest stored history entries of this record to the given output iterator,...
auto cinvoke(const VariableReference &key, Callable &&callable, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const -> decltype(utility::invoke_(std::forward< Callable >(callable), std::declval< KnowledgeRecord & >()))
auto get_oldest(const std::string &key, OutputIterator out, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const -> decltype(*out, size_t{})
Copy the oldest stored history entry of this record to the given output iterator.
void for_each(Func &&func) const
Call given Callable on each element in this KB.
std::shared_ptr< const std::string > share_string(const VariableReference &key, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
size_t get_history_size(const VariableReference &key, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
Return the amount of history this record holds.
auto invoke(const std::string &key, Callable &&callable, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const -> decltype(utility::invoke_(std::forward< Callable >(callable), std::declval< KnowledgeRecord & >()))
std::shared_ptr< const std::vector< unsigned char > > share_binary(const std::string &key, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
KnowledgeRecord get_newest(const std::string &key, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
Return the newest stored history entry of this record.
KnowledgeRecord get_oldest(const VariableReference &key, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
Return the oldest stored history entry of this record.
KnowledgeRecord get_history(const std::string &key, size_t index, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
Return the given entry in this record's history.
std::vector< KnowledgeRecord > get_history(const VariableReference &key, size_t index, size_t count, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
Return a copy of the given range of history in a vector.
int set(const VariableReference &variable, T value, const EvalSettings &settings=EvalSettings(true, false, true, false, false))
Atomically sets the value of a variable to an integer.
ThreadSafeContext * context_
A knowledge base can also be a facade for another knowledge base.
std::vector< KnowledgeRecord > get_newest(const VariableReference &key, size_t count, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
Return the count newest stored history entries of this record in a vector.
KnowledgeRecord get_oldest(const std::string &key, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
Return the oldest stored history entry of this record.
std::vector< KnowledgeRecord > get_history(const std::string &key, size_t index, size_t count, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
Return a copy of the given range of history in a vector.
auto get_newest(const VariableReference &key, OutputIterator out, ConstOutputIterator out_end, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const -> utility::enable_if_<!std::is_arithmetic< ConstOutputIterator >::value, size_t >
Copy the newest stored history entries of this record to the given output iterator,...
~KnowledgeBase()=default
Destructor.
int set(const std::string &key, const EvalSettings &settings=EvalSettings(true, false, true, false, false))
Atomically sets the value of a variable to an integer 1.
int set_xml(const VariableReference &variable, const char *value, size_t size, const EvalSettings &settings=EvalSettings(true, false, true, false, false))
Atomically sets the value of a variable to an XML string.
void set_history_capacity(const VariableReference &key, size_t size, const EvalSettings &settings=EvalSettings())
Set the capacity of this record's history circular buffer.
T get_newest(const std::string &key, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
Return the newest stored history entry of this record as the type given (which must support knowledge...
auto get_history(const VariableReference &key, OutputIterator out, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const -> decltype(*out, size_t{})
Copy the stored history of this record to the given output iterator, in order from oldest to newest.
size_t get_history_capacity(const std::string &key, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
Return the maximum amount of history this record can hold.
auto get_newest(const VariableReference &key, OutputIterator out, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const -> decltype(*out, size_t{})
Copy the newest stored history entry of this record to the given output iterator.
std::vector< T > get_newest(const std::string &key, size_t count, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
Return the count newest stored history entries of this record in a vector of the given element type,...
std::vector< KnowledgeRecord > get_oldest(const VariableReference &key, size_t count, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
Return the count oldest stored history entries of this record in a vector.
std::shared_ptr< const std::vector< KnowledgeRecord::Integer > > share_integers(const std::string &key, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
auto get_oldest(const std::string &key, OutputIterator out, ConstOutputIterator out_end, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const -> utility::enable_if_<!std::is_arithmetic< ConstOutputIterator >::value, size_t >
Copy the oldest stored history entries of this record to the given output iterator,...
std::vector< KnowledgeRecord > get_history(const VariableReference &key, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
Get a copy of the entire stored history of this record.
int set_text(const VariableReference &variable, const char *value, size_t size, const EvalSettings &settings=EvalSettings(true, false, true, false, false))
Atomically sets the value of a variable to a text file's contents.
T get_oldest(const VariableReference &key, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
Return the oldest stored history entry of this record as the type given (which must support knowledge...
int set(const std::string &key, T value, const EvalSettings &settings=EvalSettings(true, false, true, false, false))
Sets a knowledge variable to a specified value.
std::shared_ptr< const std::vector< unsigned char > > share_binary(const VariableReference &key, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
size_t get_history(const VariableReference &key, OutputIterator out, ssize_t index, size_t count, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
Copy the given range of history to the output iterator given.
size_t get_history_size(const std::string &key, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
Return the amount of history this record holds.
std::vector< KnowledgeRecord > get_newest(const std::string &key, size_t count, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
Return the count newest stored history entries of this record in a vector.
KnowledgeRecord get_newest(const VariableReference &key, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
Return the newest stored history entry of this record.
auto get_oldest(const VariableReference &key, OutputIterator out, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const -> decltype(*out, size_t{})
Copy the oldest stored history entry of this record to the given output iterator.
std::vector< T > get_history(const VariableReference &key, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
Get a copy of the entire stored history of this record in a vector of the given element type,...
KnowledgeBase(const KnowledgeBase &original)=default
Copy constructor.
std::shared_ptr< const std::vector< double > > share_doubles(const VariableReference &key, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
std::unique_ptr< BaseStreamer > attach_streamer(std::unique_ptr< BaseStreamer > streamer)
Attach a streaming provider object, inherited from BaseStreamer, such as CheckpointStreamer.
bool has_history(const std::string &key, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
Return true if this record has a circular buffer history.
size_t get_oldest(const VariableReference &key, OutputIterator out, size_t count, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
Copy the count oldest stored history entries of this record to the given output iterator,...
KnowledgeBase & operator=(const KnowledgeBase &original)=default
Assigns another instance's knowledge and settings to this instance.
std::vector< T > get_history(const std::string &key, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
Get a copy of the entire stored history of this record in a vector of the given element type,...
size_t get_oldest(const std::string &key, OutputIterator out, size_t count, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
Copy the count oldest stored history entries of this record to the given output iterator,...
std::shared_ptr< const std::vector< KnowledgeRecord::Integer > > share_integers(const VariableReference &key, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
T get_oldest(const std::string &key, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
Return the oldest stored history entry of this record as the type given (which must support knowledge...
auto cinvoke(const std::string &key, Callable &&callable, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const -> decltype(utility::invoke_(std::forward< Callable >(callable), std::declval< KnowledgeRecord & >()))
void clear_history(const std::string &key, const EvalSettings &settings=EvalSettings())
Clear all history for this record, keeping the current value.
size_t get_newest(const VariableReference &key, OutputIterator out, size_t count, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
Copy the count newest stored history entries of this record to the given output iterator,...
std::vector< KnowledgeRecord > get_history(const std::string &key, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
Get a copy of the entire stored history of this record.
void clear_history(const VariableReference &key, const EvalSettings &settings=EvalSettings())
Clear all history for this record, keeping the current value.
size_t get_history_capacity(const VariableReference &key, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
Return the maximum amount of history this record can hold.
std::vector< T > get_newest(const VariableReference &key, size_t count, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
Return the count newest stored history entries of this record in a vector of the given element type,...
bool has_history(const VariableReference &key, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
Return true if this record has a circular buffer history.
std::shared_ptr< const std::string > share_string(const std::string &key, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
std::vector< T > get_oldest(const std::string &key, size_t count, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
Return the count oldest stored history entries of this record in a vector of the given element type,...
auto invoke(const VariableReference &key, Callable &&callable, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const -> decltype(utility::invoke_(std::forward< Callable >(callable), std::declval< KnowledgeRecord & >()))
auto get_newest(const std::string &key, OutputIterator out, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const -> decltype(*out, size_t{})
Copy the newest stored history entry of this record to the given output iterator.
auto get_oldest(const VariableReference &key, OutputIterator out, ConstOutputIterator out_end, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const -> utility::enable_if_<!std::is_arithmetic< ConstOutputIterator >::value, size_t >
Copy the oldest stored history entries of this record to the given output iterator,...
std::shared_ptr< const std::vector< double > > share_doubles(const std::string &key, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
size_t get_history(const std::string &key, OutputIterator out, ssize_t index, size_t count, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
Copy the given range of history to the output iterator given.
auto invoke(const std::string &key, Callable &&callable, const EvalSettings &settings=EvalSettings()) -> decltype(utility::invoke_(std::forward< Callable >(callable), std::declval< KnowledgeRecord & >()))
std::shared_ptr< KnowledgeBaseImpl > impl_
Pointer to actual implementation, i.e., the "bridge", which is reference counted to automate memory m...
int set(const VariableReference &variable, const EvalSettings &settings=EvalSettings(true, false, true, false, false))
Atomically sets the value of a variable to an integer 1.
void set_history_capacity(const std::string &key, size_t size, const EvalSettings &settings=EvalSettings())
Set the capacity of this record's history circular buffer.
This class encapsulates an entry in a KnowledgeBase.
bool has_history() const
Return true if this record has a circular buffer history.
size_t get_history_capacity() const
Return the maximum amount of history this record can hold.
size_t get_history_size() const
Return the amount of history this record holds.
size_t get_newest(OutputIterator out, size_t count) const
Copy the count newest stored history entries of this record to the given output iterator,...
size_t get_oldest(OutputIterator out, size_t count) const
Copy the count oldest stored history entries of this record to the given output iterator,...
void clear_history()
Clear all history for this record, keeping the current value.
std::vector< KnowledgeRecord > get_history() const
Get a copy of the entire stored history of this record.
void set_history_capacity(size_t size)
Set the capacity of this record's history circular buffer.
Settings for applying knowledge updates.
Settings for applying knowledge updates.
This class stores variables and their values for use by any entity needing state information in a thr...
Optimized reference to a variable within the knowledge base.
Provides an interface for external functions into the MADARA KaRL variable settings.
Definition: Variables.h:53
A multi-threaded logger for logging to one or more destinations.
Definition: Logger.h:165
Base class from which all transports must be derived.
Definition: Transport.h:46
Holds basic transport settings.
constexpr string_t string
Provides functions and classes for the distributed knowledge base.
std::map< std::string, bool > CopySet
Typedef for set of copyable keys.
T get(const KnowledgeRecord &kr)
Get the value of a KnowlegeRecord.
Definition: GetRecord.h:121
std::vector< KnowledgeRecord > FunctionArguments
::std::map< std::string, KnowledgeRecord > KnowledgeMap
std::vector< VariableReference > VariableReferences
a vector of variable references
Provides knowledge logging services to files and terminals.
Definition: GlobalLogger.h:12
MADARA_EXPORT bool exists(const char *originator, uint64_t clock, uint32_t update_number, OriginatorFragmentMap &map)
Checks if a fragment already exists within a fragment map.
Provides utility functions and classes for common tasks and needs.
Definition: IteratorImpl.h:15
std::string file_to_string(const std::string &filename)
Reads a file into a string.
Definition: Utility.cpp:324
ssize_t write_file(const std::string &filename, void *buffer, size_t size)
Writes a file with provided contents.
Definition: Utility.cpp:487
typename std::enable_if< Pred, T >::type enable_if_
Less verbose synonym for std::enable_if.
Definition: StlHelper.h:74
constexpr bool is_arithmetic()
Less verbose equivalent for std::is_arithmetic.
Definition: StlHelper.h:152
auto invoke_(Func func, Arg0 &&arg0) -> decltype(std::forward< Arg0 >(arg0).*func)
Definition: StlHelper.h:193
int read_file(const std::string &filename, void *&buffer, size_t &size, bool add_zero_char)
Reads a file into a provided void pointer.
Definition: Utility.cpp:418
Copyright(c) 2020 Galois.
Encapsulates settings for an evaluation statement.
Definition: EvalSettings.h:26
static const EvalSettings SEND
Settings to immediately send modifieds and expand variables.
Definition: EvalSettings.h:57
Holds settings requirements for knowledge, usually in copying.
Encapsulates settings for a wait statement.
Definition: WaitSettings.h:25