code: /*
   * The contents of this file are subject to the terms
   * of the Common Development and Distribution License
   * (the "License").  You may not use this file except
   * in compliance with the License.
   * 
   * You can obtain a copy of the license at
   * https://jwsdp.dev.java.net/CDDLv1.0.html
   * See the License for the specific language governing
   * permissions and limitations under the License.
   * 
   * When distributing Covered Code, include this CDDL
   * HEADER in each file and include the License file at
   * https://jwsdp.dev.java.net/CDDLv1.0.html  If applicable,
   * add the following below this CDDL HEADER, with the
   * fields enclosed by brackets "[]" replaced with your
   * own identifying information: Portions Copyright [yyyy]
   * [name of copyright owner]
   */
  package com.sun.xml.xsom.util;
  
  import com.sun.xml.xsom.XSType;
  
  /**
   * A simple abstraction for a set of Types that defines containment functions.
   * 
   * @author <a href="mailto:Ryan.Shoemaker@Sun.COM">Ryan Shoemaker</a>, Sun Microsystems, Inc.
   */
  public abstract class TypeSet {
  
      /**
       * Return true if this TypeSet contains the specified type.
       * 
       * Concrete implementations of this method determine what it
       * means for the TypeSet to "contain" a type.
       *  
       * @param type the type
       * @return true iff this TypeSet contains the specified type
       */
      public abstract boolean contains(XSType type);
  
      /**
       * Calculate the TypeSet formed by the intersection of two
       * other TypeSet objects.
       * 
       * @param a a TypeSet
       * @param b another TypeSet
       * @return the intersection of a and b
       */
      public static TypeSet intersection(final TypeSet a, final TypeSet b) {
          return new TypeSet(){
              public boolean contains(XSType type) {
                  return a.contains(type) && b.contains(type);
              }
          };
      }
  
      /**
       * Calculate the TypeSet formed by the union of two
       * other TypeSet objects.
       * 
       * @param a a TypeSet
       * @param b another TypeSet
       * @return the union of a and b
       */
      public static TypeSet union(final TypeSet a, final TypeSet b) {
          return new TypeSet(){
              public boolean contains(XSType type) {
                  return a.contains(type) || b.contains(type);
              }
          };
      }
  }
  