de.caff.generics

## Class AbstractBasicCountingSet<T>

- java.lang.Object
- - de.caff.generics.AbstractBasicCountingSet<T>

- All Implemented Interfaces:
    CountingSet<T>, java.lang.Iterable<T>, java.util.Collection<T>, java.util.Set<T>
  Direct Known Subclasses:
    CountingHashSet, CountingTreeSet

      class AbstractBasicCountingSet<T>
      extends java.lang.Object
      implements CountingSet<T>

  Basic implementation for counting sets.

  Because it would be breaking the set semantics removal is not allowed. All removal methods but `clear()` therefore will throw an `UnsupportedOperationException`.

  Author:
    Rammi

- - ### Field Summary

    Fields
    Modifier and Type | Field and Description
    --- | ---
    `protected java.util.function.Supplier<Counter>` | `creator`
    `protected java.util.Map<T,Counter>` | `map`

  - ### Constructor Summary

    Constructors
    Constructor and Description
    `AbstractBasicCountingSet(java.util.Map<T,Counter> map, java.util.function.Supplier<Counter> creator)` Constructor.

  - ### Method Summary

    All Methods Instance Methods Concrete Methods
    Modifier and Type | Method and Description
    --- | ---
    `boolean` | `add(T o)` Adds the specified element to this set if it is not already present (optional operation).
    `boolean` | `addAll(java.util.Collection<? extends T> c)` Adds all of the elements in the specified collection to this set if they're not already present (optional operation).
    `void` | `clear()` Removes all of the elements from this set (optional operation).
    `boolean` | `contains(java.lang.Object o)` Returns `true` if this set contains the specified element.
    `boolean` | `containsAll(java.util.Collection<?> c)` Returns `true` if this set contains all of the elements of the specified collection.
    `int` | `getCount(T item)` Get the count how often any item was added.
    `boolean` | `isEmpty()` Returns `true` if this set contains no elements.
    `java.util.Iterator<T>` | `iterator()` Returns an iterator over the elements in this set.
    `boolean` | `remove(java.lang.Object o)` Removes the specified element from this set if it is present (optional operation).
    `boolean` | `removeAll(java.util.Collection<?> c)` Removes from this set all of its elements that are contained in the specified collection (optional operation).
    `boolean` | `retainAll(java.util.Collection<?> c)` Retains only the elements in this set that are contained in the specified collection (optional operation).
    `int` | `size()` Returns the number of elements in this set (its cardinality).
    `java.lang.Object[]` | `toArray()` Returns an array containing all of the elements in this set.
    `<U> U[]` | `toArray(U[] a)` Returns an array containing all of the elements in this set; the runtime type of the returned array is that of the specified array.

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

    - ### Methods inherited from interface java.util.Set

      `equals, hashCode, spliterator`

    - ### Methods inherited from interface java.util.Collection

      `parallelStream, removeIf, stream`

    - ### Methods inherited from interface java.lang.Iterable

      `forEach`

