/*@  public normal_behavior
  @    requires othRel != null;
  @    ensures (\forall JMLValueEqualsPair pair; ;
  @                 \result.theRelation.has(pair)
  @                    == (\exists Object val;
  @                            othRel.elementImage(pair.key).has(val);
  @                            this.elementImage(val).has(pair.value)
  @                            )
  @                );
  @*/
  public /*@ non_null @*/ JMLObjectToEqualsRelation compose(
      /*@ non_null @*/ JMLObjectToEqualsRelation othRel) {
    JMLValueSet newImagePairSet = new JMLValueSet();
    JMLObjectSet newDom = new JMLObjectSet();
    int newSize = 0;

    JMLObjectToEqualsRelationImageEnumerator imagePairEnum = othRel.imagePairs();
    JMLObjectValuePair imagePair;
    JMLEqualsSet img1;
    JMLEqualsSet img2;
    int imgSize;
    while (imagePairEnum.hasMoreElements()) {
      imagePair = imagePairEnum.nextImagePair();
      // @ assume imagePair.value != null;
      // @ assume imagePair.value instanceof JMLEqualsSet;
      img1 = (JMLEqualsSet) imagePair.value;
      img2 = this.image(img1);
      imgSize = img2.int_size();
      if (imgSize > 0) {
        newImagePairSet = newImagePairSet.insert(new JMLObjectValuePair(imagePair.key, img2));
        newSize = newSize + imgSize;
        newDom = newDom.insert(imagePair.key);
      }
    }
    return new JMLObjectToEqualsRelation(newImagePairSet, newDom, newSize);
  } // @ nowarn Exception;
