private ObjectIdentityOrdinalMap getIdentityOrdinalMap(String type) { ObjectIdentityOrdinalMap objectIdentityOrdinalMap = objectIdentityOrdinalMaps.get(type); if(objectIdentityOrdinalMap == null) { objectIdentityOrdinalMap = new ObjectIdentityOrdinalMap(); ObjectIdentityOrdinalMap existing = objectIdentityOrdinalMaps.putIfAbsent(type, objectIdentityOrdinalMap); if(existing != null) objectIdentityOrdinalMap = existing; } return objectIdentityOrdinalMap; }
/** * Associating the obj with an ordinal * * @param obj * @param ordinal */ public void put(Object obj, int ordinal) { int hashCode = System.identityHashCode(obj); int segment = segment(hashCode); segments[segment].put(obj, hashCode, ordinal); }
@Test public void test() { for(int i=0;i<obj.length;i++) { obj[i] = new Object(); } ObjectIdentityOrdinalMap ordinalMap = new ObjectIdentityOrdinalMap(); for(int i=0;i<obj.length;i++) { ordinalMap.put(obj[i], i); } for(int i=0;i<obj.length;i++) { Assert.assertEquals(ordinalMap.getEntry(obj[i]).getOrdinal(), i); } }
public int add(String type, Object o) { ObjectIdentityOrdinalMap identityOrdinalMap = getIdentityOrdinalMap(type); Entry entry = identityOrdinalMap.getEntry(o); if(entry != null) { return entry.getOrdinal(); } NFTypeSerializer<Object> serializer = getSerializer(type); int ordinal = add(type, o, serializer); identityOrdinalMap.put(o, ordinal); return ordinal; }
public Entry getEntry(Object obj) { int hashCode = System.identityHashCode(obj); int segment = segment(hashCode); return segments[segment].get(obj, hashCode); }