diff options
author | Dmitriy Kargapolov <[email protected]> | 2015-02-03 16:39:39 -0500 |
---|---|---|
committer | Dmitriy Kargapolov <[email protected]> | 2015-02-03 16:39:39 -0500 |
commit | 2fdc3d313485a76b6acf12154b8f3bd3e1ceb2ca (patch) | |
tree | 39e42440dcaebb29368fd0290391d328f216524b /lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangTuple.java | |
parent | ab1cfe19a0af082a2c207fb5c07c7a6ad5782c14 (diff) | |
download | otp-2fdc3d313485a76b6acf12154b8f3bd3e1ceb2ca.tar.gz otp-2fdc3d313485a76b6acf12154b8f3bd3e1ceb2ca.tar.bz2 otp-2fdc3d313485a76b6acf12154b8f3bd3e1ceb2ca.zip |
jinterface: match/bind added to OtpErlangObject
Adding these two methods to the OtpErlangObject abstract class makes possible
implementing of pattern matching and variable binding for all types of Erlang
terms. Particular implementations may vary and include additional classes to
define Variable placeholder objects and Bindings objects. Also Parser class
may be added to facilitate creating complex patterns and terms.
The purpose of this commit is to provide low level interface base methods
sufficient for variety of higher level pattern matching/variable binding
implementations.
OtpErlangMap class is re-designed for efficiency (it is based on HashMap now).
All changes are backward-compatible. Detailed test cases implemented.
Diffstat (limited to 'lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangTuple.java')
-rw-r--r-- | lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangTuple.java | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangTuple.java b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangTuple.java index af2559e62e..ef0a453de1 100644 --- a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangTuple.java +++ b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangTuple.java @@ -236,6 +236,35 @@ public class OtpErlangTuple extends OtpErlangObject { } @Override + public <T> boolean match(final OtpErlangObject term, final T bindings) { + if (!(term instanceof OtpErlangTuple)) { + return false; + } + final OtpErlangTuple t = (OtpErlangTuple) term; + final int a = elems.length; + if (a != t.elems.length) { + return false; + } + for (int i = 0; i < a; i++) { + if (!elems[i].match(t.elems[i], bindings)) { + return false; + } + } + return true; + } + + @Override + public <T> OtpErlangObject bind(final T binds) throws OtpErlangException { + final OtpErlangTuple tuple = (OtpErlangTuple) this.clone(); + final int a = tuple.elems.length; + for (int i = 0; i < a; i++) { + final OtpErlangObject e = tuple.elems[i]; + tuple.elems[i] = e.bind(binds); + } + return tuple; + } + + @Override protected int doHashCode() { final OtpErlangObject.Hash hash = new OtpErlangObject.Hash(9); final int a = arity(); |