001/*
002 *  This file is part of the Jikes RVM project (http://jikesrvm.org).
003 *
004 *  This file is licensed to You under the Eclipse Public License (EPL);
005 *  You may not use this file except in compliance with the License. You
006 *  may obtain a copy of the License at
007 *
008 *      http://www.opensource.org/licenses/eclipse-1.0.php
009 *
010 *  See the COPYRIGHT.txt file distributed with this work for information
011 *  regarding copyright ownership.
012 */
013package org.jikesrvm.compilers.opt.util;
014
015
016final class SpaceEffGraphNodeListHeader {
017  SpaceEffGraphNodeList _first;
018  SpaceEffGraphNodeList _last;
019
020  SpaceEffGraphNodeList first() {
021    return _first;
022  }
023
024  SpaceEffGraphNodeList last() {
025    return _last;
026  }
027
028  public void append(SpaceEffGraphNode node) {
029    SpaceEffGraphNodeList p = new SpaceEffGraphNodeList();
030    p._node = node;
031    SpaceEffGraphNodeList last = _last;
032    if (last == null) {
033      // will be the case for first edge.
034      _first = p;
035      _last = p;
036    } else {
037      // there is at least one node.
038      last._next = p;
039      p._prev = last;           // doubly linked list.
040      _last = p;
041    }
042  }
043
044  public boolean add(SpaceEffGraphNode node) {
045    SpaceEffGraphNodeList p = first();
046    SpaceEffGraphNodeList prev = first();
047    if (p == null) {
048      // will be the case for first node.
049      p = new SpaceEffGraphNodeList();
050      p._node = node;
051      _first = p;
052      _last = p;
053      return true;
054    }
055    while (p != null) {
056      if (p._node == node) {
057        // node already in list.
058        return false;
059      }
060      prev = p;
061      p = p._next;
062    }
063    prev._next = new SpaceEffGraphNodeList();
064    prev._next._node = node;
065    prev._next._prev = prev;                    // doubly linked list.
066    _last = prev._next;
067    return true;
068  }
069}