/** @return canonical AccessPath object */
 public AccessPath findOrCreate(PathElement initialElement) {
   APKey k = new APKey(initialElement);
   AccessPath result = map.get(k);
   if (result == null) {
     int id = vector.getMaxIndex() + 1;
     result = new AccessPath(k, id);
     map.put(k, result);
     vector.set(id, result);
     findOrCreateStartsWith(initialElement).add(id);
   }
   return result;
 }
 /**
  * @param elements List<PathElement>
  * @return canonical AccessPath object
  */
 public AccessPath findOrCreate(List<PathElement> elements) {
   if (PARANOID) {
     for (Iterator<PathElement> it = elements.iterator(); it.hasNext(); ) {
       if (!(it.next() instanceof PathElement)) {
         Assertions.UNREACHABLE();
       }
     }
   }
   APKey k = new APKey(elements);
   AccessPath result = map.get(k);
   if (result == null) {
     int id = vector.getMaxIndex() + 1;
     result = new AccessPath(k, id);
     map.put(k, result);
     vector.set(id, result);
     findOrCreateStartsWith(result.getHead()).add(id);
   }
   return result;
 }
 public AccessPath getAccessPath(int i) {
   return (AccessPath) vector.get(i);
 }