diff --git a/signal.hpp b/signal.hpp index 881492c9..03a25422 100644 --- a/signal.hpp +++ b/signal.hpp @@ -60,6 +60,17 @@ namespace util { typedef std::list group; group m_children; }; + + template + class value_signal : public signal { + public: + operator const T&() const; + + value_signal& operator= (const T&); + + private: + T m_value; + }; } #include "signal.ipp" diff --git a/signal.ipp b/signal.ipp index e1b4bfae..01fa15eb 100644 --- a/signal.ipp +++ b/signal.ipp @@ -167,5 +167,23 @@ namespace util { (*current)(std::forward (tail)...); } while (looping); } + + + /////////////////////////////////////////////////////////////////////////// + template + value_signal::operator const T&() const + { + return m_value; + } + + + template + value_signal& + value_signal::operator= (const T &t) + { + m_value = t; + (*this) (m_value); + return *this; + } } diff --git a/test/signal.cpp b/test/signal.cpp index e3adad33..a4848dc2 100644 --- a/test/signal.cpp +++ b/test/signal.cpp @@ -60,6 +60,19 @@ test_linking_pointers (void) } +/////////////////////////////////////////////////////////////////////////////// +void +test_value_signal (void) +{ + util::value_signal val; + auto raii = val.connect ([] (unsigned v) { CHECK_EQ (v, 42); }); + val = 42u; + + unsigned check = val; + CHECK_EQ (check, 42); +} + + /////////////////////////////////////////////////////////////////////////////// int main (int, char **) @@ -67,6 +80,7 @@ main (int, char **) test_null (); test_single (); test_double (); + test_value_signal (); return EXIT_SUCCESS; }