diff options
author | Kevin Smith <git@kismith.co.uk> | 2011-07-01 09:19:49 (GMT) |
---|---|---|
committer | Kevin Smith <git@kismith.co.uk> | 2011-07-01 09:19:49 (GMT) |
commit | 2da71a8a85486a494343f1662d64fb5ae5a2a44e (patch) | |
tree | 23992f9f2a00bac23b345e5c2cc9c1194efc25be /src/com/isode/stroke/signals | |
download | stroke-2da71a8a85486a494343f1662d64fb5ae5a2a44e.zip stroke-2da71a8a85486a494343f1662d64fb5ae5a2a44e.tar.bz2 |
Initial import
Diffstat (limited to 'src/com/isode/stroke/signals')
-rw-r--r-- | src/com/isode/stroke/signals/Signal.java | 54 | ||||
-rw-r--r-- | src/com/isode/stroke/signals/Signal1.java | 48 | ||||
-rw-r--r-- | src/com/isode/stroke/signals/Signal2.java | 40 | ||||
-rw-r--r-- | src/com/isode/stroke/signals/SignalConnection.java | 15 | ||||
-rw-r--r-- | src/com/isode/stroke/signals/Slot.java | 13 | ||||
-rw-r--r-- | src/com/isode/stroke/signals/Slot1.java | 13 | ||||
-rw-r--r-- | src/com/isode/stroke/signals/Slot2.java | 13 |
7 files changed, 196 insertions, 0 deletions
diff --git a/src/com/isode/stroke/signals/Signal.java b/src/com/isode/stroke/signals/Signal.java new file mode 100644 index 0000000..cfa8665 --- /dev/null +++ b/src/com/isode/stroke/signals/Signal.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2010, Isode Limited, London, England. + * All rights reserved. + */ +package com.isode.stroke.signals; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +/** + * An approximation of the boost::signals system, although a little more warty. + */ +public class Signal { + + private final Map<SignalConnection, Slot> binds_ = Collections.synchronizedMap(new HashMap<SignalConnection, Slot>()); + + public SignalConnection connect(Slot bind) { + final SignalConnection connection = new SignalConnection(); + binds_.put(connection, bind); + connection.onDestroyed.connectWithoutReturn(new Slot() { + + public void call() { + binds_.remove(connection); + } + }); + return connection; + } + + public SignalConnection connect(final Signal target) { + return connect(new Slot() { + public void call() { + target.emit(); + } + }); + } + + void connectWithoutReturn(Slot bind) { + binds_.put(null, bind); + } + + public void emit() { + ArrayList<Slot> binds = new ArrayList<Slot>(); + binds.addAll(binds_.values()); + for (Slot bind : binds) { + bind.call(); + } + } + + public void disconnectAll() { + binds_.clear(); + } +} diff --git a/src/com/isode/stroke/signals/Signal1.java b/src/com/isode/stroke/signals/Signal1.java new file mode 100644 index 0000000..c799d4c --- /dev/null +++ b/src/com/isode/stroke/signals/Signal1.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2010, Isode Limited, London, England. + * All rights reserved. + */ + +package com.isode.stroke.signals; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +/** + * An approximation of the boost::signals system, although a little more warty. + */ +public class Signal1<T1> { + private final Map<SignalConnection, Slot1<T1> > binds_ = Collections.synchronizedMap(new HashMap<SignalConnection, Slot1<T1> >()); + public SignalConnection connect(Slot1<T1> bind) { + final SignalConnection connection = new SignalConnection(); + binds_.put(connection, bind); + connection.onDestroyed.connect(new Slot() { + public void call() { + binds_.remove(connection); + } + }); + return connection; + } + + public void emit(T1 p1) { + ArrayList<Slot1<T1>> binds = new ArrayList<Slot1<T1>>(); + binds.addAll(binds_.values()); + for (Slot1<T1> bind : binds) { + bind.call(p1); + } + } + + public SignalConnection connect(final Signal1<T1> target) { + return connect(new Slot1<T1>() { + public void call(T1 p1) { + target.emit(p1); + } + }); + } + + public void disconnectAll() { + binds_.clear(); + } +} diff --git a/src/com/isode/stroke/signals/Signal2.java b/src/com/isode/stroke/signals/Signal2.java new file mode 100644 index 0000000..fa3c4b5 --- /dev/null +++ b/src/com/isode/stroke/signals/Signal2.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2010, Isode Limited, London, England. + * All rights reserved. + */ + +package com.isode.stroke.signals; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +/** + * An approximation of the boost::signals system, although a little more warty. + */ +public class Signal2<T1, T2> { + private final Map<SignalConnection, Slot2<T1, T2> > binds_ = Collections.synchronizedMap(new HashMap<SignalConnection, Slot2<T1, T2> >()); + public SignalConnection connect(Slot2<T1, T2> bind) { + final SignalConnection connection = new SignalConnection(); + binds_.put(connection, bind); + connection.onDestroyed.connect(new Slot() { + public void call() { + binds_.remove(connection); + } + }); + return connection; + } + + public void emit(T1 p1, T2 p2) { + ArrayList<Slot2<T1,T2>> binds = new ArrayList<Slot2<T1, T2>>(); + binds.addAll(binds_.values()); + for (Slot2<T1, T2> bind : binds) { + bind.call(p1, p2); + } + } + + public void disconnectAll() { + binds_.clear(); + } +} diff --git a/src/com/isode/stroke/signals/SignalConnection.java b/src/com/isode/stroke/signals/SignalConnection.java new file mode 100644 index 0000000..452c80b --- /dev/null +++ b/src/com/isode/stroke/signals/SignalConnection.java @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2010, Isode Limited, London, England. + * All rights reserved. + */ + +package com.isode.stroke.signals; + + +public class SignalConnection { + public final Signal onDestroyed = new Signal(); + + public void disconnect() { + onDestroyed.emit(); + } +} diff --git a/src/com/isode/stroke/signals/Slot.java b/src/com/isode/stroke/signals/Slot.java new file mode 100644 index 0000000..35b8c70 --- /dev/null +++ b/src/com/isode/stroke/signals/Slot.java @@ -0,0 +1,13 @@ +/* + * Copyright (c) 2010, Isode Limited, London, England. + * All rights reserved. + */ + +package com.isode.stroke.signals; + +/** + * Bind class for connecting to a signal. + */ +public interface Slot { + void call(); +} diff --git a/src/com/isode/stroke/signals/Slot1.java b/src/com/isode/stroke/signals/Slot1.java new file mode 100644 index 0000000..a8f0179 --- /dev/null +++ b/src/com/isode/stroke/signals/Slot1.java @@ -0,0 +1,13 @@ +/* + * Copyright (c) 2010, Isode Limited, London, England. + * All rights reserved. + */ + +package com.isode.stroke.signals; + +/** + * Bind class for connecting to a signal. + */ +public interface Slot1<T1> { + void call(T1 p1); +} diff --git a/src/com/isode/stroke/signals/Slot2.java b/src/com/isode/stroke/signals/Slot2.java new file mode 100644 index 0000000..b3b9330 --- /dev/null +++ b/src/com/isode/stroke/signals/Slot2.java @@ -0,0 +1,13 @@ +/* + * Copyright (c) 2010, Isode Limited, London, England. + * All rights reserved. + */ + +package com.isode.stroke.signals; + +/** + * Bind class for connecting to a signal. + */ +public interface Slot2<T1, T2> { + void call(T1 p1, T2 p2); +} |