/*@  public normal_behavior
 @    requires othMap != null && errval != null;
 @    requires int_size()
 @             <= Integer.MAX_VALUE - othMap.difference(this).int_size();
 @    ensures (\forall JMLObjectValuePair 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 .equals(errval))
 @                );
 @ implies_that
 @    requires othMap != null && errval != null;
 @*/
 public /*@ non_null @*/ JMLObjectToValueMap clashReplaceUnion(
     JMLObjectToValueMap othMap, JMLType errval) throws IllegalStateException {
   JMLObjectSet overlap = this.domain_.intersection(othMap.domain_);
   Enumeration overlapEnum = overlap.elements();
   othMap = othMap.restrictedTo(othMap.domain_.difference(overlap));
   JMLObjectToValueMap newMap = this.restrictedTo(this.domain_.difference(overlap));
   JMLObjectToValueRelation newRel;
   if (newMap.size_ <= Integer.MAX_VALUE - othMap.size_) {
     newRel =
         new JMLObjectToValueRelation(
             newMap.imagePairSet_.union(othMap.imagePairSet_),
             newMap.domain_.union(othMap.domain_),
             newMap.size_ + othMap.size_);
   } else {
     throw new IllegalStateException(TOO_BIG_TO_UNION);
   }
   Object dv;
   while (overlapEnum.hasMoreElements()) {
     // @ assume overlapEnum.moreElements;
     Object oo = overlapEnum.nextElement();
     // @ assume oo != null && oo instanceof Object;
     dv = (Object) oo;
     newRel = newRel.add(dv, errval);
   }
   return newRel.toFunction();
 } // @ nowarn Exception;
 /*@  public normal_behavior
 @    requires dv != null && rv != null;
 @    requires !isDefinedAt(dv) ==> int_size() < Integer.MAX_VALUE;
 @    ensures \result.equals(this.removeDomainElement(dv).add(dv, rv));
 @*/
 public /*@ non_null @*/ JMLObjectToValueMap extend(
     /*@ non_null @*/ Object dv, /*@ non_null @*/ JMLType rv) {
   JMLObjectToValueMap newMap = this.removeDomainElement(dv);
   newMap = newMap.disjointUnion(new JMLObjectToValueMap(dv, rv));
   return newMap;
 } // @ nowarn Exception;