[0.7.1] Released on May 7th, 2015 http://issues.carrot2.org/secure/ReleaseNote.jspa?projectId=10070&version=12628 ** New features HPPC-159: Add .visualizeKeyDistribution(int characters) to maps and sets ** Bug fixes HPPC-156: forEach iterators spin loop endlessly on *HashSet and *ScatterSet. HPPC-158: *ScatterMap.from should shadow *HashMap.from with proper covariant. HPPC-155: *ScatterSet.from should shadow *HashSet.from with proper covariant. [0.7.0] Released on May 5th, 2015 http://issues.carrot2.org/secure/ReleaseNote.jspa?projectId=10070&version=12421 ** API-breaking changes HPPC-117: A summary of API changes resulting from other issues. * (HPPC-118) Direct generic buffers are declared Object[]. Should not affect runtime code (Object[] casts were required anyway). * (HPPC-106) Guava adapters dropped. Copy to your own code from previous HPPC release if required. * 1.7 compatibility only. static factories removed, use diamonds. T.newInstanceWithCapacity(*) -> removed, use new T<>(*) T.newInstanceWithExpectedSize(*) -> removed, use new T<>(*) T.newInstance(*) -> removed, use new T<>(*) T.from(container) -> removed, use new T<>(container) * EmptyArrays has been removed. Empty arrays are now a static constant in each *ArrayList. * (HPPC-97) Removed allocated[] fields from hash containers. If you used explicit loops utilizing allocated[] you should rewrite them to use cursors or other form of iteration instead (it will be simpler than taking care of the empty slot marker). * (HPPC-146) Removed DoubleLinkedIntSet. * (HPPC-115) Hash containers now, by default, use a random internal mixing seed to reorder entries (so the order of keys is not constant from execution to execution). See detailed HPPC-115 entry below. * (HPPC-121) Renamed methods: T.removeFirstOccurrences -> T.removeFirst T.removeLastOccurrences -> T.removeLast T.removeAllOccurrences -> T.removeAll(type) * (HPPC-123) Dropped MurmurHash3 class entirely. * (HPPC-125) The semantics of how equals works has changed (a container can be equal only if the comparison's target is of the same class and contains the same entries. * (HPPC-129) ArraySizingStrategy#round() method has been removed completely. * (HPPC-130) removeAll(KTypeLookupContainer) had an incorrect generic signature of: public int removeAll(final KTypeLookupContainer c) now corrected to: public int removeAll(final KTypeLookupContainer c) (for primitive types this does not apply). * (HPPC-131) retainAll(KTypeLookupContainer) had an incorrect generic signature of: public int retainAll(final KTypeLookupContainer c) now corrected to: public int retainAll(final KTypeLookupContainer c) (for primitive types this does not apply). * (HPPC-133) KTypeContainer.toArray(Class) now accepts any array component type; runtime checks will throw ArrayStoreException if not compatible. * (HPPC-135) KTypeVTypeAssociativeContainer#removeAll had an incorrect generic signature of: public int removeAll(KTypeContainer container) now corrected to: public int removeAll(KTypeContainer container) * (HPPC-116): Dropped methods that required a memory write (lset, lget, lkey) and replaced them with methods that take a logical "index" of a key: int indexOf(KType); boolean indexExists(int index); VType indexGet(int index); VType indexReplace(int index, VType newValue); void indexInsert(int index, KType key, VType value); So, for example: int index; if ((index = map.indexOf(key)) >= 0) { // key exists, do something with the value. doSomething(map.indexGet(index)); } else { // Insert the new key-value pair. map.indexInsert(index, key, newValue); } * (HPPC-141): Dropped mutable type wrappers. * (HPPC-144): Several less-frequently used classes have been moved to a separate JAR file. See full description of HPPC-144 below. * (HPPC-145): Removed any "Open" infix from all classes: KTypeOpenHashSet -> KTypeHashSet KTypeVTypeOpenHashMap -> KTypeVTypeHashMap * (HPPC-152) XorShiftRandom has been removed and replaced with a simpler, int-only PRNG XorShift128+ (XorShift128P). ** New features HPPC-150: Make the default key mixing strategy globally configurable (via "hppc.bitmixer" sysprop). This property allows switching from random bit mixer strategy to any of the following: - random the default strategy. Varies bit mixer per instance. - deterministic the default strategy in HPPC up to v. 0.6.x. Varies bit mixer depending on hash container size. - none No bit mixing is used (hash sets/maps become scatter sets/ maps). This is a last-resort, discouraged, property. Your code should not rely on hash map/set ordering. Your code should use scatter maps when speed is of absolute importance and there are guarantees that keys won't be copied around to other associative containers. HPPC-145: Removed any "Open" infix from all classes. HPPC-144: Moved certain esoteric key/value containers to a separate JAR. This JAR has an identical dependency as main HPPC jar, but is declared with an "esoteric" classifier. The following containers are included in the set of "esoteric" ones: * all associative containers with Byte* keys * all associative containers with Float* keys * all associative containers with Double* keys Byte-keyed containers are very infrequent (just create a plain array for values). Hash containers keyed by a floating-point type are odd and may lead to confusion. The problem is how the "key" should be normalized from fixed-bit representation and then internally compared. If fp normalization is applied (like Double.doubleToLongBits) then the value one puts in a set or a map may be different from the value later retrieved while iterating over the set of keys. On the other hand, if one takes raw floating point values (for example Double.doubleToRawLongBits) then there are awkward side-effects (like various types of NaNs can be stored as separate keys, for example). All floating-point "esoterics" use proper normalization, but it is strongly advised to manually apply the floating point-fixed-point conversion (normalization) in the target code and just use a corresponding fixed-point associative container for storing normalized values. HPPC-143: Added KTypeScatterSet and KTypeVTypeScatterMap. These classes are specializations of KTypeHashSet and KTypeVTypeHashMap with a simpler bit distribution function and no bit mixers. They are useful for key existence checks or counting but should not be propagated across containers. HPPC-134: Set and Map's removeAll() should pick the best removal strategy. HPPC-139: Added release() to the API (clears and releases internal buffers). HPPC-116: Drop methods that require memory write (lset, lget, lkey) and replace them with methods that take a logical "index" of a key. HPPC-115: Provide better guard against key clustering leading to exponential times. HPPC-97: Use unallocated slot marker key instead of an explicit allocation table for hash containers. This should result in memory savings and even speedups resulting from fewer memory accesses. HPPC-112: ensureCapacity(elements) added to all containers. HPPC-113: Clean up the definition of "capacity" vs. buffer size. Initial capacity is now the number of elements that can be stored without hash container rehash. A few methods have been removed or renamed because the meaning of "capacity" and presizing for the given number of expected elements is now equivalent. See API changes. HPPC-114: Buffer resizing and allocation should be throwing non-assertion mode exceptions. This is an unchecked exception. It will also leave the data structure in a consistent state. ** Bug fixes HPPC-135: KTypeVTypeAssociativeContainer#removeAll had an incorrect generic signature. HPPC-133: KTypeContainer.toArray(Class) can return incorrect array type. HPPC-131: retainAll(KTypeLookupContainer) had an incorrect generic signature. HPPC-130: removeAll(KTypeLookupContainer) had an incorrect generic signature. HPPC-115: Hash containers now, by default, use a random internal mixing seed to reorder entries. This is done to prevent a potential (but likely!) case of exponential costs of merging keys from two or more containers. If you desperately need non-permuted order, use an explicit constructor and pass HashOrderMixing.none() as the mixing strategy. Carefully weigh the risk of stalling your program with data-related deadlocks; this is only useful if you're using hash container as a scatter table (without merging it with anything else). You can also provide your own strategy to get predictable hash key ordering. Just make sure the mix seed is different from container to container (for example by using a thread local increment counter or something like that). ** Other changes HPPC-152: Remove XorShiftRandom (add a simpler RPRG: XorShift128+). HPPC-149: Recognize tests.seed as the initialization seed for randomized key mix strategies. HPPC-102: Use Arrays.copyOf instead of new[]+System.arraycopy() for resizing arrays. HPPC-141: Dropped mutable type wrappers (*Holder). HPPC-128: The preprocessor (intrinsics, preprocessor) is now deployed as part of the official release. HPPC-138: Move Intrinsics class to the generator project. Add forbidden-API checks to ensure intrinsics are replaced. HPPC-137: An overhaul of intrinsics (equality comparisons, no vtype/ ktype distinction, etc.) HPPC-129: ArraySizingStrategy#round() method has been removed completely. HPPC-125: The equals method should not return true when comparing against subclasses of the current object. This can be very misleading, especially when the subclass has a different implementation of key comparisons, etc. HPPC-123: Dropped MurmurHash3 class entirely. HPPC-121: Rename remove{All|First|Last}Occurrence(s) to remove{All|First|Last}(key). HPPC-146: Removed IntDoubleLinkedSet. HPPC-120: Rework entry shifting routine to be less hairy. HPPC-106: Drop Guava adapter (and dependency). HPPC-118: Buffers for generic classes are now declared as Object[] and not as generic type array. This prevents problems with compiler-injected casts (it does not matter for the erased type but matters in user code). HPPC-105: Cleanup project structure and IDE integration. HPPC-109: Moved @author tags to NOTICE.txt. [0.6.1] http://issues.carrot2.org/secure/ReleaseNote.jspa?projectId=10070&version=12420 ** New features HPPC-96: Identity hash maps with primitive backing storage arrays for values. [0.6.0] http://issues.carrot2.org/secure/ReleaseNote.jspa?projectId=10070&version=11820 ** API-breaking changes HPPC-82: Expose resizeAt and lastSlot to subclasses (sets, maps). HPPC-94: Drop support for Java 1.5 (backcompat build). ** Bug fixes HPPC-93: NaN keys are not treated correctly in hash sets/ maps. HPPC-80: Practical deadlock on populating a set/ map with an iterator over another map (storage-size dependent rehash). HPPC-81: Improvements to near-the-limit collection sizes and resize strategies. ** New features HPPC-85: addTo and putOrAdd pulled up to ObjectIntMap interface. HPPC-91: Added newInstanceWithExpectedSize methods to KTypeOpenHashSet and KTypeVTypeOpenHashMap (no buffer resizing for a given number of elements). [shaunkalley] HPPC-88: added get(key,defaultValue) to somehow support custom default values and potential read-only concurrent containsKey/get conditionals. ** Changes in functionality ** Other changes HPPC-79: javadocs generated with 1.7 (and 1.8) look crappy. [0.5.5] http://issues.carrot2.org/secure/ReleaseNote.jspa?projectId=10070&version=12120 ** New features ** Other changes ** API-breaking changes ** Bug fixes [0.5.4] http://issues.carrot2.org/secure/ReleaseNote.jspa?projectId=10070&version=11927 ** New features HPPC-91: Added newInstanceWithExpectedSize methods to KTypeOpenHashSet and KTypeVTypeOpenHashMap (no buffer resizing for a given number of elements). [shaunkalley] [0.5.3] http://issues.carrot2.org/secure/ReleaseNote.jspa?projectId=10070&version=11833 ** New features HPPC-88: added get(key,defaultValue) to somehow support custom default values and potential read-only concurrent containsKey/get conditionals. [0.5.2] http://issues.carrot2.org/secure/ReleaseNote.jspa?projectId=10070&version=11832 ** Bug fixes HPPC-84: hashCode calculated incorrectly for sets/ maps [0.5.1] http://issues.carrot2.org/secure/ReleaseNote.jspa?projectId=10070&version=11828 ** API-breaking changes HPPC-82: Expose resizeAt and lastSlot to subclasses (sets, maps). ** Bug fixes HPPC-80: Practical deadlock on populating a set/ map with an iterator over another map (storage-size dependent rehash). HPPC-81: Improvements to near-the-limit collection sizes and resize strategies. ** New features ** Changes in functionality ** Other changes HPPC-79: javadocs generated with 1.7 (and 1.8) look crappy. [0.5.0] http://issues.carrot2.org/secure/ReleaseNote.jspa?projectId=10070&version=10321 ** API-breaking changes: HPPC-66: allow retrieving key instances by key-equality from Object*Map versions of hash maps. Renamed lget in KTypeOpenHashSet to lkey for consistency. So, the methods accessing last found key in sets and maps are: lget (maps, accesses last value), lset (maps, accesses last value), lkey (maps, sets, accesses last key), lslot (both, slot index). HPPC-68: Lifted final markers on public methods ** New features HPPC-63: a jdk15-compatible artifact is being published to Maven Central now. HPPC-66: allow retrieving key instances by key-equality from Object*Map versions of hash maps and hash sets. HPPC-69: added toString to cursors. HPPC-77: BitSet should use hotspot intrinsics (popcnt mostly) ** Bug fixes HPPC-65: putOrAdd uses == for comparing object keys instead of equality HPPC-72: XorShiftRandom always returns a zero. [Sergey Peretyatko] This class was used only in benchmarks and tests so unless you're using it directly you're not affected. HPPC-73: get, contains and any other method may block indefinitely with high load factors and full storage array capacity HPPC-74: Load factor is not used in KTypeOpenHashSet HPPC-75: put or add may leave the internal state of the hash containers inconsistent on OOM conditions ** Other Added newInstance() to BitSet and IntDoubleLinkedSet for consistency. [0.4.1] http://issues.carrot2.org/secure/ReleaseNote.jspa?projectId=10070&version=10322 ** New features HPPC-63: a jdk15-compatible artifact is being published to Maven Central now. ** Bug fixes HPPC-65: putOrAdd uses == for comparing object keys instead of equality [0.4.0] http://issues.carrot2.org/secure/ReleaseNote.jspa?projectId=10070&version=10210 ** API-breaking changes: HPPC-60: Cleaned up the code of all iterators (including some name/scope changes of iterator classes, so if you relied on these, things may break). HPPC-59: keySet() renamed to keys() on associative containers. HPPC-46: toArray() on object types must return actual T[], not Object[] HPPC-52: Dropped custom hash functions and comparators from associative containers for speed reasons. ** New features HPPC-61: Cleaned up Maven structure: parent aggregator and submodules. HPPC-57: Added a view of values to associative containers (values() method). HPPC-49: Added support for XorShift random. HPPC-34: Added support for Cloneable. HPPC-51: Replace double hashing in open hash map/set to linear probing and a good hashing function to ensure random distribution of elements HPPC-47: Changed the implementation of MurmurHash to MurmurHash3, impl. borrowed from Sebastiano Vigna's fastutil library. [ASL] ** Bug fixes HPPC-46: toArray() on object types must return actual T[], not Object[] ** Other HPPC-58: Better integration with Eclipse, new template->code generation.