Esempio n. 2
0
 /*@  public normal_behavior
 @    requires othMap != null && errval != null;
 @    requires int_size()
 @             <= Integer.MAX_VALUE - othMap.difference(this).int_size();
 @    ensures (\forall JMLValueObjectPair pair; ;
 @                 \result.theRelation.has(pair)
 @                    ==
 @                       (!othMap.isDefinedAt(pair.key)
 @                        && this.elementImage(pair.key).has(pair.value))
 @                    || (!this.isDefinedAt(pair.key)
 @                        && othMap.elementImage(pair.key)
 @                                 .has(pair.value))
 @                    || (this.isDefinedAt(pair.key)
 @                        && othMap.isDefinedAt(pair.key)
 @                        && pair.value  == (errval))
 @                );
 @ implies_that
 @    requires othMap != null && errval != null;
 @*/
 public /*@ non_null @*/ JMLValueToObjectMap clashReplaceUnion(
     JMLValueToObjectMap othMap, Object errval) throws IllegalStateException {
   JMLValueSet overlap = this.domain_.intersection(othMap.domain_);
   Enumeration overlapEnum = overlap.elements();
   othMap = othMap.restrictedTo(othMap.domain_.difference(overlap));
   JMLValueToObjectMap newMap = this.restrictedTo(this.domain_.difference(overlap));
   JMLValueToObjectRelation newRel;
   if (newMap.size_ <= Integer.MAX_VALUE - othMap.size_) {
     newRel =
         new JMLValueToObjectRelation(
             newMap.imagePairSet_.union(othMap.imagePairSet_),
             newMap.domain_.union(othMap.domain_),
             newMap.size_ + othMap.size_);
   } else {
     throw new IllegalStateException(TOO_BIG_TO_UNION);
   }
   JMLType dv;
   while (overlapEnum.hasMoreElements()) {
     // @ assume overlapEnum.moreElements;
     Object oo = overlapEnum.nextElement();
     // @ assume oo != null && oo instanceof JMLType;
     dv = (JMLType) oo;
     newRel = newRel.add(dv, errval);
   }
   return newRel.toFunction();
 } // @ nowarn Exception;
  /*@  public normal_behavior
  @    ensures (\forall Object dv; dv != null;
  @             (this.isDefinedAt(dv) == \result.isDefinedAt(dv))
  @             && \result.elementImage(dv).isSubset(this.elementImage(dv))
  @             && \result.elementImage(dv).int_size() == 1);
  @*/
  public /*@ non_null @*/ JMLEqualsToEqualsMap toFunction() {
    JMLEqualsSet newDom = domain_;
    int newSize = domain_.int_size();

    JMLValueSet newImagePairSet = imagePairSet_;

    if (newSize != size_) {
      // Have to restrict the result to be a function
      JMLEqualsToEqualsRelationImageEnumerator imagePairEnum = this.imagePairs();
      newImagePairSet = new JMLValueSet();
      JMLEqualsValuePair imagePair;
      JMLEqualsSet img;
      while (imagePairEnum.hasMoreElements()) {
        imagePair = imagePairEnum.nextImagePair();
        // @ assume imagePair.value != null;
        // @ assume imagePair.value instanceof JMLEqualsSet;
        img = (JMLEqualsSet) imagePair.value;
        Enumeration imgEnum = img.elements();
        // @ assume imgEnum.moreElements;
        Object o = imgEnum.nextElement();
        if (o == null) {
          img = new JMLEqualsSet(null);
        } else {
          // @ assume o != null && o instanceof Object;
          Object rv = (Object) o;
          img = new JMLEqualsSet(rv);
        }
        newImagePairSet = newImagePairSet.insert(new JMLEqualsValuePair(imagePair.key, img));
      }
    }
    return new JMLEqualsToEqualsMap(newImagePairSet, newDom, newSize);
  } // @ nowarn Exception;
 /** Return the set of uniterated pairs from this enumerator. */
 protected /*@ spec_public pure @*/ /*@ non_null @*/ JMLValueSet abstractValue() {
   JMLValueSet ret = new JMLValueSet();
   JMLObjectToObjectRelationEnumerator enum2 = (JMLObjectToObjectRelationEnumerator) clone();
   while (enum2.hasMoreElements()) {
     // @ assume enum2.moreElements;
     JMLObjectObjectPair aPair = enum2.nextPair();
     ret = ret.insert(aPair);
   }
   return ret;
 } // @ nowarn Exception;
 /*@ public normal_behavior
 @    ensures \result != null && \result.size == int_size()
 @        && (\forall JMLType pv; \result.has(pv);
 @                pv != null && pv instanceof JMLEqualsEqualsPair
 @             && this.isDefinedAt(((JMLEqualsEqualsPair)pv).key)
 @             && this.elementImage(((JMLEqualsEqualsPair)pv).key)
 @                    .has(((JMLEqualsEqualsPair)pv).value));
 @
 @*/
 public /*@ non_null @*/ JMLValueSet toSet() {
   JMLEqualsToEqualsRelationEnumerator pairEnum = this.associations();
   JMLValueSet ret = new JMLValueSet();
   while (pairEnum.hasMoreElements()) {
     // @ assume pairEnum.moreElements;
     JMLEqualsEqualsPair p = pairEnum.nextPair();
     ret = ret.insert(p);
   }
   return ret;
 } // @ nowarn Exception;
Esempio n. 6
0
 /*@  public normal_behavior
 @    requires isDefinedAt(dv);
 @    ensures elementImage(dv).has(\result);
 @ also
 @  public exceptional_behavior
 @    requires !isDefinedAt(dv);
 @    signals_only JMLNoSuchElementException;
 @*/
 public /*@ non_null @*/ JMLType apply(Object dv) throws JMLNoSuchElementException {
   JMLValueSet img = elementImage(dv);
   if (img.int_size() == 1) {
     JMLType res = img.choose();
     // @ assume res != null;
     return res;
   } else {
     throw new JMLNoSuchElementException("Map not defined at " + dv);
   }
 } // @ nowarn NonNullResult;
