⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 list.java

📁 java编译器gjc源码 java编译环境
💻 JAVA
字号:
/**
 * @(#)List.java	1.17 03/01/23
 *
 * Copyright 2003 Sun Microsystems, Inc. All rights reserved.
 * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */
package com.sun.tools.javac.v8.util;

/**
 * A class for generic linked lists. Links are supposed to be
 *  immutable, the only exception being the incremental construction of
 *  lists via ListBuffers.  List is the main container class in
 *  GJC. Most data structures and algorthms in GJC use lists rather
 *  than arrays.
 *
 *  Lists are always trailed by a sentinel element, whose head and tail
 *  are both null.
 */
public final class List {

    /**
     * The first element of the list, supposed to be immutable.
     */
    public Object head;

    /**
     * The remainder of the list except for its first element, supposed
     *  to be immutable.
     */
    public List tail;

    /**
     * Construct a list given its head and tail.
     */
    public List(Object head, List tail) {
        super();
        this.tail = tail;
        this.head = head;
    }

    /**
      * Construct an empty list.
      */
    public List() {
        this(null, null);
    }

    /**
      * Construct an empty list.
      */
    public static List make() {
        return new List();
    }

    /**
      * Construct a list consisting of given element.
      */
    public static List make(Object x1) {
        return new List(x1, new List());
    }

    /**
      * Construct a list consisting of given elements.
      */
    public static List make(Object x1, Object x2) {
        return new List(x1, new List(x2, new List()));
    }

    /**
      * Construct a list consisting of given elements.
      */
    public static List make(Object x1, Object x2, Object x3) {
        return new List(x1, new List(x2, new List(x3, new List())));
    }

    /**
      * Construct a list consisting all elements of given array.
      */
    public static List make(Object[] vec) {
        List xs = new List();
        for (int i = vec.length - 1; i >= 0; i--)
            xs = new List(vec[i], xs);
        return xs;
    }

    /**
      * Construct a list consisting of a given number of identical elements.
      *  @param len    The number of elements in the list.
      *  @param init   The value of each element.
      */
    public static List make(int len, Object init) {
        List l = new List();
        for (int i = 0; i < len; i++)
            l = new List(init, l);
        return l;
    }

    /**
      * Does list have no elements?
      */
    public boolean isEmpty() {
        return tail == null;
    }

    /**
      * Does list have elements?
      */
    public boolean nonEmpty() {
        return tail != null;
    }

    /**
      * Return the number of elements in this list.
      */
    public int length() {
        List l = this;
        int len = 0;
        while (l.tail != null) {
            l = l.tail;
            len++;
        }
        return len;
    }

    /**
      * Prepend given element to front of list, forming and returning
      *  a new list.
      */
    public List prepend(Object x) {
        return new List(x, this);
    }

    /**
      * Prepend given list of elements to front of list, forming and returning
      *  a new list.
      */
    public List prependList(List xs) {
        if (this.isEmpty())
            return xs;
        if (xs.isEmpty())
            return this;
        List result = this;
        xs = xs.reverse();
        while (xs.nonEmpty()) {
            List h = xs;
            xs = xs.tail;
            h.tail = result;
            result = h;
        }
        return result;
    }

    /**
      * Reverse list, forming and returning a new list.
      */
    public List reverse() {
        List rev = new List();
        for (List l = this; l.nonEmpty(); l = l.tail)
            rev = new List(l.head, rev);
        return rev;
    }

    /**
      * Append given element at length, forming and returning
      *  a new list.
      */
    public List append(Object x) {
        return make(x).prependList(this);
    }

    /**
      * Append given list at length, forming and returning
      *  a new list.
      */
    public List appendList(List x) {
        return x.prependList(this);
    }

    /**
      * Copy successive elements of this list into given vector until
      *  list is exhausted or end of vector is reached.
      */
    public Object[] toArray(Object[] vec) {
        int i = 0;
        List l = this;
        while (l.nonEmpty() && i < vec.length) {
            vec[i] = l.head;
            l = l.tail;
            i++;
        }
        return vec;
    }

    /**
      * Form a string listing all elements with given separator character.
      */
    public String toString(String sep) {
        if (isEmpty()) {
            return "";
        } else {
            StringBuffer buf = new StringBuffer();
            buf.append(((Object) head).toString());
            for (List l = tail; l.nonEmpty(); l = l.tail) {
                buf.append(sep);
                buf.append(((Object) l.head).toString());
            }
            return buf.toString();
        }
    }

    /**
      * Form a string listing all elements with comma as the separator character.
      */
    public String toString() {
        return toString(",");
    }

    /**
      * Compute a hash code, overrides Object
      */
    public int hashCode() {
        List l = this;
        int h = 0;
        while (l.tail != null) {
            h = h * 41 + (head != null ? head.hashCode() : 0);
            l = l.tail;
        }
        return h;
    }

    /**
      * Is this list the same as other list?
      */
    public boolean equals(Object other) {
        return other instanceof List && equals(this, (List) other);
    }

    /**
      * Are the two lists the same?
      */
    public static boolean equals(List xs, List ys) {
        while (xs.tail != null && ys.tail != null) {
            if (xs.head == null) {
                if (ys.head != null)
                    return false;
            } else {
                if (!xs.head.equals(ys.head))
                    return false;
            }
            xs = xs.tail;
            ys = ys.tail;
        }
        return xs.tail == null && ys.tail == null;
    }

    /**
      * Does the list contain the specified element?
      */
    public boolean contains(Object x) {
        List l = this;
        while (l.tail != null) {
            if (x == null) {
                if (l.head == null)
                    return true;
            } else {
                if (x.equals(l.head))
                    return true;
            }
            l = l.tail;
        }
        return false;
    }

    /**
      * The last element in the list, if any, or null.
      */
    public Object last() {
        Object last = null;
        List t = this;
        while (t.tail != null) {
            last = t.head;
            t = t.tail;
        }
        return last;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -