signal: add value wrapper signal

This commit is contained in:
Danny Robson 2015-02-19 13:27:47 +11:00
parent d342ef72f5
commit c8f067bf60
3 changed files with 43 additions and 0 deletions

View File

@ -60,6 +60,17 @@ namespace util {
typedef std::list<callback> group;
group m_children;
};
template <typename T>
class value_signal : public signal<void(T)> {
public:
operator const T&() const;
value_signal<T>& operator= (const T&);
private:
T m_value;
};
}
#include "signal.ipp"

View File

@ -167,5 +167,23 @@ namespace util {
(*current)(std::forward<Args> (tail)...);
} while (looping);
}
///////////////////////////////////////////////////////////////////////////
template <typename T>
value_signal<T>::operator const T&() const
{
return m_value;
}
template <typename T>
value_signal<T>&
value_signal<T>::operator= (const T &t)
{
m_value = t;
(*this) (m_value);
return *this;
}
}

View File

@ -60,6 +60,19 @@ test_linking_pointers (void)
}
///////////////////////////////////////////////////////////////////////////////
void
test_value_signal (void)
{
util::value_signal<unsigned> 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;
}