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}