17 #include <boost/core/demangle.hpp> 26 namespace uhd {
namespace experts {
57 virtual const std::string&
get_dtype()
const = 0;
59 virtual std::string
to_string()
const = 0;
80 const std::string _name;
87 template <
typename data_t>
88 static std::string
print(
const data_t& val)
90 std::ostringstream os;
95 static std::string
print(
const uint8_t& val)
97 std::ostringstream os;
104 std::ostringstream os;
111 std::ostringstream os;
135 template <
typename data_t>
144 data_node_t(
const std::string& name, std::recursive_mutex* mutex = NULL)
146 , _callback_mutex(mutex)
153 const std::string& name,
const data_t& value, std::recursive_mutex* mutex = NULL)
155 , _callback_mutex(mutex)
164 static const std::string dtype(boost::core::demangle(
typeid(data_t).name()));
181 return _data.is_dirty();
200 void set(
const data_t& value)
206 const data_t&
get()
const 214 if (_callback_mutex == NULL)
216 "node " +
get_name() +
" is missing the callback mutex");
217 std::lock_guard<std::recursive_mutex> lock(*_callback_mutex);
220 if (
is_dirty() and has_write_callback()) {
228 if (_callback_mutex == NULL)
230 "node " +
get_name() +
" is missing the callback mutex");
231 std::lock_guard<std::recursive_mutex> lock(*_callback_mutex);
232 if (has_read_callback()) {
233 _rd_callback(std::string(
get_name()));
245 bool has_write_callback()
const override 247 return bool(_wr_callback);
250 void clear_write_callback()
override 252 _wr_callback =
nullptr;
260 bool has_read_callback()
const override 262 return bool(_rd_callback);
265 void clear_read_callback()
override 267 _rd_callback =
nullptr;
270 std::recursive_mutex* _callback_mutex;
273 dirty_tracked<data_t> _data;
293 virtual dag_vertex_t& retrieve(
const std::string& name)
const = 0;
320 template <
typename data_t>
359 + boost::core::demangle(
typeid(data_t).name())
360 +
" but got " + node().get_dtype());
381 template <
typename data_t>
390 inline const data_t&
get()
const 395 inline operator const data_t&()
const 407 return !(
get() == rhs);
424 template <
typename data_t>
433 inline const data_t&
get()
const 438 inline operator const data_t&()
const 450 return !(
get() == rhs);
453 inline void set(
const data_t& value)
489 std::list<std::string> retval;
491 retval.push_back(acc->node().get_name());
498 std::list<std::string> retval;
500 retval.push_back(acc->node().get_name());
513 _inputs.push_back(&accessor);
515 _outputs.push_back(&accessor);
523 bool is_dirty()
const override 525 bool inputs_dirty =
false;
527 inputs_dirty |= acc->node().is_dirty();
532 void mark_clean()
override 534 for (data_accessor_t* acc : _inputs) {
535 acc->node().mark_clean();
539 void force_dirty()
override 541 for (data_accessor_t* acc : _outputs) {
542 acc->node().force_dirty();
546 void resolve()
override = 0;
549 const std::string& get_dtype()
const override 551 static const std::string dtype =
"<worker>";
555 std::string to_string()
const override 562 bool has_write_callback()
const override 566 void clear_write_callback()
override {}
568 bool has_read_callback()
const override 572 void clear_read_callback()
override {}
574 std::list<data_accessor_t*> _inputs;
575 std::list<data_accessor_t*> _outputs;
virtual ~node_retriever_t()
Definition: expert_nodes.hpp:288
std::string to_string(void) const
bool is_dirty() const override
Definition: expert_nodes.hpp:179
Definition: expert_nodes.hpp:30
Definition: expert_nodes.hpp:382
dag_vertex_t(const node_class_t c, const std::string &n)
Definition: expert_nodes.hpp:76
data_node_t(const std::string &name, const data_t &value, std::recursive_mutex *mutex=NULL)
Definition: expert_nodes.hpp:152
virtual bool is_writer() const =0
virtual void clear_read_callback()=0
virtual void mark_clean()=0
const std::string & get_dtype() const override
Definition: expert_nodes.hpp:162
node_class_t get_class() const
Definition: expert_nodes.hpp:47
bool operator!=(const data_t &rhs)
Definition: expert_nodes.hpp:405
boost::noncopyable noncopyable
Definition: noncopyable.hpp:45
Definition: expert_nodes.hpp:481
std::string to_string() const override
Definition: expert_nodes.hpp:168
void commit(const data_t &value)
Definition: expert_nodes.hpp:212
data_t retrieve() const
Definition: expert_nodes.hpp:226
Definition: time_spec.hpp:28
data_reader_t(const node_retriever_t &retriever, const std::string &node)
Definition: expert_nodes.hpp:385
~data_accessor_base() override
Definition: expert_nodes.hpp:324
virtual void clear_write_callback()=0
virtual const std::string & get_dtype() const =0
virtual void force_dirty()=0
node_class_t
Definition: expert_nodes.hpp:28
bool operator!=(const data_t &rhs)
Definition: expert_nodes.hpp:448
static std::string print(const time_spec_t time)
Definition: expert_nodes.hpp:102
data_writer_t(const node_retriever_t &retriever, const std::string &node)
Definition: expert_nodes.hpp:428
virtual void set_write_callback(const callback_func_t &func)=0
Definition: expert_nodes.hpp:29
double get_real_secs(void) const
node_author_t
Definition: expert_nodes.hpp:30
node_author_t get_author() const
Definition: expert_nodes.hpp:346
Definition: expert_nodes.hpp:39
Definition: expert_nodes.hpp:321
bool operator==(const data_t &rhs)
Definition: expert_nodes.hpp:443
virtual ~data_accessor_t()
Definition: expert_nodes.hpp:306
static std::string print(const device_addr_t addr)
Definition: expert_nodes.hpp:109
Definition: expert_nodes.hpp:303
Definition: expert_nodes.hpp:29
data_node_t< data_t > * _datanode
Definition: expert_nodes.hpp:364
std::list< std::string > get_inputs() const
Definition: expert_nodes.hpp:487
Definition: build_info.hpp:12
Definition: expert_nodes.hpp:28
virtual bool is_dirty() const =0
virtual dag_vertex_t & node() const =0
virtual bool is_reader() const =0
void bind_accessor(data_accessor_t &accessor)
Definition: expert_nodes.hpp:510
void force_dirty() override
Definition: expert_nodes.hpp:189
bool is_writer() const override
Definition: expert_nodes.hpp:331
const node_access_t _access
Definition: expert_nodes.hpp:365
Definition: expert_nodes.hpp:136
Definition: expert_nodes.hpp:28
node_class_t get_class() const
Definition: expert_nodes.hpp:341
bool operator==(const data_t &rhs)
Definition: expert_nodes.hpp:400
node_author_t get_author() const
Definition: expert_nodes.hpp:173
virtual void set_read_callback(const callback_func_t &func)=0
void mark_clean() override
Definition: expert_nodes.hpp:184
data_accessor_t(const node_retriever_t &r, const std::string &n)
Definition: expert_nodes.hpp:313
Definition: expert_nodes.hpp:425
Definition: exception.hpp:47
bool is_dirty() const
Definition: expert_nodes.hpp:336
worker_node_t(const std::string &name)
Definition: expert_nodes.hpp:484
const data_t & get() const
Definition: expert_nodes.hpp:390
virtual ~dag_vertex_t()
Definition: expert_nodes.hpp:44
friend std::ostream & operator<<(std::ostream &os, const data_reader_t &reader)
Definition: expert_nodes.hpp:410
void resolve() override
Definition: expert_nodes.hpp:194
Definition: expert_nodes.hpp:28
Definition: expert_nodes.hpp:30
bool is_reader() const override
Definition: expert_nodes.hpp:326
virtual bool has_read_callback() const =0
data_writer_t< data_t > & operator=(const data_writer_t< data_t > &value)
Definition: expert_nodes.hpp:464
Definition: exception.hpp:95
static std::string print(const uint8_t &val)
Definition: expert_nodes.hpp:95
Definition: expert_nodes.hpp:30
node_access_t
Definition: expert_nodes.hpp:29
Definition: expert_nodes.hpp:83
std::list< std::string > get_outputs() const
Definition: expert_nodes.hpp:496
const data_t & get() const
Definition: expert_nodes.hpp:433
dag_vertex_t & _vertex
Definition: expert_nodes.hpp:317
virtual std::string to_string() const =0
data_node_t(const std::string &name, std::recursive_mutex *mutex=NULL)
Definition: expert_nodes.hpp:144
virtual bool has_write_callback() const =0
Definition: expert_nodes.hpp:285
virtual const dag_vertex_t & lookup(const std::string &name) const =0
const std::string & get_name() const
Definition: expert_nodes.hpp:52
static std::string print(const data_t &val)
Definition: expert_nodes.hpp:88
data_accessor_base(const node_retriever_t &r, const std::string &n, const node_access_t a)
Definition: expert_nodes.hpp:352
Definition: device_addr.hpp:38
std::function< void(std::string)> callback_func_t
Definition: expert_nodes.hpp:42
data_writer_t< data_t > & operator=(const data_t &value)
Definition: expert_nodes.hpp:458