/** Visit bindings via the cache. */
 public static void acceptViaCache(
     IPDOMCPPClassType ct, IPDOMVisitor visitor, boolean includeNestedInAnonymous)
     throws CoreException {
   final long record = ct.getRecord();
   CharArrayObjectMap<List<PDOMBinding>> map = getBindingMap(ct);
   for (List<PDOMBinding> list : map.values()) {
     for (PDOMBinding node : list) {
       if (includeNestedInAnonymous || node.getParentNodeRec() == record) {
         if (visitor.visit(node)) {
           node.accept(visitor);
         }
         visitor.leave(node);
       }
     }
   }
 }
  public static CharArrayObjectMap<List<PDOMBinding>> getBindingMap(IPDOMCPPClassType ct)
      throws CoreException {
    final Long key = ct.getRecord() + PDOMCPPLinkage.CACHE_MEMBERS;
    final PDOM pdom = ct.getPDOM();
    @SuppressWarnings("unchecked")
    Reference<CharArrayObjectMap<List<PDOMBinding>>> cached =
        (Reference<CharArrayObjectMap<List<PDOMBinding>>>) pdom.getCachedResult(key);
    CharArrayObjectMap<List<PDOMBinding>> map = cached == null ? null : cached.get();

    if (map == null) {
      // There is no cache, build it:
      map = new CharArrayObjectMap<>(8);
      IPDOMVisitor visitor = new PopulateMap(map);
      visitor.visit(ct);
      ct.acceptUncached(visitor);
      pdom.putCachedResult(key, new SoftReference<>(map));
    }
    return map;
  }