- - ### Field Detail

    - #### creator

          @NotNull
          protected final java.util.function.Supplier<Counter> creator

    - #### map

          @NotNull
          protected final java.util.Map<T,Counter> map

  - ### Constructor Detail

    - #### AbstractBasicCountingSet

          public AbstractBasicCountingSet(@NotNull
                                          java.util.Map<T,Counter> map,
                                          @NotNull
                                          java.util.function.Supplier<Counter> creator)

      Constructor.
      Parameters:
        `map` - counter map
        `creator` - creator for more counters

  - ### Method Detail

    - #### size

          public int size()

      Returns the number of elements in this set (its cardinality). If this set contains more than `Integer.MAX_VALUE` elements, returns `Integer.MAX_VALUE`.
      Specified by:
        `size` in interface `java.util.Collection<T>`
      Specified by:
        `size` in interface `java.util.Set<T>`
      Returns:
        the number of elements in this set (its cardinality).

    - #### isEmpty

          public boolean isEmpty()

      Returns `true` if this set contains no elements.
      Specified by:
        `isEmpty` in interface `java.util.Collection<T>`
      Specified by:
        `isEmpty` in interface `java.util.Set<T>`
      Returns:
        `true` if this set contains no elements.

    - #### contains

          public boolean contains(java.lang.Object o)

      Returns `true` if this set contains the specified element. More formally, returns `true` if and only if this set contains an element `e` such that `(o==null ? e==null : o.equals(e))`.
      Specified by:
        `contains` in interface `java.util.Collection<T>`
      Specified by:
        `contains` in interface `java.util.Set<T>`
      Parameters:
        `o` - element whose presence in this set is to be tested.
      Returns:
        `true` if this set contains the specified element.
      Throws:
        `java.lang.ClassCastException` - if the type of the specified element is incompatible with this set (optional).
        `java.lang.NullPointerException` - if the specified element is null and this set does not support null elements (optional).

    - #### iterator

          @NotNull
          public java.util.Iterator<T> iterator()

      Returns an iterator over the elements in this set. The elements are returned in no particular order (unless this set is an instance of some class that provides a guarantee).
      Specified by:
        `iterator` in interface `java.lang.Iterable<T>`
      Specified by:
        `iterator` in interface `java.util.Collection<T>`
      Specified by:
        `iterator` in interface `java.util.Set<T>`
      Returns:
        an iterator over the elements in this set.

    - #### toArray

          @NotNull
          public java.lang.Object[] toArray()

      Returns an array containing all of the elements in this set. Obeys the general contract of the `Collection.toArray` method.
      Specified by:
        `toArray` in interface `java.util.Collection<T>`
      Specified by:
        `toArray` in interface `java.util.Set<T>`
      Returns:
        an array containing all of the elements in this set.

    - #### toArray

          @NotNull
          public <U> U[] toArray(@NotNull
                                          U[] a)

      Returns an array containing all of the elements in this set; the runtime type of the returned array is that of the specified array. Obeys the general contract of the `Collection.toArray(Object[])` method.
      Specified by:
        `toArray` in interface `java.util.Collection<T>`
      Specified by:
        `toArray` in interface `java.util.Set<T>`
      Parameters:
        `a` - the array into which the elements of this set are to be stored, if it is big enough; otherwise, a new array of the same runtime type is allocated for this purpose.
      Returns:
        an array containing the elements of this set.
      Throws:
        `java.lang.ArrayStoreException` - the runtime type of a is not a supertype of the runtime type of every element in this set.
        `java.lang.NullPointerException` - if the specified array is `null`.

    - #### add

          public boolean add(T o)

      Adds the specified element to this set if it is not already present (optional operation). More formally, adds the specified element, `o`, to this set if this set contains no element `e` such that `(o==null ? e==null : o.equals(e))`. If this set already contains the specified element, the call leaves this set unchanged and returns `false`. In combination with the restriction on constructors, this ensures that sets never contain duplicate elements.

      The stipulation above does not imply that sets must accept all elements; sets may refuse to add any particular element, including `null`, and throwing an exception, as described in the specification for `Collection.add`. Individual set implementations should clearly document any restrictions on the elements that they may contain.

      Specified by:
        `add` in interface `java.util.Collection<T>`
      Specified by:
        `add` in interface `java.util.Set<T>`
      Parameters:
        `o` - element to be added to this set.
      Returns:
        `true`
      Throws:
        `java.lang.UnsupportedOperationException` - if the `add` method is not supported by this set.
        `java.lang.ClassCastException` - if the class of the specified element prevents it from being added to this set.
        `java.lang.NullPointerException` - if the specified element is null and this set does not support null elements.
        `java.lang.IllegalArgumentException` - if some aspect of the specified element prevents it from being added to this set.

    - #### remove

          public boolean remove(java.lang.Object o)

      Removes the specified element from this set if it is present (optional operation).

      This method will throw an `UnsupportedOperationException`!

      Specified by:
        `remove` in interface `java.util.Collection<T>`
      Specified by:
        `remove` in interface `java.util.Set<T>`
      Parameters:
        `o` - object to be removed from this set, if present.
      Returns:
        true if the set contained the specified element.
      Throws:
        `java.lang.ClassCastException` - if the type of the specified element is incompatible with this set (optional).
        `java.lang.NullPointerException` - if the specified element is null and this set does not support null elements (optional).
        `java.lang.UnsupportedOperationException` - if the `remove` method is not supported by this set.

    - #### containsAll

          public boolean containsAll(@NotNull
                                     java.util.Collection<?> c)

      Returns `true` if this set contains all of the elements of the specified collection. If the specified collection is also a set, this method returns `true` if it is a subset of this set.
      Specified by:
        `containsAll` in interface `java.util.Collection<T>`
      Specified by:
        `containsAll` in interface `java.util.Set<T>`
      Parameters:
        `c` - collection to be checked for containment in this set.
      Returns:
        `true` if this set contains all of the elements of the specified collection.
      Throws:
        `java.lang.ClassCastException` - if the types of one or more elements in the specified collection are incompatible with this set (optional).
        `java.lang.NullPointerException` - if the specified collection contains one or more null elements and this set does not support null elements (optional); or if the specified collection is `null`.
      See Also:
        `contains(Object)`

    - #### addAll

          public boolean addAll(@NotNull
                                java.util.Collection<? extends T> c)

      Adds all of the elements in the specified collection to this set if they're not already present (optional operation). If the specified collection is also a set, the `addAll` operation effectively modifies this set so that its value is the union of the two sets. The behavior of this operation is unspecified if the specified collection is modified while the operation is in progress.
      Specified by:
        `addAll` in interface `java.util.Collection<T>`
      Specified by:
        `addAll` in interface `java.util.Set<T>`
      Parameters:
        `c` - collection whose elements are to be added to this set.
      Returns:
        `true` if this set changed as a result of the call.
      Throws:
        `java.lang.UnsupportedOperationException` - if the `addAll` method is not supported by this set.
        `java.lang.ClassCastException` - if the class of some element of the specified collection prevents it from being added to this set.
        `java.lang.NullPointerException` - if the specified collection contains one or more null elements and this set does not support null elements, or if the specified collection is `null`.
        `java.lang.IllegalArgumentException` - if some aspect of some element of the specified collection prevents it from being added to this set.
      See Also:
        `add(Object)`

    - #### retainAll

          public boolean retainAll(@NotNull
                                   java.util.Collection<?> c)

      Retains only the elements in this set that are contained in the specified collection (optional operation).

      This method will throw an `UnsupportedOperationException`!

      Specified by:
        `retainAll` in interface `java.util.Collection<T>`
      Specified by:
        `retainAll` in interface `java.util.Set<T>`
      Parameters:
        `c` - collection that defines which elements this set will retain.
      Returns:
        `true` if this collection changed as a result of the call.
      Throws:
        `java.lang.UnsupportedOperationException` - if the `retainAll` method is not supported by this Collection.
        `java.lang.ClassCastException` - if the types of one or more elements in this set are incompatible with the specified collection (optional).
        `java.lang.NullPointerException` - if this set contains a null element and the specified collection does not support null elements (optional); or if the specified collection is `null`.
      See Also:
        `remove(Object)`

    - #### removeAll

          public boolean removeAll(@NotNull
                                   java.util.Collection<?> c)

      Removes from this set all of its elements that are contained in the specified collection (optional operation).

      This method will throw an `UnsupportedOperationException`!

      Specified by:
        `removeAll` in interface `java.util.Collection<T>`
      Specified by:
        `removeAll` in interface `java.util.Set<T>`
      Parameters:
        `c` - collection that defines which elements will be removed from this set.
      Returns:
        `true` if this set changed as a result of the call.
      Throws:
        `java.lang.UnsupportedOperationException` - if the `removeAll` method is not supported by this Collection.
        `java.lang.ClassCastException` - if the types of one or more elements in this set are incompatible with the specified collection (optional).
        `java.lang.NullPointerException` - if this set contains a null element and the specified collection does not support null elements (optional); or if the specified collection is `null`.
      See Also:
        `remove(Object)`

    - #### clear

          public void clear()

      Removes all of the elements from this set (optional operation). This set will be empty after this call returns (unless it throws an exception).
      Specified by:
        `clear` in interface `java.util.Collection<T>`
      Specified by:
        `clear` in interface `java.util.Set<T>`
      Throws:
        `java.lang.UnsupportedOperationException` - if the `clear` method is not supported by this set.

    - #### getCount

          public int getCount(T item)

      Get the count how often any item was added.
      Specified by:
        `getCount` in interface `CountingSet<T>`
      Parameters:
        `item` - item to look for
      Returns:
        add count or `0` if the item was never added (or the clear code has been used after its addition)