3 #include <common/memory/safe_ptr.h>
4 #include <common/utility/assert.h>
6 #include <boost/variant.hpp>
7 #include <boost/chrono/duration.hpp>
15 namespace caspar { namespace core { namespace monitor {
17 typedef boost::variant<bool,
24 std::vector<std::int8_t>> data_t;
30 message(std::string path, std::vector<data_t> data = std::vector<data_t>())
31 : path_(std::move(path))
32 , data_ptr_(std::make_shared<std::vector<data_t>>(std::move(data)))
34 CASPAR_ASSERT(path.empty() || path[0] == '/');
37 message(std::string path, safe_ptr<std::vector<data_t>> data_ptr)
38 : path_(std::move(path))
39 , data_ptr_(std::move(data_ptr))
41 CASPAR_ASSERT(path.empty() || path[0] == '/');
44 const std::string& path() const
49 const std::vector<data_t>& data() const
54 message propagate(const std::string& path) const
56 return message(path + path_, data_ptr_);
60 message& operator%(T&& data)
62 data_ptr_->push_back(std::forward<T>(data));
68 safe_ptr<std::vector<data_t>> data_ptr_;
71 class subject : public Concurrency::transformer<monitor::message, monitor::message>
74 subject(std::string path = "")
75 : Concurrency::transformer<monitor::message, monitor::message>([=](const message& msg)
77 return msg.propagate(path);
80 CASPAR_ASSERT(path.empty() || path[0] == '/');
84 subject& operator<<(T&& msg)
86 Concurrency::send(*this, std::forward<T>(msg));
91 typedef Concurrency::ISource<monitor::message> source;