com.sun.java_cup.internal.terminal_set Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jaxp-ri Show documentation
Show all versions of jaxp-ri Show documentation
Java API for XML Processing Reference Implementation
The newest version!
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
*
* The contents of this file are subject to the terms of either the GNU
* General Public License Version 2 only ("GPL") or the Common Development
* and Distribution License("CDDL") (collectively, the "License"). You
* may not use this file except in compliance with the License. You can obtain
* a copy of the License at https://glassfish.dev.java.net/public/CDDL+GPL.html
* or glassfish/bootstrap/legal/LICENSE.txt. See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each
* file and include the License file at glassfish/bootstrap/legal/LICENSE.txt.
* Sun designates this particular file as subject to the "Classpath" exception
* as provided by Sun in the GPL Version 2 section of the License file that
* accompanied this code. If applicable, add the following below the License
* Header, with the fields enclosed by brackets [] replaced by your own
* identifying information: "Portions Copyrighted [year]
* [name of copyright owner]"
*
* Contributor(s):
*
* If you wish your version of this file to be governed by only the CDDL or
* only the GPL Version 2, indicate your decision by adding "[Contributor]
* elects to include this software in this distribution under the [CDDL or GPL
* Version 2] license." If you don't indicate a single choice of license, a
* recipient has the option to distribute your version of this file under
* either the CDDL, the GPL Version 2 or to extend the choice of license to
* its licensees as provided above. However, if you add GPL Version 2 code
* and therefore, elected the GPL Version 2 license, then the option applies
* only if the new code is made subject to such option by the copyright
* holder.
*/
package com.sun.java_cup.internal;
import java.util.BitSet;
/** A set of terminals implemented as a bitset.
* @version last updated: 11/25/95
* @author Scott Hudson
*/
public class terminal_set {
/*-----------------------------------------------------------*/
/*--- Constructor(s) ----------------------------------------*/
/*-----------------------------------------------------------*/
/** Constructor for an empty set. */
public terminal_set()
{
/* allocate the bitset at what is probably the right size */
_elements = new BitSet(terminal.number());
}
/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
/** Constructor for cloning from another set.
* @param other the set we are cloning from.
*/
public terminal_set(terminal_set other)
throws internal_error
{
not_null(other);
_elements = (BitSet)other._elements.clone();
}
/*-----------------------------------------------------------*/
/*--- (Access to) Static (Class) Variables ------------------*/
/*-----------------------------------------------------------*/
/** Constant for the empty set. */
public static final terminal_set EMPTY = new terminal_set();
/*-----------------------------------------------------------*/
/*--- (Access to) Instance Variables ------------------------*/
/*-----------------------------------------------------------*/
/** Bitset to implement the actual set. */
protected BitSet _elements;
/*-----------------------------------------------------------*/
/*--- General Methods ----------------------------------------*/
/*-----------------------------------------------------------*/
/** Helper function to test for a null object and throw an exception if
* one is found.
* @param obj the object we are testing.
*/
protected void not_null(Object obj) throws internal_error
{
if (obj == null)
throw new internal_error("Null object used in set operation");
}
/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
/** Determine if the set is empty. */
public boolean empty()
{
return equals(EMPTY);
}
/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
/** Determine if the set contains a particular terminal.
* @param sym the terminal symbol we are looking for.
*/
public boolean contains(terminal sym)
throws internal_error
{
not_null(sym);
return _elements.get(sym.index());
}
/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
/** Given its index determine if the set contains a particular terminal.
* @param indx the index of the terminal in question.
*/
public boolean contains(int indx)
{
return _elements.get(indx);
}
/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
/** Determine if this set is an (improper) subset of another.
* @param other the set we are testing against.
*/
public boolean is_subset_of(terminal_set other)
throws internal_error
{
not_null(other);
/* make a copy of the other set */
BitSet copy_other = (BitSet)other._elements.clone();
/* and or in */
copy_other.or(_elements);
/* if it hasn't changed, we were a subset */
return copy_other.equals(other._elements);
}
/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
/** Determine if this set is an (improper) superset of another.
* @param other the set we are testing against.
*/
public boolean is_superset_of(terminal_set other)
throws internal_error
{
not_null(other);
return other.is_subset_of(this);
}
/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
/** Add a single terminal to the set.
* @param sym the terminal being added.
* @return true if this changes the set.
*/
public boolean add(terminal sym)
throws internal_error
{
boolean result;
not_null(sym);
/* see if we already have this */
result = _elements.get(sym.index());
/* if not we add it */
if (!result)
_elements.set(sym.index());
return result;
}
/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
/** Remove a terminal if it is in the set.
* @param sym the terminal being removed.
*/
public void remove(terminal sym)
throws internal_error
{
not_null(sym);
_elements.clear(sym.index());
}
/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
/** Add (union) in a complete set.
* @param other the set being added.
* @return true if this changes the set.
*/
public boolean add(terminal_set other)
throws internal_error
{
not_null(other);
/* make a copy */
BitSet copy = (BitSet)_elements.clone();
/* or in the other set */
_elements.or(other._elements);
/* changed if we are not the same as the copy */
return !_elements.equals(copy);
}
/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
/** Determine if this set intersects another.
* @param other the other set in question.
*/
public boolean intersects(terminal_set other)
throws internal_error
{
not_null(other);
/* make a copy of the other set */
BitSet copy = (BitSet)other._elements.clone();
/* xor out our values */
copy.xor(this._elements);
/* see if its different */
return !copy.equals(other._elements);
}
/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
/** Equality comparison. */
public boolean equals(terminal_set other)
{
if (other == null)
return false;
else
return _elements.equals(other._elements);
}
/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
/** Generic equality comparison. */
public boolean equals(Object other)
{
if (!(other instanceof terminal_set))
return false;
else
return equals((terminal_set)other);
}
/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
/** Convert to string. */
public String toString()
{
String result;
boolean comma_flag;
result = "{";
comma_flag = false;
for (int t = 0; t < terminal.number(); t++)
{
if (_elements.get(t))
{
if (comma_flag)
result += ", ";
else
comma_flag = true;
result += terminal.find(t).name();
}
}
result += "}";
return result;
}
/*-----------------------------------------------------------*/
}