// @(#) $Id: TwoWayNode.jml-refined,v 1.11 2007/07/01 02:38:46 chalin Exp $ // Copyright (C) 1998, 1999 Iowa State University // This file is part of JML // JML is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2, or (at your option) // any later version. // JML is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with JML; see the file COPYING. If not, write to // the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. // Author: Clyde Ruby package org.jmlspecs.samples.list.node2; //@ model import org.jmlspecs.models.JMLObjectSequence; public class TwoWayNode extends OneWayNode { // Doubly Linked Node // data members /*@ public model non_null JMLObjectSequence prevEntries; @ in entries; @ public model nullable TwoWayNode nextDL; @ in nextNode; @*/ //@ public invariant (nextNode == null || nextNode instanceof TwoWayNode); //@ public represents nextDL <- (TwoWayNode) nextNode; /*@ public model nullable TwoWayNode prevNode; @ in prevEntries; @*/ /*@ public normal_behavior @ assignable entries; @ ensures theEntry == ent && entries.itemAt(0) == ent @ && entries.int_size() == 1 && prevEntries.isEmpty() @ && allButFirst.isEmpty(); @*/ public TwoWayNode(/*@ nullable @*/ Object ent); /*@ also @ public normal_behavior @ assignable allButFirst; @ ensures \not_modified(prevEntries); @*/ public void insertAfter(/*@ nullable @*/ Object newEntry); /*@ also @ public normal_behavior @ assignable allButFirst; @ ensures \not_modified(prevEntries); @*/ public void removeNextNode(); /*@ public normal_behavior @ assignable \nothing; @ ensures \result == prevNode; @*/ public /*@ nullable @*/ TwoWayNode getPrevNode(); /*@ public normal_behavior @ requires prevNode != null; @ assignable \nothing; @ ensures \result.node == this; @ also @ requires prevNode == null; @ assignable \nothing; @ ensures \result == null; @*/ public /*@ pure nullable @*/ DualLink getPrevLink(); /*@ public normal_behavior @ requires nextNode == null; @ assignable prevEntries; @ ensures prevEntries.equals(\old(prevEntries).insertBack(newEntry)); @ also public normal_behavior @ requires nextNode != null; @ assignable prevEntries; @ ensures prevEntries.equals(\old(prevEntries).insertBack(newEntry)) @ && \not_modified(allButFirst); @*/ public void insertBefore(/*@ nullable @*/ Object newEntry); }