package ilog.language.design.types;

/**
 * @version     Last modified on Mon Jul 08 09:49:11 2002 by hak
 * @version          modified on Wed Jun 12 18:29:09 2002 by pviry
 * @author      <a href="mailto:hak@ilog.fr">Hassan A&iuml;t-Kaci</a>
 * @copyright   &copy; 2000-2002 <a href="http://www.ilog.fr/">ILOG, S.A.</a>
 */

import ilog.language.util.Stack;

/**
 * Objects of this class are of the form <tt>name(T<sub>1</sub>,...T<sub>n</sub>)</tt>
 * where <tt>name</tt> is a type name and the <tt>T<sub>i</sub></tt>'s are distinct
 * type parameters.
 */
public class TypeTermScheme
{
  protected TypeParameter[] _parameters;

  public final TypeParameter[] parameters ()
    {
      return _parameters;
    }

  /**
   * Returns the number of type parameters of this type term scheme.
   */
  public final int arity ()
    {
      return _parameters == null ? 0 : _parameters.length;
    }

  private Stack _parameterBindings = new Stack();

  final void bindParameters (Type[] types)
    {
      for (int i=0; i<arity(); i++)
        {
          _parameterBindings.push(_parameters[i].value());
          _parameters[i].bind(types[i].value());
        }
    }

  final void unbindParameters ()
    {
      for (int i=arity(); i-->0;)
        _parameters[i].bind((Type)_parameterBindings.pop());
    }
}

