5 #ifndef LODESTAR_SIGNAL_HPP
6 #define LODESTAR_SIGNAL_HPP
13 #include "SignalBase.hpp"
14 #include "BlockProto.hpp"
15 #include "Lodestar/GlobalConstants.hpp"
16 #include "Lodestar/aux/DynamicData.hpp"
17 #include "Lodestar/aux/TemplateTraits.hpp"
21 template<
typename TObject =
void *,
typename TIndicated = TObject>
24 using Object = TObject;
25 using type = TIndicated;
46 unsigned int id()
const
51 operator TObject()
const
56 operator const TObject *()
const
75 object = signal.object;
80 template <typename TObject2, typename std::enable_if<std::is_convertible<TObject2, TObject>::value, TObject2>::type* =
nullptr>
88 template <typename TObject2, typename std::enable_if<!std::is_convertible<TObject2, TObject>::value, TObject2>::type* =
nullptr>
91 static_assert(std::is_convertible<TObject2, TObject>::value,
"Signal object type is not convertible.");
95 template <typename TObject2, typename std::enable_if<std::is_convertible<TObject2, TObject>::value, TObject2>::type* =
nullptr>
98 object = signal.object;
103 template <typename TObject2, typename std::enable_if<!std::is_convertible<TObject2, TObject>::value, TObject2>::type* =
nullptr>
106 static_assert(std::is_convertible<TObject2, TObject>::value,
"Signal object type is not convertible.");
110 template<
typename TObject1,
typename TObject2>
111 friend typename std::enable_if<std::is_convertible<TObject1, TObject2>::value,
Signal<TObject1>>::type
114 template<
typename TObject1,
typename TObject2>
115 friend typename std::enable_if<!std::is_convertible<TObject1, TObject2>::value,
Signal<TObject1>>::type
118 template<
typename TObject1,
typename TObject2>
119 friend typename std::enable_if<std::is_convertible<TObject1, TObject2>::value,
Signal<TObject1>>::type
122 template<
typename TObject1,
typename TObject2>
123 friend typename std::enable_if<!std::is_convertible<TObject1, TObject2>::value,
Signal<TObject1>>::type
126 template<
typename TObject1,
typename TObject2>
127 friend typename std::enable_if<std::is_convertible<TObject1, TObject2>::value,
Signal<TObject1>>::type
130 template<
typename TObject1,
typename TObject2>
131 friend typename std::enable_if<!std::is_convertible<TObject1, TObject2>::value,
Signal<TObject1>>::type
134 template<
typename TObject1,
typename TObject2>
135 friend typename std::enable_if<std::is_convertible<TObject1, TObject2>::value,
Signal<TObject1>>::type
138 template<
typename TObject1,
typename TObject2>
139 friend typename std::enable_if<!std::is_convertible<TObject1, TObject2>::value,
Signal<TObject1>>::type
144 bool isDynamicData()
const
146 return std::is_same<TObject, ls::aux::DynamicData>::value;
149 template <
typename TInstance,
typename TShadow = TObject>
150 typename std::enable_if<!std::is_same<TShadow, ls::aux::DynamicData>::value,
bool>::type isType()
const
152 return std::is_same<TInstance, TObject>::value;
155 template <
typename TInstance,
typename TShadow = TObject>
156 typename std::enable_if<std::is_same<TShadow, ls::aux::DynamicData>::value,
bool>::type isType()
const
158 return object.data.template is<TInstance>();
161 template <
typename TInstance>
162 static bool isSignal()
167 template <
typename TInstance>
168 static bool isSignal(
const TInstance &)
189 static_assert(other->
connectionNumber < 2,
"There cannot be multiple connections to an input slot.");
210 assert(other.
connectionNumber < 2 &&
"There cannot be multiple connections to an input slot.");
220 if ((res1 == 1) && (res2 == 1)) {
235 if ((res1 == 1) && (res2 == 1)) {
252 template <
typename TInstance>
253 static typename std::enable_if<ls::aux::TemplateTraits::isInstance<TInstance, Signal>::value, TInstance>::type toSignal(
const TInstance &obj)
258 template <
typename TInstance>
259 static typename std::enable_if<!ls::aux::TemplateTraits::isInstance<TInstance, Signal>::value,
Signal<TInstance>>::type toSignal(
const TInstance &obj)
267 template<
typename TObject1,
typename TObject2>
268 typename std::enable_if<std::is_convertible<TObject1, TObject2>::value,
Signal<TObject1>>::type
271 TObject1 obj = signal1.object + signal2.object;
275 template<
typename TObject1,
typename TObject2>
276 typename std::enable_if<!std::is_convertible<TObject1, TObject2>::value, Signal<TObject1>>::type
277 operator+(
const Signal<TObject1> &signal1,
const Signal<TObject2> &signal2)
279 static_assert(std::is_convertible<TObject1, TObject2>::value,
"Signal object type is not convertible.");
283 template<
typename TObject1,
typename TObject2>
284 typename std::enable_if<std::is_convertible<TObject1, TObject2>::value, Signal<TObject1>>::type
285 operator-(
const Signal<TObject1> &signal1,
const Signal<TObject2> &signal2)
287 TObject1 obj = signal1.object - signal2.object;
288 return Signal<TObject1>{obj};
291 template<
typename TObject1,
typename TObject2>
292 typename std::enable_if<!std::is_convertible<TObject1, TObject2>::value, Signal<TObject1>>::type
293 operator-(
const Signal<TObject1> &signal1,
const Signal<TObject2> &signal2)
295 static_assert(std::is_convertible<TObject1, TObject2>::value,
"Signal object type is not convertible.");
299 template<
typename TObject1,
typename TObject2>
300 typename std::enable_if<std::is_convertible<TObject1, TObject2>::value, Signal<TObject1>>::type
301 operator*(
const Signal<TObject1> &signal1,
const Signal<TObject2> &signal2)
303 TObject1 obj = signal1.object * signal2.object;
304 return Signal<TObject1>{obj};
307 template<
typename TObject1,
typename TObject2>
308 typename std::enable_if<!std::is_convertible<TObject1, TObject2>::value, Signal<TObject1>>::type
309 operator*(
const Signal<TObject1> &signal1,
const Signal<TObject2> &signal2)
311 static_assert(std::is_convertible<TObject1, TObject2>::value,
"Signal object type is not convertible.");
315 template<
typename TObject1,
typename TObject2>
316 typename std::enable_if<std::is_convertible<TObject1, TObject2>::value, Signal<TObject1>>::type
317 operator/(
const Signal<TObject1> &signal1,
const Signal<TObject2> &signal2)
319 TObject1 obj = signal1.object / signal2.object;
320 return Signal<TObject1>{obj};
323 template<
typename TObject1,
typename TObject2>
324 typename std::enable_if<!std::is_convertible<TObject1, TObject2>::value, Signal<TObject1>>::type
325 operator/(
const Signal<TObject1> &signal1,
const Signal<TObject2> &signal2)
327 static_assert(std::is_convertible<TObject1, TObject2>::value,
"Signal object type is not convertible.");
331 template <
typename TObject>
332 static std::ostream& operator<<(std::ostream& os,
const Signal<TObject>& signal)
334 os << (TObject) signal;
341 #endif //LODESTAR_SIGNAL_HPP