31 #include <dspatch/Common.h>
48 class DLLEXPORT Signal final
51 NONCOPYABLE( Signal );
52 DEFINE_PTRS( Signal );
57 bool HasValue()
const;
59 template <
class ValueType>
60 ValueType* GetValue();
62 template <
class ValueType>
63 void SetValue( ValueType
const& newValue );
65 bool CopySignal( Signal::SPtr
const& fromSignal );
66 bool MoveSignal( Signal::SPtr
const& fromSignal );
70 std::type_info
const& GetType()
const;
75 NONCOPYABLE( _ValueHolder );
77 _ValueHolder() =
default;
78 virtual ~_ValueHolder() =
default;
80 virtual std::type_info
const& GetType()
const = 0;
81 virtual _ValueHolder* GetCopy()
const = 0;
82 virtual void SetValue( _ValueHolder* valueHolder ) = 0;
85 template <
class ValueType>
86 struct _Value final : _ValueHolder
88 NONCOPYABLE( _Value );
90 _Value( ValueType
const& value )
92 , type( typeid( ValueType ) )
96 virtual std::type_info
const& GetType()
const override
101 virtual _ValueHolder* GetCopy()
const override
103 return new _Value( value );
106 virtual void SetValue( _ValueHolder* valueHolder )
override
108 value = ( (_Value<ValueType>*)valueHolder )->value;
112 std::type_info
const& type;
115 _ValueHolder* _valueHolder =
nullptr;
116 bool _hasValue =
false;
119 template <
class ValueType>
120 ValueType* Signal::GetValue()
130 if ( _hasValue && GetType() ==
typeid( ValueType ) )
132 return &( (_Value<ValueType>*)_valueHolder )->value;
140 template <
class ValueType>
141 void Signal::SetValue( ValueType
const& newValue )
143 if ( GetType() ==
typeid( ValueType ) )
145 ( (_Value<ValueType>*)_valueHolder )->value = newValue;
150 _valueHolder =
new _Value<ValueType>( newValue );