Skip to content

Commit

Permalink
add java multi state supports
Browse files Browse the repository at this point in the history
  • Loading branch information
fawdlstty committed Apr 2, 2021
1 parent d74906e commit 502cbca
Show file tree
Hide file tree
Showing 22 changed files with 133 additions and 20 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ State machine library for C, C++, C#, Java, JavaScript, Python, VB.Net
| Document |||| | ||
| Sync State Machine |||||||
| Async State Machine | | || | ||
| Multi State | ||| | | |
| Multi State | ||| | | |
| Thread Safe | ||| | | |
| Cancel Trigger | | || | | |
| Serilize | ||| | | |
Expand Down
2 changes: 1 addition & 1 deletion README.zh.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ C、C++、C#、Java、JavaScript、Python、VB.Net 的状态机库
| 文档 |||| | ||
| 同步状态机 |||||||
| 异步状态机 | | || | ||
| 多状态支持 | ||| | | |
| 多状态支持 | ||| | | |
| 线程安全 | ||| | | |
| 撤销触发 | | || | | |
| 序列化 | ||| | | |
Expand Down
94 changes: 94 additions & 0 deletions src_java/JSMLite/src/cn/fawdlstty/smlite/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -288,6 +288,100 @@ static void TestMethod9 () throws Exception {
Assert.AreEqual (_sm.GetState(), MyState.Rest);
}

