diff options
| -rw-r--r-- | src/com/isode/stroke/muc/MUCImpl.java | 2 | ||||
| -rw-r--r-- | src/com/isode/stroke/signals/BaseSignal.java | 62 | ||||
| -rw-r--r-- | src/com/isode/stroke/signals/BaseSlot.java | 9 | ||||
| -rw-r--r-- | src/com/isode/stroke/signals/Signal.java | 35 | ||||
| -rw-r--r-- | src/com/isode/stroke/signals/Signal1.java | 31 | ||||
| -rw-r--r-- | src/com/isode/stroke/signals/Signal2.java | 31 | ||||
| -rw-r--r-- | src/com/isode/stroke/signals/Signal3.java | 39 | ||||
| -rw-r--r-- | src/com/isode/stroke/signals/Signal4.java | 40 | ||||
| -rw-r--r-- | src/com/isode/stroke/signals/Signal7.java | 38 | ||||
| -rw-r--r-- | src/com/isode/stroke/signals/SignalConnection.java | 17 | ||||
| -rw-r--r-- | src/com/isode/stroke/signals/Slot.java | 2 | ||||
| -rw-r--r-- | src/com/isode/stroke/signals/Slot1.java | 2 | ||||
| -rw-r--r-- | src/com/isode/stroke/signals/Slot2.java | 2 | ||||
| -rw-r--r-- | src/com/isode/stroke/signals/Slot3.java | 2 | ||||
| -rw-r--r-- | src/com/isode/stroke/signals/Slot4.java | 2 | ||||
| -rw-r--r-- | src/com/isode/stroke/signals/Slot7.java | 2 |
16 files changed, 137 insertions, 179 deletions
diff --git a/src/com/isode/stroke/muc/MUCImpl.java b/src/com/isode/stroke/muc/MUCImpl.java index 444b331..26be309 100644 --- a/src/com/isode/stroke/muc/MUCImpl.java +++ b/src/com/isode/stroke/muc/MUCImpl.java | |||
| @@ -724,7 +724,7 @@ public class MUCImpl extends MUC { | |||
| 724 | @Override | 724 | @Override |
| 725 | public void disconnect() { | 725 | public void disconnect() { |
| 726 | if (scopedConnection_ != null) { | 726 | if (scopedConnection_ != null) { |
| 727 | scopedConnection_.onDestroyed.emit(); | 727 | scopedConnection_.disconnect(); |
| 728 | scopedConnection_ = null; | 728 | scopedConnection_ = null; |
| 729 | } | 729 | } |
| 730 | } | 730 | } |
diff --git a/src/com/isode/stroke/signals/BaseSignal.java b/src/com/isode/stroke/signals/BaseSignal.java new file mode 100644 index 0000000..de1bd6e --- /dev/null +++ b/src/com/isode/stroke/signals/BaseSignal.java | |||
| @@ -0,0 +1,62 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (c) 2015, Isode Limited, London, England. | ||
| 3 | * All rights reserved. | ||
| 4 | */ | ||
| 5 | package com.isode.stroke.signals; | ||
| 6 | |||
| 7 | import java.util.HashMap; | ||
| 8 | import java.util.Map; | ||
| 9 | |||
| 10 | /* package */ abstract class BaseSignal implements SignalConnection.DisconnectListener { | ||
| 11 | |||
| 12 | // Optimized for the case of 0 or 1 bind | ||
| 13 | private SignalConnection connection_; | ||
| 14 | private BaseSlot bind_; | ||
| 15 | private Map<SignalConnection, BaseSlot> binds_; | ||
| 16 | |||
| 17 | protected final synchronized SignalConnection addBind(final BaseSlot bind) { | ||
| 18 | final SignalConnection connection = new SignalConnection(this); | ||
| 19 | if (binds_ != null) { | ||
| 20 | binds_.put(connection, bind); | ||
| 21 | } else if (connection_ != null) { | ||
| 22 | binds_ = new HashMap<SignalConnection, BaseSlot>(); | ||
| 23 | binds_.put(connection_, bind_); | ||
| 24 | connection_ = null; | ||
| 25 | bind_ = null; | ||
| 26 | binds_.put(connection, bind); | ||
| 27 | } else { | ||
| 28 | connection_ = connection; | ||
| 29 | bind_ = bind; | ||
| 30 | } | ||
| 31 | return connection; | ||
| 32 | } | ||
| 33 | |||
| 34 | protected final synchronized BaseSlot[] getBinds() { | ||
| 35 | if (binds_ != null) { | ||
| 36 | return binds_.values().toArray(new BaseSlot[binds_.size()]); | ||
| 37 | } else if (connection_ != null) { | ||
| 38 | return new BaseSlot[]{bind_}; | ||
| 39 | } else { | ||
| 40 | return null; // return null rather than allocate an empty array | ||
| 41 | } | ||
| 42 | } | ||
| 43 | |||
| 44 | @Override | ||
| 45 | public final synchronized void onSignalConnectionDisconnect(final SignalConnection connection) { | ||
| 46 | if (binds_ != null) { | ||
| 47 | binds_.remove(connection); | ||
| 48 | } else if (connection_ == connection) { | ||
| 49 | connection_ = null; | ||
| 50 | bind_ = null; | ||
| 51 | } | ||
| 52 | } | ||
| 53 | |||
| 54 | public final synchronized void disconnectAll() { | ||
| 55 | if (binds_ != null) { | ||
| 56 | binds_.clear(); | ||
| 57 | } else { | ||
| 58 | connection_ = null; | ||
| 59 | bind_ = null; | ||
| 60 | } | ||
| 61 | } | ||
| 62 | } | ||
diff --git a/src/com/isode/stroke/signals/BaseSlot.java b/src/com/isode/stroke/signals/BaseSlot.java new file mode 100644 index 0000000..9b8ac13 --- /dev/null +++ b/src/com/isode/stroke/signals/BaseSlot.java | |||
| @@ -0,0 +1,9 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (c) 2015, Isode Limited, London, England. | ||
| 3 | * All rights reserved. | ||
| 4 | */ | ||
| 5 | package com.isode.stroke.signals; | ||
| 6 | |||
| 7 | /* package */ interface BaseSlot { | ||
| 8 | |||
| 9 | } | ||
diff --git a/src/com/isode/stroke/signals/Signal.java b/src/com/isode/stroke/signals/Signal.java index cfa8665..1821cb0 100644 --- a/src/com/isode/stroke/signals/Signal.java +++ b/src/com/isode/stroke/signals/Signal.java | |||
| @@ -1,31 +1,17 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (c) 2010, Isode Limited, London, England. | 2 | * Copyright (c) 2010-2015, Isode Limited, London, England. |
| 3 | * All rights reserved. | 3 | * All rights reserved. |
| 4 | */ | 4 | */ |
| 5 | package com.isode.stroke.signals; | 5 | package com.isode.stroke.signals; |
| 6 | 6 | ||
| 7 | import java.util.ArrayList; | ||
| 8 | import java.util.Collections; | ||
| 9 | import java.util.HashMap; | ||
| 10 | import java.util.Map; | ||
| 11 | 7 | ||
| 12 | /** | 8 | /** |
| 13 | * An approximation of the boost::signals system, although a little more warty. | 9 | * An approximation of the boost::signals system, although a little more warty. |
| 14 | */ | 10 | */ |
| 15 | public class Signal { | 11 | public final class Signal extends BaseSignal { |
| 16 | |||
| 17 | private final Map<SignalConnection, Slot> binds_ = Collections.synchronizedMap(new HashMap<SignalConnection, Slot>()); | ||
| 18 | 12 | ||
| 19 | public SignalConnection connect(Slot bind) { | 13 | public SignalConnection connect(Slot bind) { |
| 20 | final SignalConnection connection = new SignalConnection(); | 14 | return addBind(bind); |
| 21 | binds_.put(connection, bind); | ||
| 22 | connection.onDestroyed.connectWithoutReturn(new Slot() { | ||
| 23 | |||
| 24 | public void call() { | ||
| 25 | binds_.remove(connection); | ||
| 26 | } | ||
| 27 | }); | ||
| 28 | return connection; | ||
| 29 | } | 15 | } |
| 30 | 16 | ||
| 31 | public SignalConnection connect(final Signal target) { | 17 | public SignalConnection connect(final Signal target) { |
| @@ -36,19 +22,12 @@ public class Signal { | |||
| 36 | }); | 22 | }); |
| 37 | } | 23 | } |
| 38 | 24 | ||
| 39 | void connectWithoutReturn(Slot bind) { | ||
| 40 | binds_.put(null, bind); | ||
| 41 | } | ||
| 42 | |||
| 43 | public void emit() { | 25 | public void emit() { |
| 44 | ArrayList<Slot> binds = new ArrayList<Slot>(); | 26 | final BaseSlot[] binds = getBinds(); |
| 45 | binds.addAll(binds_.values()); | 27 | if (binds == null) {return;} |
| 46 | for (Slot bind : binds) { | 28 | for (BaseSlot bind : binds) { |
| 47 | bind.call(); | 29 | ((Slot)bind).call(); |
| 48 | } | 30 | } |
| 49 | } | 31 | } |
| 50 | 32 | ||
| 51 | public void disconnectAll() { | ||
| 52 | binds_.clear(); | ||
| 53 | } | ||
| 54 | } | 33 | } |
diff --git a/src/com/isode/stroke/signals/Signal1.java b/src/com/isode/stroke/signals/Signal1.java index c799d4c..9787096 100644 --- a/src/com/isode/stroke/signals/Signal1.java +++ b/src/com/isode/stroke/signals/Signal1.java | |||
| @@ -1,36 +1,25 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (c) 2010, Isode Limited, London, England. | 2 | * Copyright (c) 2010-2015, Isode Limited, London, England. |
| 3 | * All rights reserved. | 3 | * All rights reserved. |
| 4 | */ | 4 | */ |
| 5 | 5 | ||
| 6 | package com.isode.stroke.signals; | 6 | package com.isode.stroke.signals; |
| 7 | 7 | ||
| 8 | import java.util.ArrayList; | ||
| 9 | import java.util.Collections; | ||
| 10 | import java.util.HashMap; | ||
| 11 | import java.util.Map; | ||
| 12 | 8 | ||
| 13 | /** | 9 | /** |
| 14 | * An approximation of the boost::signals system, although a little more warty. | 10 | * An approximation of the boost::signals system, although a little more warty. |
| 15 | */ | 11 | */ |
| 16 | public class Signal1<T1> { | 12 | public final class Signal1<T1> extends BaseSignal { |
| 17 | private final Map<SignalConnection, Slot1<T1> > binds_ = Collections.synchronizedMap(new HashMap<SignalConnection, Slot1<T1> >()); | ||
| 18 | public SignalConnection connect(Slot1<T1> bind) { | 13 | public SignalConnection connect(Slot1<T1> bind) { |
| 19 | final SignalConnection connection = new SignalConnection(); | 14 | return addBind(bind); |
| 20 | binds_.put(connection, bind); | ||
| 21 | connection.onDestroyed.connect(new Slot() { | ||
| 22 | public void call() { | ||
| 23 | binds_.remove(connection); | ||
| 24 | } | ||
| 25 | }); | ||
| 26 | return connection; | ||
| 27 | } | 15 | } |
| 28 | 16 | ||
| 17 | @SuppressWarnings("unchecked") | ||
| 29 | public void emit(T1 p1) { | 18 | public void emit(T1 p1) { |
| 30 | ArrayList<Slot1<T1>> binds = new ArrayList<Slot1<T1>>(); | 19 | final BaseSlot[] binds = getBinds(); |
| 31 | binds.addAll(binds_.values()); | 20 | if (binds == null) {return;} |
| 32 | for (Slot1<T1> bind : binds) { | 21 | for (BaseSlot bind : binds) { |
| 33 | bind.call(p1); | 22 | ((Slot1<T1>)bind).call(p1); |
| 34 | } | 23 | } |
| 35 | } | 24 | } |
| 36 | 25 | ||
| @@ -41,8 +30,4 @@ public class Signal1<T1> { | |||
| 41 | } | 30 | } |
| 42 | }); | 31 | }); |
| 43 | } | 32 | } |
| 44 | |||
| 45 | public void disconnectAll() { | ||
| 46 | binds_.clear(); | ||
| 47 | } | ||
| 48 | } | 33 | } |
diff --git a/src/com/isode/stroke/signals/Signal2.java b/src/com/isode/stroke/signals/Signal2.java index fa3c4b5..72c9de0 100644 --- a/src/com/isode/stroke/signals/Signal2.java +++ b/src/com/isode/stroke/signals/Signal2.java | |||
| @@ -1,40 +1,25 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (c) 2010, Isode Limited, London, England. | 2 | * Copyright (c) 2010-2015, Isode Limited, London, England. |
| 3 | * All rights reserved. | 3 | * All rights reserved. |
| 4 | */ | 4 | */ |
| 5 | 5 | ||
| 6 | package com.isode.stroke.signals; | 6 | package com.isode.stroke.signals; |
| 7 | 7 | ||
| 8 | import java.util.ArrayList; | ||
| 9 | import java.util.Collections; | ||
| 10 | import java.util.HashMap; | ||
| 11 | import java.util.Map; | ||
| 12 | 8 | ||
| 13 | /** | 9 | /** |
| 14 | * An approximation of the boost::signals system, although a little more warty. | 10 | * An approximation of the boost::signals system, although a little more warty. |
| 15 | */ | 11 | */ |
| 16 | public class Signal2<T1, T2> { | 12 | public class Signal2<T1, T2> extends BaseSignal { |
| 17 | private final Map<SignalConnection, Slot2<T1, T2> > binds_ = Collections.synchronizedMap(new HashMap<SignalConnection, Slot2<T1, T2> >()); | ||
| 18 | public SignalConnection connect(Slot2<T1, T2> bind) { | 13 | public SignalConnection connect(Slot2<T1, T2> bind) { |
| 19 | final SignalConnection connection = new SignalConnection(); | 14 | return addBind(bind); |
| 20 | binds_.put(connection, bind); | ||
| 21 | connection.onDestroyed.connect(new Slot() { | ||
| 22 | public void call() { | ||
| 23 | binds_.remove(connection); | ||
| 24 | } | ||
| 25 | }); | ||
| 26 | return connection; | ||
| 27 | } | 15 | } |
| 28 | 16 | ||
| 17 | @SuppressWarnings("unchecked") | ||
| 29 | public void emit(T1 p1, T2 p2) { | 18 | public void emit(T1 p1, T2 p2) { |
| 30 | ArrayList<Slot2<T1,T2>> binds = new ArrayList<Slot2<T1, T2>>(); | 19 | final BaseSlot[] binds = getBinds(); |
| 31 | binds.addAll(binds_.values()); | 20 | if (binds == null) {return;} |
| 32 | for (Slot2<T1, T2> bind : binds) { | 21 | for (BaseSlot bind : binds) { |
| 33 | bind.call(p1, p2); | 22 | ((Slot2<T1, T2>)bind).call(p1, p2); |
| 34 | } | 23 | } |
| 35 | } | 24 | } |
| 36 | |||
| 37 | public void disconnectAll() { | ||
| 38 | binds_.clear(); | ||
| 39 | } | ||
| 40 | } | 25 | } |
diff --git a/src/com/isode/stroke/signals/Signal3.java b/src/com/isode/stroke/signals/Signal3.java index b9151dc..014f047 100644 --- a/src/com/isode/stroke/signals/Signal3.java +++ b/src/com/isode/stroke/signals/Signal3.java | |||
| @@ -1,15 +1,10 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (c) 2012, Isode Limited, London, England. | 2 | * Copyright (c) 2010-2015, Isode Limited, London, England. |
| 3 | * All rights reserved. | 3 | * All rights reserved. |
| 4 | */ | 4 | */ |
| 5 | 5 | ||
| 6 | package com.isode.stroke.signals; | 6 | package com.isode.stroke.signals; |
| 7 | 7 | ||
| 8 | import java.util.ArrayList; | ||
| 9 | import java.util.Collections; | ||
| 10 | import java.util.HashMap; | ||
| 11 | import java.util.List; | ||
| 12 | import java.util.Map; | ||
| 13 | 8 | ||
| 14 | /** | 9 | /** |
| 15 | * An approximation of the boost::signals system with 3 parameters | 10 | * An approximation of the boost::signals system with 3 parameters |
| @@ -17,24 +12,14 @@ import java.util.Map; | |||
| 17 | * @param <T2> Type 2 | 12 | * @param <T2> Type 2 |
| 18 | * @param <T3> Type 3 | 13 | * @param <T3> Type 3 |
| 19 | */ | 14 | */ |
| 20 | public class Signal3<T1, T2, T3> { | 15 | public class Signal3<T1, T2, T3> extends BaseSignal { |
| 21 | private final Map<SignalConnection, Slot3<T1, T2,T3> > binds_ = Collections.synchronizedMap( | ||
| 22 | new HashMap<SignalConnection, Slot3<T1, T2,T3> >()); | ||
| 23 | |||
| 24 | /** | 16 | /** |
| 25 | * Add a slot which will be notified | 17 | * Add a slot which will be notified |
| 26 | * @param bind slot, not null | 18 | * @param bind slot, not null |
| 27 | * @return signal connection | 19 | * @return signal connection |
| 28 | */ | 20 | */ |
| 29 | public SignalConnection connect(Slot3<T1, T2,T3> bind) { | 21 | public SignalConnection connect(Slot3<T1, T2,T3> bind) { |
| 30 | final SignalConnection connection = new SignalConnection(); | 22 | return addBind(bind); |
| 31 | binds_.put(connection, bind); | ||
| 32 | connection.onDestroyed.connect(new Slot() { | ||
| 33 | public void call() { | ||
| 34 | binds_.remove(connection); | ||
| 35 | } | ||
| 36 | }); | ||
| 37 | return connection; | ||
| 38 | } | 23 | } |
| 39 | 24 | ||
| 40 | /** | 25 | /** |
| @@ -43,18 +28,12 @@ public class Signal3<T1, T2, T3> { | |||
| 43 | * @param p2 parameter value 2 | 28 | * @param p2 parameter value 2 |
| 44 | * @param p3 parameter value 3 | 29 | * @param p3 parameter value 3 |
| 45 | */ | 30 | */ |
| 46 | public void emit(T1 p1, T2 p2,T3 p3) { | 31 | @SuppressWarnings("unchecked") |
| 47 | List<Slot3<T1,T2, T3>> binds = new ArrayList<Slot3<T1, T2, T3>>(); | 32 | public void emit(T1 p1, T2 p2, T3 p3) { |
| 48 | binds.addAll(binds_.values()); | 33 | final BaseSlot[] binds = getBinds(); |
| 49 | for (Slot3<T1, T2, T3> bind : binds) { | 34 | if (binds == null) {return;} |
| 50 | bind.call(p1, p2, p3); | 35 | for (BaseSlot bind : binds) { |
| 36 | ((Slot3<T1, T2, T3>)bind).call(p1, p2, p3); | ||
| 51 | } | 37 | } |
| 52 | } | 38 | } |
| 53 | |||
| 54 | /** | ||
| 55 | * Remove all slots(listeners) | ||
| 56 | */ | ||
| 57 | public void disconnectAll() { | ||
| 58 | binds_.clear(); | ||
| 59 | } | ||
| 60 | } | 39 | } |
diff --git a/src/com/isode/stroke/signals/Signal4.java b/src/com/isode/stroke/signals/Signal4.java index 6a29641..edf30ed 100644 --- a/src/com/isode/stroke/signals/Signal4.java +++ b/src/com/isode/stroke/signals/Signal4.java | |||
| @@ -1,18 +1,10 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (c) 2012-2013, Isode Limited, London, England. | 2 | * Copyright (c) 2012-2015, Isode Limited, London, England. |
| 3 | * All rights reserved. | 3 | * All rights reserved. |
| 4 | */ | 4 | */ |
| 5 | 5 | ||
| 6 | package com.isode.stroke.signals; | 6 | package com.isode.stroke.signals; |
| 7 | 7 | ||
| 8 | import java.util.ArrayList; | ||
| 9 | import java.util.Collections; | ||
| 10 | import java.util.HashMap; | ||
| 11 | import java.util.List; | ||
| 12 | import java.util.Map; | ||
| 13 | |||
| 14 | import com.isode.stroke.signals.SignalConnection; | ||
| 15 | import com.isode.stroke.signals.Slot; | ||
| 16 | 8 | ||
| 17 | 9 | ||
| 18 | /** | 10 | /** |
| @@ -22,24 +14,14 @@ import com.isode.stroke.signals.Slot; | |||
| 22 | * @param <T3> Type 3 | 14 | * @param <T3> Type 3 |
| 23 | * @param <T4> Type 4 | 15 | * @param <T4> Type 4 |
| 24 | */ | 16 | */ |
| 25 | public class Signal4<T1, T2, T3, T4> { | 17 | public class Signal4<T1, T2, T3, T4> extends BaseSignal { |
| 26 | private final Map<SignalConnection, Slot4<T1, T2, T3, T4> > binds_ = Collections.synchronizedMap( | ||
| 27 | new HashMap<SignalConnection, Slot4<T1, T2, T3, T4> >()); | ||
| 28 | |||
| 29 | /** | 18 | /** |
| 30 | * Add a slot which will be notified | 19 | * Add a slot which will be notified |
| 31 | * @param bind slot, not null | 20 | * @param bind slot, not null |
| 32 | * @return signal connection | 21 | * @return signal connection |
| 33 | */ | 22 | */ |
| 34 | public SignalConnection connect(Slot4<T1, T2, T3, T4> bind) { | 23 | public SignalConnection connect(Slot4<T1, T2, T3, T4> bind) { |
| 35 | final SignalConnection connection = new SignalConnection(); | 24 | return addBind(bind); |
| 36 | binds_.put(connection, bind); | ||
| 37 | connection.onDestroyed.connect(new Slot() { | ||
| 38 | public void call() { | ||
| 39 | binds_.remove(connection); | ||
| 40 | } | ||
| 41 | }); | ||
| 42 | return connection; | ||
| 43 | } | 25 | } |
| 44 | 26 | ||
| 45 | /** | 27 | /** |
| @@ -49,18 +31,12 @@ public class Signal4<T1, T2, T3, T4> { | |||
| 49 | * @param p3 parameter value 3 | 31 | * @param p3 parameter value 3 |
| 50 | * @param p4 parameter value 4 | 32 | * @param p4 parameter value 4 |
| 51 | */ | 33 | */ |
| 34 | @SuppressWarnings("unchecked") | ||
| 52 | public void emit(T1 p1, T2 p2, T3 p3, T4 p4) { | 35 | public void emit(T1 p1, T2 p2, T3 p3, T4 p4) { |
| 53 | List<Slot4<T1, T2, T3, T4>> binds = new ArrayList<Slot4<T1, T2, T3, T4>>(); | 36 | final BaseSlot[] binds = getBinds(); |
| 54 | binds.addAll(binds_.values()); | 37 | if (binds == null) {return;} |
| 55 | for (Slot4<T1, T2, T3, T4> bind : binds) { | 38 | for (BaseSlot bind : binds) { |
| 56 | bind.call(p1, p2, p3, p4); | 39 | ((Slot4<T1, T2, T3, T4>)bind).call(p1, p2, p3, p4); |
| 57 | } | 40 | } |
| 58 | } | 41 | } |
| 59 | |||
| 60 | /** | ||
| 61 | * Remove all slots(listeners) | ||
| 62 | */ | ||
| 63 | public void disconnectAll() { | ||
| 64 | binds_.clear(); | ||
| 65 | } | ||
| 66 | } | 42 | } |
diff --git a/src/com/isode/stroke/signals/Signal7.java b/src/com/isode/stroke/signals/Signal7.java index 296cc02..bbf6559 100644 --- a/src/com/isode/stroke/signals/Signal7.java +++ b/src/com/isode/stroke/signals/Signal7.java | |||
| @@ -5,14 +5,6 @@ | |||
| 5 | 5 | ||
| 6 | package com.isode.stroke.signals; | 6 | package com.isode.stroke.signals; |
| 7 | 7 | ||
| 8 | import java.util.ArrayList; | ||
| 9 | import java.util.Collections; | ||
| 10 | import java.util.HashMap; | ||
| 11 | import java.util.List; | ||
| 12 | import java.util.Map; | ||
| 13 | |||
| 14 | import com.isode.stroke.signals.SignalConnection; | ||
| 15 | import com.isode.stroke.signals.Slot; | ||
| 16 | 8 | ||
| 17 | 9 | ||
| 18 | /** | 10 | /** |
| @@ -22,24 +14,14 @@ import com.isode.stroke.signals.Slot; | |||
| 22 | * @param <T3> Type 3 | 14 | * @param <T3> Type 3 |
| 23 | * @param <T4> Type 4 | 15 | * @param <T4> Type 4 |
| 24 | */ | 16 | */ |
| 25 | public class Signal7<T1, T2, T3, T4, T5, T6, T7> { | 17 | public class Signal7<T1, T2, T3, T4, T5, T6, T7> extends BaseSignal { |
| 26 | private final Map<SignalConnection, Slot7<T1, T2, T3, T4, T5, T6, T7> > binds_ = Collections.synchronizedMap( | ||
| 27 | new HashMap<SignalConnection, Slot7<T1, T2, T3, T4, T5, T6, T7> >()); | ||
| 28 | |||
| 29 | /** | 18 | /** |
| 30 | * Add a slot which will be notified | 19 | * Add a slot which will be notified |
| 31 | * @param bind slot, not null | 20 | * @param bind slot, not null |
| 32 | * @return signal connection | 21 | * @return signal connection |
| 33 | */ | 22 | */ |
| 34 | public SignalConnection connect(Slot7<T1, T2, T3, T4, T5, T6, T7> bind) { | 23 | public SignalConnection connect(Slot7<T1, T2, T3, T4, T5, T6, T7> bind) { |
| 35 | final SignalConnection connection = new SignalConnection(); | 24 | return addBind(bind); |
| 36 | binds_.put(connection, bind); | ||
| 37 | connection.onDestroyed.connect(new Slot() { | ||
| 38 | public void call() { | ||
| 39 | binds_.remove(connection); | ||
| 40 | } | ||
| 41 | }); | ||
| 42 | return connection; | ||
| 43 | } | 25 | } |
| 44 | 26 | ||
| 45 | /** | 27 | /** |
| @@ -49,18 +31,12 @@ public class Signal7<T1, T2, T3, T4, T5, T6, T7> { | |||
| 49 | * @param p3 parameter value 3 | 31 | * @param p3 parameter value 3 |
| 50 | * @param p4 parameter value 4 | 32 | * @param p4 parameter value 4 |
| 51 | */ | 33 | */ |
| 34 | @SuppressWarnings("unchecked") | ||
| 52 | public void emit(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7) { | 35 | public void emit(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7) { |
| 53 | List<Slot7<T1, T2, T3, T4, T5, T6, T7>> binds = new ArrayList<Slot7<T1, T2, T3, T4, T5, T6, T7>>(); | 36 | final BaseSlot[] binds = getBinds(); |
| 54 | binds.addAll(binds_.values()); | 37 | if (binds == null) {return;} |
| 55 | for (Slot7<T1, T2, T3, T4, T5, T6, T7> bind : binds) { | 38 | for (BaseSlot bind : binds) { |
| 56 | bind.call(p1, p2, p3, p4, p5, p6, p7); | 39 | ((Slot7<T1, T2, T3, T4, T5, T6, T7>)bind).call(p1, p2, p3, p4, p5, p6, p7); |
| 57 | } | 40 | } |
| 58 | } | 41 | } |
| 59 | |||
| 60 | /** | ||
| 61 | * Remove all slots(listeners) | ||
| 62 | */ | ||
| 63 | public void disconnectAll() { | ||
| 64 | binds_.clear(); | ||
| 65 | } | ||
| 66 | } | 42 | } |
diff --git a/src/com/isode/stroke/signals/SignalConnection.java b/src/com/isode/stroke/signals/SignalConnection.java index 452c80b..30bbf82 100644 --- a/src/com/isode/stroke/signals/SignalConnection.java +++ b/src/com/isode/stroke/signals/SignalConnection.java | |||
| @@ -1,15 +1,22 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (c) 2010, Isode Limited, London, England. | 2 | * Copyright (c) 2010-2015, Isode Limited, London, England. |
| 3 | * All rights reserved. | 3 | * All rights reserved. |
| 4 | */ | 4 | */ |
| 5 | 5 | ||
| 6 | package com.isode.stroke.signals; | 6 | package com.isode.stroke.signals; |
| 7 | 7 | ||
| 8 | |||
| 9 | public class SignalConnection { | 8 | public class SignalConnection { |
| 10 | public final Signal onDestroyed = new Signal(); | 9 | interface DisconnectListener { |
| 11 | 10 | void onSignalConnectionDisconnect(SignalConnection connection); | |
| 11 | } | ||
| 12 | |||
| 13 | private final DisconnectListener listener; | ||
| 14 | |||
| 15 | SignalConnection(DisconnectListener listener) { | ||
| 16 | this.listener = listener; | ||
| 17 | } | ||
| 18 | |||
| 12 | public void disconnect() { | 19 | public void disconnect() { |
| 13 | onDestroyed.emit(); | 20 | listener.onSignalConnectionDisconnect(this); |
| 14 | } | 21 | } |
| 15 | } | 22 | } |
diff --git a/src/com/isode/stroke/signals/Slot.java b/src/com/isode/stroke/signals/Slot.java index 35b8c70..780892d 100644 --- a/src/com/isode/stroke/signals/Slot.java +++ b/src/com/isode/stroke/signals/Slot.java | |||
| @@ -8,6 +8,6 @@ package com.isode.stroke.signals; | |||
| 8 | /** | 8 | /** |
| 9 | * Bind class for connecting to a signal. | 9 | * Bind class for connecting to a signal. |
| 10 | */ | 10 | */ |
| 11 | public interface Slot { | 11 | public interface Slot extends BaseSlot { |
| 12 | void call(); | 12 | void call(); |
| 13 | } | 13 | } |
diff --git a/src/com/isode/stroke/signals/Slot1.java b/src/com/isode/stroke/signals/Slot1.java index a8f0179..001dca7 100644 --- a/src/com/isode/stroke/signals/Slot1.java +++ b/src/com/isode/stroke/signals/Slot1.java | |||
| @@ -8,6 +8,6 @@ package com.isode.stroke.signals; | |||
| 8 | /** | 8 | /** |
| 9 | * Bind class for connecting to a signal. | 9 | * Bind class for connecting to a signal. |
| 10 | */ | 10 | */ |
| 11 | public interface Slot1<T1> { | 11 | public interface Slot1<T1> extends BaseSlot { |
| 12 | void call(T1 p1); | 12 | void call(T1 p1); |
| 13 | } | 13 | } |
diff --git a/src/com/isode/stroke/signals/Slot2.java b/src/com/isode/stroke/signals/Slot2.java index b3b9330..03eb9a6 100644 --- a/src/com/isode/stroke/signals/Slot2.java +++ b/src/com/isode/stroke/signals/Slot2.java | |||
| @@ -8,6 +8,6 @@ package com.isode.stroke.signals; | |||
| 8 | /** | 8 | /** |
| 9 | * Bind class for connecting to a signal. | 9 | * Bind class for connecting to a signal. |
| 10 | */ | 10 | */ |
| 11 | public interface Slot2<T1, T2> { | 11 | public interface Slot2<T1, T2> extends BaseSlot { |
| 12 | void call(T1 p1, T2 p2); | 12 | void call(T1 p1, T2 p2); |
| 13 | } | 13 | } |
diff --git a/src/com/isode/stroke/signals/Slot3.java b/src/com/isode/stroke/signals/Slot3.java index ee5ccbc..63c371c 100644 --- a/src/com/isode/stroke/signals/Slot3.java +++ b/src/com/isode/stroke/signals/Slot3.java | |||
| @@ -11,7 +11,7 @@ package com.isode.stroke.signals; | |||
| 11 | * @param <T2> Type 2 | 11 | * @param <T2> Type 2 |
| 12 | * @param <T3> Type 3 | 12 | * @param <T3> Type 3 |
| 13 | */ | 13 | */ |
| 14 | public interface Slot3<T1, T2,T3> { | 14 | public interface Slot3<T1, T2,T3> extends BaseSlot { |
| 15 | /** | 15 | /** |
| 16 | * This method will be called on notification from a signal | 16 | * This method will be called on notification from a signal |
| 17 | * @param p1 parameter value 1 | 17 | * @param p1 parameter value 1 |
diff --git a/src/com/isode/stroke/signals/Slot4.java b/src/com/isode/stroke/signals/Slot4.java index 02e6fd9..93401db 100644 --- a/src/com/isode/stroke/signals/Slot4.java +++ b/src/com/isode/stroke/signals/Slot4.java | |||
| @@ -12,7 +12,7 @@ package com.isode.stroke.signals; | |||
| 12 | * @param <T3> Type 3 | 12 | * @param <T3> Type 3 |
| 13 | * @param <T4> Type 4 | 13 | * @param <T4> Type 4 |
| 14 | */ | 14 | */ |
| 15 | public interface Slot4<T1, T2, T3, T4> { | 15 | public interface Slot4<T1, T2, T3, T4> extends BaseSlot { |
| 16 | /** | 16 | /** |
| 17 | * This method will be called on notification from a signal | 17 | * This method will be called on notification from a signal |
| 18 | * @param p1 parameter value 1 | 18 | * @param p1 parameter value 1 |
diff --git a/src/com/isode/stroke/signals/Slot7.java b/src/com/isode/stroke/signals/Slot7.java index 7df6973..752d9a8 100644 --- a/src/com/isode/stroke/signals/Slot7.java +++ b/src/com/isode/stroke/signals/Slot7.java | |||
| @@ -15,7 +15,7 @@ package com.isode.stroke.signals; | |||
| 15 | * @param <T6> Type 6 | 15 | * @param <T6> Type 6 |
| 16 | * @param <T7> Type 7 | 16 | * @param <T7> Type 7 |
| 17 | */ | 17 | */ |
| 18 | public interface Slot7<T1, T2, T3, T4, T5, T6, T7> { | 18 | public interface Slot7<T1, T2, T3, T4, T5, T6, T7> extends BaseSlot { |
| 19 | /** | 19 | /** |
| 20 | * This method will be called on notification from a signal | 20 | * This method will be called on notification from a signal |
| 21 | * @param p1 parameter value 1 | 21 | * @param p1 parameter value 1 |
Swift