Esempio n. 7
0
 /*@  public normal_behavior
 @    requires othMap != null
 @          && this.domain().intersection(othMap.domain()).isEmpty();
 @    requires int_size() <= Integer.MAX_VALUE - othMap.int_size();
 @    ensures \result.equals(this.union(othMap));
 @ also
 @  public exceptional_behavior
 @    requires othMap != null
 @          && !this.domain().intersection(othMap.domain()).isEmpty();
 @    signals_only JMLMapException;
 @*/
 public /*@ non_null @*/ JMLValueToObjectMap disjointUnion(
     /*@ non_null @*/ JMLValueToObjectMap othMap) throws JMLMapException, IllegalStateException {
   JMLValueSet overlappingDom = domain_.intersection(othMap.domain_);
   if (overlappingDom.isEmpty()) {
     if (this.size_ <= Integer.MAX_VALUE - othMap.size_) {
       return new JMLValueToObjectMap(
           this.imagePairSet_.union(othMap.imagePairSet_),
           this.domain_.union(othMap.domain_),
           this.size_ + othMap.size_);
     } else {
       throw new IllegalStateException(TOO_BIG_TO_UNION);
     }
   } else {
     throw new JMLMapException(
         "Overlapping domains in " + " disjointUnion operation", overlappingDom);
   }
 }
  /*@  public normal_behavior
  @    requires dv != null && rv != null;
  @    requires int_size() < Integer.MAX_VALUE || elementImage(dv).has(rv);
  @    ensures \result.theRelation.equals(
  @           this.theRelation.insert(new JMLEqualsEqualsPair(dv, rv)));
  @*/
  public /*@ pure @*/ /*@ non_null @*/ JMLEqualsToEqualsRelation add(
      /*@ non_null @*/ Object dv, /*@ non_null @*/ Object rv)
      throws NullPointerException, IllegalStateException {
    if (rv == null) {
      throw new NullPointerException();
    }

    JMLValueSet newImagePairSet;
    JMLEqualsSet newDom;
    int newSize;
    JMLEqualsSet img;

    if (!domain_.has(dv)) {
      if (size_ == Integer.MAX_VALUE) {
        throw new IllegalStateException(TOO_BIG_TO_INSERT);
      }
      newDom = domain_.insert(dv);
      newSize = size_ + 1;
      img = new JMLEqualsSet(rv);
      newImagePairSet = imagePairSet_.insert(new JMLEqualsValuePair(dv, img));
    } else {
      newImagePairSet = new JMLValueSet();
      newDom = domain_;
      newSize = 0;

      JMLEqualsToEqualsRelationImageEnumerator imagePairEnum = this.imagePairs();
      JMLEqualsValuePair imagePair;
      while (imagePairEnum.hasMoreElements()) {
        imagePair = imagePairEnum.nextImagePair();
        // @ assume imagePair.value != null;
        // @ assume imagePair.value instanceof JMLEqualsSet;
        img = (JMLEqualsSet) imagePair.value;
        if (imagePair.keyEquals(dv)) {
          img = img.insert(rv);
        }
        int size_inc = img.int_size();
        if (newSize <= Integer.MAX_VALUE - size_inc) {
          newSize = newSize + size_inc;
        } else {
          throw new IllegalStateException(TOO_BIG_TO_INSERT);
        }
        newImagePairSet = newImagePairSet.insert(new JMLEqualsValuePair(imagePair.key, img));
      }
    }
    return new JMLEqualsToEqualsRelation(newImagePairSet, newDom, newSize);
  }
  /*@  public normal_behavior
  @    requires othRel != null;
  @    requires int_size()
  @             < Integer.MAX_VALUE - othRel.difference(this).int_size();
  @    ensures \result.theRelation.equals(
  @                    this.theRelation.union(othRel.theRelation));
  @*/
  public /*@ non_null @*/ JMLEqualsToEqualsRelation union(
      /*@ non_null @*/ JMLEqualsToEqualsRelation othRel) throws IllegalStateException {
    JMLValueSet newImagePairSet = new JMLValueSet();
    JMLEqualsSet newDom = domain_;
    int newSize = 0;

    JMLEqualsToEqualsRelationImageEnumerator imagePairEnum = this.imagePairs();
    JMLEqualsValuePair imagePair;
    JMLEqualsSet img;
    while (imagePairEnum.hasMoreElements()) {
      imagePair = imagePairEnum.nextImagePair();
      // @ assume imagePair.value != null;
      // @ assume imagePair.value instanceof JMLEqualsSet;
      img = (JMLEqualsSet) imagePair.value;
      img = img.union(othRel.elementImage(imagePair.key));
      newImagePairSet = newImagePairSet.insert(new JMLEqualsValuePair(imagePair.key, img));
      int size_inc = img.int_size();
      if (newSize <= Integer.MAX_VALUE - size_inc) {
        newSize = newSize + size_inc;
      } else {
        throw new IllegalStateException(TOO_BIG_TO_UNION);
      }
    }
    JMLEqualsSet diffDom = othRel.domain().difference(this.domain_);
    imagePairEnum = othRel.imagePairs();
    while (imagePairEnum.hasMoreElements()) {
      imagePair = imagePairEnum.nextImagePair();
      // @ assume imagePair.value != null;
      // @ assume imagePair.value instanceof JMLEqualsSet;
      if (diffDom.has(imagePair.key)) {
        newImagePairSet = newImagePairSet.insert(imagePair);
        newDom = newDom.insert(imagePair.key);
        // @ assume imagePair.value != null;
        // @ assume imagePair.value instanceof JMLEqualsSet;
        img = (JMLEqualsSet) imagePair.value;
        int size_inc = img.int_size();
        if (newSize <= Integer.MAX_VALUE - size_inc) {
          newSize = newSize + size_inc;
        } else {
          throw new IllegalStateException(TOO_BIG_TO_UNION);
        }
      }
    }
    return new JMLEqualsToEqualsRelation(newImagePairSet, newDom, newSize);
  }
  /*@  public normal_behavior
  @    requires rng != null;
  @    ensures (\forall JMLEqualsEqualsPair pair; ;
  @                       \result.theRelation.has(pair)
  @                        == rng.has(pair.value)
  @                    && elementImage(pair.key).has(pair.value)
  @                );
  @*/
  public /*@ non_null @*/ JMLEqualsToEqualsRelation restrictRangeTo(
      /*@ non_null @*/ JMLEqualsSet rng) {
    JMLValueSet newImagePairSet = new JMLValueSet();
    JMLEqualsSet newDom = new JMLEqualsSet();
    int newSize = 0;

    JMLEqualsToEqualsRelationImageEnumerator imagePairEnum = this.imagePairs();
    JMLEqualsValuePair imagePair;
    JMLEqualsSet img;
    while (imagePairEnum.hasMoreElements()) {
      imagePair = imagePairEnum.nextImagePair();
      // @ assume imagePair.value != null;
      // @ assume imagePair.value instanceof JMLEqualsSet;
      img = ((JMLEqualsSet) imagePair.value).intersection(rng);
      if (!img.isEmpty()) {
        newImagePairSet = newImagePairSet.insert(new JMLEqualsValuePair(imagePair.key, img));
        newDom = newDom.insert(imagePair.key);
        newSize = newSize + img.int_size();
      }
    }
    return new JMLEqualsToEqualsRelation(newImagePairSet, newDom, newSize);
  } // @ nowarn Exception;
  /*@  public normal_behavior
  @    requires dom != null;
  @    ensures (\forall JMLEqualsEqualsPair pair; pair != null;
  @                      \result.theRelation.has(pair) == dom.has(pair.key)
  @                    && elementImage(pair.key).has(pair.value)
  @                );
  @*/
  public /*@ non_null @*/ JMLEqualsToEqualsRelation restrictDomainTo(
      /*@ non_null @*/ JMLEqualsSet dom) {
    JMLValueSet newImagePairSet = new JMLValueSet();
    JMLEqualsSet newDom = domain_.intersection(dom);
    // @ assume (\forall Object dv; newDom.has(dv); dv != null);
    int newSize = 0;

    JMLEqualsToEqualsRelationImageEnumerator imagePairEnum = this.imagePairs();
    JMLEqualsValuePair imagePair;
    JMLEqualsSet img;
    while (imagePairEnum.hasMoreElements()) {
      imagePair = imagePairEnum.nextImagePair();
      // @ assume imagePair.value != null;
      // @ assume imagePair.value instanceof JMLEqualsSet;
      if (newDom.has(imagePair.key)) {
        newImagePairSet = newImagePairSet.insert(imagePair);
        img = (JMLEqualsSet) imagePair.value;
        newSize = newSize + img.int_size();
      }
    }
    return new JMLEqualsToEqualsRelation(newImagePairSet, newDom, newSize);
  } // @ nowarn Exception;
  /*@  public normal_behavior
  @    ensures \result != null
  @         && (\forall Object val; domain().has(val);
  @             (\forall Object r; r != null;
  @                   (elementImage(val).has(r)
  @                      <==> \result.theRelation
  @                            .has(new JMLEqualsEqualsPair(val,r))
  @                          && !val.equals(dv))));
  @ implies_that
  @   public normal_behavior
  @    requires dv == null;
  @    ensures \result != null && \result.equals(this);
  @*/
  public /*@ non_null @*/ JMLEqualsToEqualsRelation removeFromDomain(/*@ nullable @*/ Object dv) {
    if (!domain_.has(dv)) {
      return (this);
    }

    JMLValueSet newImagePairSet = new JMLValueSet();
    JMLEqualsSet newDom = domain_.remove(dv);
    int newSize = 0;

    JMLEqualsToEqualsRelationImageEnumerator imagePairEnum = this.imagePairs();
    JMLEqualsValuePair imagePair;
    while (imagePairEnum.hasMoreElements()) {
      imagePair = imagePairEnum.nextImagePair();
      // @ assume imagePair.value != null;
      // @ assume imagePair.value instanceof JMLEqualsSet;
      if (!imagePair.keyEquals(dv)) {
        newImagePairSet = newImagePairSet.insert(imagePair);
        JMLEqualsSet img = (JMLEqualsSet) imagePair.value;
        newSize = newSize + img.int_size();
      }
    }
    return new JMLEqualsToEqualsRelation(newImagePairSet, newDom, newSize);
  } // @ nowarn Exception;
  /*@  public normal_behavior
  @    requires dv != null && rv != null;
  @    ensures \result.theRelation.equals(
  @                theRelation.remove(new JMLEqualsEqualsPair(dv, rv)));
  @   also
  @    requires dv == null || rv == null;
  @    ensures \result != null && \result.equals(this);
  @*/
  public /*@ non_null @*/ JMLEqualsToEqualsRelation remove(Object dv, Object rv) {
    if (!domain_.has(dv)) {
      return (this);
    }
    // @ assume dv != null;

    JMLValueSet newImagePairSet = new JMLValueSet();
    JMLEqualsSet newDom = domain_;
    int newSize = 0;

    JMLEqualsToEqualsRelationImageEnumerator imagePairEnum = this.imagePairs();
    JMLEqualsValuePair imagePair;
    JMLEqualsSet img;
    while (imagePairEnum.hasMoreElements()) {
      imagePair = imagePairEnum.nextImagePair();
      // @ assume imagePair.value != null;
      // @ assume imagePair.value instanceof JMLEqualsSet;
      img = (JMLEqualsSet) imagePair.value;
      int imgSize = img.int_size();
      if (imagePair.keyEquals(dv)) {
        img = img.remove(rv);
        imgSize = img.int_size();
        if (imgSize > 0) {
          newImagePairSet = newImagePairSet.insert(new JMLEqualsValuePair(dv, img));
          newSize = newSize + imgSize;
        } else {
          // @ assert imgSize == 0;
          newDom = newDom.remove(dv);
        }
      } else {
        newImagePairSet = newImagePairSet.insert(imagePair);
        newSize = newSize + imgSize;
      }
    }
    return new JMLEqualsToEqualsRelation(newImagePairSet, newDom, newSize);
  } // @ nowarn Exception;
 /** Return a hash code for this object. */
 public int hashCode() {
   return imagePairSet_.hashCode();
 }