static void TestMethod11 () throws Exception {
AtomicInteger n = new AtomicInteger(0);
AtomicBoolean entry_one = new AtomicBoolean(true);
SMLiteBuilder<Tuple2<MyState, MyState>, MyTrigger> _smb = new SMLiteBuilder ();
_smb.Configure (new Tuple2 (MyState.Rest, MyState.Rest))
.OnEntry (() -> { Assert.IsFalse (entry_one.get()); entry_one.set(true); n.addAndGet(1); })
.OnLeave (() -> { Assert.IsTrue (entry_one.get()); entry_one.set(false); n.addAndGet(10); })
.WhenChangeTo (MyTrigger.Run, new Tuple2 (MyState.Ready, MyState.Ready))
.WhenIgnore (MyTrigger.Close);
_smb.Configure (new Tuple2 (MyState.Ready, MyState.Ready))
.OnEntry (() -> { Assert.IsFalse (entry_one.get()); entry_one.set(true); n.addAndGet(100); })
.OnLeave (() -> { Assert.IsTrue (entry_one.get()); entry_one.set(false); n.addAndGet(1000); })
.WhenChangeTo (MyTrigger.Read, new Tuple2 (MyState.Reading, MyState.Reading))
.WhenChangeTo (MyTrigger.Write, new Tuple2 (MyState.Writing, MyState.Writing))
.WhenChangeTo (MyTrigger.Close, new Tuple2 (MyState.Rest, MyState.Rest));
_smb.Configure (new Tuple2 (MyState.Reading, MyState.Reading))
.OnEntry (() -> { Assert.IsFalse (entry_one.get()); entry_one.set(true); n.addAndGet(10000); })
.OnLeave (() -> { Assert.IsTrue (entry_one.get()); entry_one.set(false); n.addAndGet(100000); })
.WhenChangeTo (MyTrigger.FinishRead, new Tuple2 (MyState.Ready, MyState.Ready))
.WhenChangeTo (MyTrigger.Close, new Tuple2 (MyState.Rest, MyState.Rest));
_smb.Configure (new Tuple2 (MyState.Writing, MyState.Writing))
.OnEntry (() -> { Assert.IsFalse (entry_one.get()); entry_one.set(true); n.addAndGet(1000000); })
.OnLeave (() -> { Assert.IsTrue (entry_one.get()); entry_one.set(false); n.addAndGet(10000000); })
.WhenChangeTo (MyTrigger.FinishWrite, new Tuple2 (MyState.Ready, MyState.Ready))
.WhenChangeTo (MyTrigger.Close, new Tuple2 (MyState.Rest, MyState.Rest));

SMLite<Tuple2<MyState, MyState>, MyTrigger> _sm = _smb.Build (new Tuple2 (MyState.Rest, MyState.Rest));
Assert.AreEqual (_sm.GetState (), new Tuple2 (MyState.Rest, MyState.Rest));
Assert.AreEqual (n.get(), 0);
Assert.IsTrue (_sm.AllowTriggering (MyTrigger.Run));
Assert.IsTrue (_sm.AllowTriggering (MyTrigger.Close));
Assert.IsFalse (_sm.AllowTriggering (MyTrigger.Read));
Assert.IsFalse (_sm.AllowTriggering (MyTrigger.FinishRead));
Assert.IsFalse (_sm.AllowTriggering (MyTrigger.Write));
Assert.IsFalse (_sm.AllowTriggering (MyTrigger.FinishWrite));

_sm.Triggering (MyTrigger.Close);
Assert.AreEqual (_sm.GetState(), new Tuple2 (MyState.Rest, MyState.Rest));
Assert.AreEqual (n.get(), 0);

_sm.Triggering (MyTrigger.Close);
Assert.AreEqual (_sm.GetState(), new Tuple2 (MyState.Rest, MyState.Rest));
Assert.AreEqual (n.get(), 0);

_sm.Triggering (MyTrigger.Close);
Assert.AreEqual (_sm.GetState(), new Tuple2 (MyState.Rest, MyState.Rest));
Assert.AreEqual (n.get(), 0);

_sm.Triggering (MyTrigger.Run);
Assert.AreEqual (_sm.GetState(), new Tuple2 (MyState.Ready, MyState.Ready));
Assert.AreEqual (n.get(), 110);
Assert.IsFalse (_sm.AllowTriggering (MyTrigger.Run));
Assert.IsTrue (_sm.AllowTriggering (MyTrigger.Close));
Assert.IsTrue (_sm.AllowTriggering (MyTrigger.Read));
Assert.IsFalse (_sm.AllowTriggering (MyTrigger.FinishRead));
Assert.IsTrue (_sm.AllowTriggering (MyTrigger.Write));
Assert.IsFalse (_sm.AllowTriggering (MyTrigger.FinishWrite));

_sm.Triggering (MyTrigger.Close);
Assert.AreEqual (_sm.GetState(), new Tuple2 (MyState.Rest, MyState.Rest));
Assert.AreEqual (n.get(), 1111);
Assert.IsTrue (_sm.AllowTriggering (MyTrigger.Run));
Assert.IsTrue (_sm.AllowTriggering (MyTrigger.Close));
Assert.IsFalse (_sm.AllowTriggering (MyTrigger.Read));
Assert.IsFalse (_sm.AllowTriggering (MyTrigger.FinishRead));
Assert.IsFalse (_sm.AllowTriggering (MyTrigger.Write));
Assert.IsFalse (_sm.AllowTriggering (MyTrigger.FinishWrite));

_sm.Triggering (MyTrigger.Run);
Assert.AreEqual (_sm.GetState(), new Tuple2 (MyState.Ready, MyState.Ready));
Assert.AreEqual (n.get(), 1221);

_sm.Triggering (MyTrigger.Read);
Assert.AreEqual (_sm.GetState(), new Tuple2 (MyState.Reading, MyState.Reading));
Assert.AreEqual (n.get(), 12221);

_sm.Triggering (MyTrigger.FinishRead);
Assert.AreEqual (_sm.GetState(), new Tuple2 (MyState.Ready, MyState.Ready));
Assert.AreEqual (n.get(), 112321);

_sm.Triggering (MyTrigger.Write);
Assert.AreEqual (_sm.GetState(), new Tuple2 (MyState.Writing, MyState.Writing));
Assert.AreEqual (n.get(), 1113321);

_sm.Triggering (MyTrigger.FinishWrite);
Assert.AreEqual (_sm.GetState(), new Tuple2 (MyState.Ready, MyState.Ready));
Assert.AreEqual (n.get(), 11113421);

_sm.SetState(new Tuple2 (MyState.Reading, MyState.Reading));
_sm.SetState(new Tuple2 (MyState.Writing, MyState.Writing));
_sm.SetState(new Tuple2 (MyState.Rest, MyState.Rest));
Assert.AreEqual (n.get(), 11113421);
}

