View Javadoc

1   /*
2    * #%L
3    * prolobjectlink-jpi-jpl7
4    * %%
5    * Copyright (C) 2019 Prolobjectlink Project
6    * %%
7    * Redistribution and use in source and binary forms, with or without
8    * modification, are permitted provided that the following conditions are met:
9    * 
10   * 1. Redistributions of source code must retain the above copyright notice,
11   *    this list of conditions and the following disclaimer.
12   * 2. Redistributions in binary form must reproduce the above copyright notice,
13   *    this list of conditions and the following disclaimer in the documentation
14   *    and/or other materials provided with the distribution.
15   * 
16   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
20   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26   * POSSIBILITY OF SUCH DAMAGE.
27   * #L%
28   */
29  package io.github.prolobjectlink.prolog.jpl7;
30  
31  import static io.github.prolobjectlink.prolog.PrologTermType.STRUCTURE_TYPE;
32  
33  import org.jpl7.Compound;
34  import org.jpl7.Term;
35  
36  import io.github.prolobjectlink.prolog.PrologProvider;
37  import io.github.prolobjectlink.prolog.PrologStructure;
38  import io.github.prolobjectlink.prolog.PrologTerm;
39  
40  /**
41   * 
42   * @author Jose Zalacain
43   * @since 1.0
44   */
45  class JplStructure extends JplTerm implements PrologStructure {
46  
47  	JplStructure(PrologProvider provider, String functor, PrologTerm... arguments) {
48  		super(STRUCTURE_TYPE, provider);
49  		Term[] terms = new Term[arguments.length];
50  		for (int i = 0; i < arguments.length; i++) {
51  			terms[i] = ((JplTerm) arguments[i]).value;
52  		}
53  		value = new Compound(removeQuoted(functor), terms);
54  	}
55  
56  	JplStructure(PrologProvider provider, String functor, Term... arguments) {
57  		super(STRUCTURE_TYPE, provider);
58  		value = new Compound(removeQuoted(functor), arguments);
59  	}
60  
61  	JplStructure(PrologProvider provider, PrologTerm left, String operator, PrologTerm right) {
62  		super(STRUCTURE_TYPE, provider);
63  		Term leftOperand = ((JplTerm) left).value;
64  		Term rightOperand = ((JplTerm) right).value;
65  		value = new Compound(operator, new Term[] { leftOperand, rightOperand });
66  	}
67  
68  	JplStructure(PrologProvider provider, Term left, String functor, Term right) {
69  		super(STRUCTURE_TYPE, provider, new Compound(functor, new Term[] { left, right }));
70  	}
71  
72  	JplStructure(int objectType, PrologProvider provider, Term newJRef) {
73  		super(objectType, provider, newJRef);
74  	}
75  
76  	public PrologTerm getArgument(int index) {
77  		checkIndex(index, getArity());
78  		return getArguments()[index];
79  	}
80  
81  	public PrologTerm[] getArguments() {
82  		Compound structure = (Compound) value;
83  		int arity = structure.arity();
84  		PrologTerm[] arguments = new PrologTerm[arity];
85  		for (int i = 0; i < arity; i++) {
86  			arguments[i] = toTerm(structure.arg(i + 1), PrologTerm.class);
87  		}
88  		return arguments;
89  	}
90  
91  	public int getArity() {
92  		Compound structure = (Compound) value;
93  		return structure.arity();
94  	}
95  
96  	public String getFunctor() {
97  		Compound structure = (Compound) value;
98  		return structure.name();
99  	}
100 
101 	public final PrologTerm getRight() {
102 		return getArgument(1);
103 	}
104 
105 	public final PrologTerm getLeft() {
106 		return getArgument(0);
107 	}
108 
109 	public final String getOperator() {
110 		return getFunctor();
111 	}
112 
113 }