1 #ifndef MADARA_THREADSAFECONTEXT_H
2 #define MADARA_THREADSAFECONTEXT_H
20 #include "madara/MadaraExport.h"
21 #include "madara/LockType.h"
34 #include "madara_jni.h"
37 #ifdef _MADARA_PYTHON_CALLBACKS_
38 #include "madara/Boost.h"
39 #include "boost/python/object.hpp"
47 class CompositeArrayReference;
60 typedef std::map<std::string, bool>
CopySet;
185 template<
typename T, MethodType<T> Get,
typename K>
189 auto rec = with(std::forward<K>(key), settings);
192 return (rec->*Get)();
200 template<
typename T, ConstMethodType<T> Get,
typename K>
204 auto rec = with(std::forward<K>(key), settings);
207 return (rec->*Get)();
221 return get_shared<const std::string, &KnowledgeRecord::share_string>(
233 return get_shared<const std::string, &KnowledgeRecord::share_string>(
245 return get_shared<const std::vector<KnowledgeRecord::Integer>,
257 return get_shared<const std::vector<KnowledgeRecord::Integer>,
269 return get_shared<const std::vector<double>,
281 return get_shared<const std::vector<double>,
293 return get_shared<const std::vector<unsigned char>,
305 return get_shared<const std::vector<unsigned char>,
376 int set_xml(
const std::string& key,
const char* value,
size_t size,
398 int set_jpeg(
const std::string& key,
const unsigned char* value,
size_t size,
421 int set_file(
const std::string& key,
const unsigned char* value,
size_t size,
444 int set_text(
const std::string& key,
const char* value,
size_t size,
468 int set_index(
const std::string& key,
size_t index, T&& value,
529 int set(
const std::string& key,
const T* value, uint32_t size,
616 int set_if_unequal(
const std::string& key,
double value, uint32_t quality,
631 uint32_t quality, uint64_t clock,
644 int update_record_from_external(
const std::string& key,
668 uint32_t get_quality(
678 uint32_t get_write_quality(
690 uint32_t set_quality(
const std::string& key, uint32_t quality,
696 void set_changed(
void);
704 void set_write_quality(
const std::string& key, uint32_t quality,
721 const std::map<std::string, bool> & send_list,
bool reset =
true);
757 void reset_modified(
void);
763 void reset_checkpoint(
void)
const;
768 void apply_modified(
void);
852 void wait_for_change(
bool extra_release =
false);
908 bool delete_variable(
928 bool delete_variable(
947 void delete_variables(KnowledgeMap::iterator begin,
948 KnowledgeMap::iterator end,
966 bool delete_expression(
const std::string& expression);
993 void print(
unsigned int level)
const;
1001 void print(
const std::string& statement,
unsigned int level)
const;
1008 void clear(
bool erase =
false);
1016 void lock(
void)
const;
1025 bool try_lock(
void)
const;
1030 void unlock(
void)
const;
1056 uint64_t set_clock(uint64_t clock);
1066 uint64_t set_clock(
const std::string& key, uint64_t clock,
1074 uint64_t get_clock(
void)
const;
1090 void signal(
bool lock =
true)
const;
1138 #ifndef _MADARA_NO_KARL_
1173 #ifdef _MADARA_JAVA_
1180 void define_function(
const std::string& name, jobject callable,
1185 #ifdef _MADARA_PYTHON_CALLBACKS_
1192 void define_function(
const std::string& name, boost::python::object callable,
1278 const std::string& key_val_delimiter =
"=")
const;
1294 size_t to_vector(
const std::string& subject,
unsigned int start,
1295 unsigned int end, std::vector<KnowledgeRecord>& target);
1318 std::map<std::string, knowledge::KnowledgeRecord>& target);
1330 int get_log_level(
void);
1336 void set_log_level(
int level);
1367 const std::string& suffix, std::vector<std::string>& next_keys,
1368 std::map<std::string, knowledge::KnowledgeRecord>& result,
1403 int64_t save_context(
1421 int64_t save_as_json(
const std::string& filename)
const;
1435 int64_t save_as_karl(
const std::string& filename)
const;
1456 true,
true,
true,
false));
1471 true,
true,
true,
false));
1484 true,
true,
true,
false));
1495 true,
true,
true,
false));
1514 int64_t save_checkpoint(
1538 std::unique_ptr<BaseStreamer> streamer)
1540 MADARA_GUARD_TYPE guard(mutex_);
1543 swap(streamer, streamer_);
1581 template<
typename Callable>
1585 std::forward<Callable>(callable), std::declval<KnowledgeRecord&>()))
1587 MADARA_GUARD_TYPE guard(mutex_);
1588 auto ref = get_ref(key, settings);
1589 return utility::invoke_(std::forward<Callable>(callable), *ref.get_record_unsafe());
1592 template<
typename Callable>
1596 std::forward<Callable>(callable), std::declval<KnowledgeRecord&>()))
1598 MADARA_GUARD_TYPE guard(mutex_);
1603 template<
typename Callable>
1609 MADARA_GUARD_TYPE guard(mutex_);
1619 template<
typename Callable>
1625 MADARA_GUARD_TYPE guard(mutex_);
1631 template<
typename Callable>
1637 return invoke(key, std::forward<Callable>(callable), settings);
1640 template<
typename Callable>
1646 return invoke(key, std::forward<Callable>(callable), settings);
1658 template<
typename Func>
1661 MADARA_GUARD_TYPE guard(mutex_);
1663 std::for_each(
map_.begin(),
map_.end(), func);
1695 template<
typename... Args>
1699 template<
typename T>
1704 std::pair<KnowledgeMap::const_iterator, KnowledgeMap::const_iterator>
1705 get_prefix_range(
const std::string& prefix)
const;
1707 std::pair<KnowledgeMap::iterator, KnowledgeMap::iterator> get_prefix_range(
1729 std::unique_ptr<BaseStreamer> streamer_ =
nullptr;
VariableReferenceMap map_
An abstract base class defines a simple abstract implementation of an expression tree node.
Defines a terminal node of that references the current value stored in a variable.
Parses incoming expression strings into a parse tree and generates an expression tree from the parse ...
Defines a terminal node of that references the current value stored in a variable.
Holds settings for checkpoints to load or save.
Compiled, optimized KaRL logic.
This class stores a function definition.
This class provides a distributed knowledge base implementation.
This class encapsulates an entry in a KnowledgeBase.
std::shared_ptr< const std::vector< double > > share_doubles() const
std::shared_ptr< const std::vector< unsigned char > > share_binary() const
std::shared_ptr< const std::vector< Integer > > share_integers() const
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...
std::shared_ptr< const std::string > share_string(const std::string &key, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
std::shared_ptr< T > get_shared(K &&key, const KnowledgeReferenceSettings &settings)
void for_each(Func &&func) const
Call given Callable on each element in this context.
std::shared_ptr< const std::string > share_string(const VariableReference &key, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
auto invoke(const VariableReference &key, Callable &&callable, const KnowledgeUpdateSettings &settings=KnowledgeUpdateSettings()) -> decltype(utility::invoke_(std::forward< Callable >(callable), std::declval< KnowledgeRecord & >()))
std::shared_ptr< T > get_shared(K &&key, const KnowledgeReferenceSettings &settings) const
auto cinvoke(const VariableReference &key, Callable &&callable, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const -> decltype(utility::invoke_(std::forward< Callable >(callable), std::declval< KnowledgeRecord & >()))
madara::expression::Interpreter * interpreter_
KaRL interpreter.
std::shared_ptr< const std::vector< double > > share_doubles(const VariableReference &key, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
logger::Logger * logger_
Logger for printing.
auto invoke(const std::string &key, Callable &&callable, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const -> decltype(utility::invoke_(std::forward< Callable >(callable), std::declval< KnowledgeRecord & >()))
MADARA_CONDITION_TYPE changed_
std::shared_ptr< const std::vector< unsigned char > > share_binary(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.
FunctionMap functions_
map of function names to functions
madara::knowledge::KnowledgeMap map_
Hash table containing variable names and values.
auto invoke(const VariableReference &key, Callable &&callable, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const -> decltype(utility::invoke_(std::forward< Callable >(callable), std::declval< KnowledgeRecord & >()))
std::shared_ptr< const std::vector< KnowledgeRecord::Integer > > share_integers(const std::string &key, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
const KnowledgeMap & get_map_unsafe(void) const
NOT THREAD SAFE!
std::shared_ptr< T >(KnowledgeRecord::*)(void) const ConstMethodType
std::shared_ptr< const std::vector< unsigned char > > share_binary(const std::string &key, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
VariableReferenceMap changed_map_
auto cinvoke(const std::string &key, Callable &&callable, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const -> decltype(utility::invoke_(std::forward< Callable >(callable), std::declval< KnowledgeRecord & >()))
auto invoke(const std::string &key, Callable &&callable, const KnowledgeUpdateSettings &settings=KnowledgeUpdateSettings()) -> decltype(utility::invoke_(std::forward< Callable >(callable), std::declval< KnowledgeRecord & >()))
std::shared_ptr< const std::vector< KnowledgeRecord::Integer > > share_integers(const VariableReference &key, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
VariableReferenceMap local_changed_map_
std::vector< std::string > expansion_splitters_
KnowledgeMap & get_map_unsafe(void)
NOT THREAD SAFE!
void define_function(const std::string &name, knowledge::KnowledgeRecord(*func)(const char *, FunctionArguments &, Variables &), const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings())
Defines a named function that can distinguish the name it was called with in MADARA.
std::shared_ptr< T >(KnowledgeRecord::*)(void) MethodType
std::shared_ptr< const std::vector< double > > share_doubles(const std::string &key, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings()) const
Optimized reference to a variable within the knowledge base.
KnowledgeRecord * get_record_unsafe(void) const
Returns a pointer to the variable's KnowledgeRecord Do not use this pointer unless you've locked the ...
Provides an interface for external functions into the MADARA KaRL variable settings.
A multi-threaded logger for logging to one or more destinations.
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.
std::map< const char *, VariableReference, utility::ComparisonLessThan > VariableReferenceMap
a map of variable references
std::vector< std::string > PrefixVector
Typedef for vector of prefixes to use for a generic task.
std::map< std::string, Function > FunctionMap
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.
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.
std::string file_to_string(const std::string &filename)
Reads a file into a string.
auto invoke_(Func func, Arg0 &&arg0) -> decltype(std::forward< Arg0 >(arg0).*func)
int read_file(const std::string &filename, void *&buffer, size_t &size, bool add_zero_char)
Reads a file into a provided void pointer.
Copyright(c) 2020 Galois.
Holds settings requirements for knowledge, usually in copying.