public static void main(String[] args) throws Exception {
TestMethod1 ();
TestMethod3 ();
Expand Down
2 changes: 1 addition & 1 deletion src_java/JSMLite/src/cn/fawdlstty/smlite/SMLite.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import java.util.HashMap;

public class SMLite<TState extends Enum, TTrigger extends Enum> {
public class SMLite<TState extends Comparable, TTrigger extends Enum> {
public SMLite (TState init_state, HashMap<TState, _SMLite_ConfigState<TState, TTrigger>> _states) {
m_state = init_state;
m_cfg_states = _states;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import java.util.Dictionary;
import java.util.HashMap;

public class SMLiteBuilder<TState extends Enum, TTrigger extends Enum> {
public class SMLiteBuilder<TState extends Comparable, TTrigger extends Enum> {
public _SMLite_ConfigState<TState, TTrigger> Configure (TState state) throws Exception {
if (m_builded)
throw new Exception ("shouldn't configure builder after builded.");
Expand Down
19 changes: 19 additions & 0 deletions src_java/JSMLite/src/cn/fawdlstty/smlite/Tuple2.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package cn.fawdlstty.smlite;

public class Tuple2<A extends Comparable, B extends Comparable> implements Comparable {
public final A first;
public final B second;

public Tuple2(A a, B b) {
this.first = a;
this.second = b;
}

@Override
public int compareTo(Object o) {
Tuple2<A,B> _o = (Tuple2<A,B>) o;
if (this.first == _o.first && this.second == _o.second)
return 0;
return -1;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

import java.util.EnumSet;

public class _SMLite_ConfigItem<TState extends Enum, TTrigger extends Enum> {
public class _SMLite_ConfigItem<TState, TTrigger> {
public _SMLite_ConfigItem (EnumSet<_SMLite_BuildItem> build_item, TState state, TTrigger trigger, Object callback) {
m_build_item = build_item;
m_state = state;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import java.util.EnumSet;
import java.util.HashMap;

public class _SMLite_ConfigState<TState extends Enum, TTrigger extends Enum> {
public class _SMLite_ConfigState<TState, TTrigger> {
private _SMLite_ConfigState<TState, TTrigger> _try_add_trigger (TTrigger _trigger, _SMLite_ConfigItem<TState, TTrigger> _item) throws Exception {
if (m_items.containsKey (_trigger))
throw new Exception ("state is already has this trigger methods.");
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package cn.fawdlstty.smlite.internface;

public interface IAction_s<TState extends Enum> {
public interface IAction_s<TState> {
public void call (TState state) throws Exception;
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package cn.fawdlstty.smlite.internface;

public interface IAction_sa<TState extends Enum> {
public interface IAction_sa<TState> {
public void call (TState state, Object[] args) throws Exception;
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package cn.fawdlstty.smlite.internface;

public interface IAction_st<TState extends Enum, TTrigger extends Enum> {
public interface IAction_st<TState, TTrigger> {
public void call (TState state, TTrigger trigger) throws Exception;
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package cn.fawdlstty.smlite.internface;

public interface IAction_sta<TState extends Enum, TTrigger extends Enum> {
public interface IAction_sta<TState, TTrigger> {
public void call (TState state, TTrigger trigger, Object[] args) throws Exception;
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package cn.fawdlstty.smlite.internface;

public interface IAction_t<TTrigger extends Enum> {
public interface IAction_t<TTrigger> {
public void call (TTrigger trigger) throws Exception;
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package cn.fawdlstty.smlite.internface;

public interface IAction_ta<TTrigger extends Enum> {
public interface IAction_ta<TTrigger> {
public void call (TTrigger trigger, Object[] args) throws Exception;
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package cn.fawdlstty.smlite.internface;

public interface IFunc_<TState extends Enum> {
public interface IFunc_<TState> {
public TState call () throws Exception;
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package cn.fawdlstty.smlite.internface;

public interface IFunc_a<TState extends Enum> {
public interface IFunc_a<TState> {
public TState call (Object[] args) throws Exception;
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package cn.fawdlstty.smlite.internface;

public interface IFunc_s<TState extends Enum> {
public interface IFunc_s<TState> {
public TState call (TState state) throws Exception;
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package cn.fawdlstty.smlite.internface;

public interface IFunc_sa<TState extends Enum> {
public interface IFunc_sa<TState> {
public TState call (TState state, Object[] args) throws Exception;
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package cn.fawdlstty.smlite.internface;

public interface IFunc_st<TState extends Enum, TTrigger extends Enum> {
public interface IFunc_st<TState, TTrigger> {
public TState call (TState state, TTrigger trigger) throws Exception;
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package cn.fawdlstty.smlite.internface;

public interface IFunc_sta<TState extends Enum, TTrigger extends Enum> {
public interface IFunc_sta<TState, TTrigger> {
public TState call (TState state, TTrigger trigger, Object[] args) throws Exception;
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package cn.fawdlstty.smlite.internface;

public interface IFunc_t<TState extends Enum, TTrigger extends Enum> {
public interface IFunc_t<TState, TTrigger> {
public TState call (TTrigger trigger) throws Exception;
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package cn.fawdlstty.smlite.internface;

public interface IFunc_ta<TState extends Enum, TTrigger extends Enum> {
public interface IFunc_ta<TState, TTrigger> {
public TState call (TTrigger trigger, Object[] args) throws Exception;
}

0 comments on commit 502cbca

Please sign in to comment.