de.caff.generics

## Class MatchSet<E>

- java.lang.Object
- - de.caff.generics.MatchSet<E>

- Type Parameters:
    `E` - set type
  All Implemented Interfaces:
    java.lang.Iterable<E>, java.util.Collection<E>, java.util.Set<E>

      public class MatchSet<E>
      extends java.lang.Object
      implements java.util.Set<E>

  A set which is using an `UniformMatcher` for checker for equality.

  Equality checking will always use the element already in the list as first argument of the matcher.

  Because a matcher can only check for equality, each insertion operation needs to compare all objects contained in the set with the new one. Therefore this is quite a slow set, all operations are either O(N) or O(N^2).

  Another difference is that the order of insertions is kept, duplicate additions just add nothing.

  Author:
    Rammi

- - ### Constructor Summary

    Constructors
    Constructor and Description
    `MatchSet()` Constructor.
    `MatchSet(UniformMatcher<? super E> matcher)` Constructor.
    `MatchSet(UniformMatcher<? super E> matcher, java.lang.Iterable<? extends E> iterable)` Constructor.

  - ### Method Summary

    All Methods Instance Methods Concrete Methods
    Modifier and Type | Method and Description
    --- | ---
    `boolean` | `add(E o)` Adds the specified element to this set if it is not already present (optional operation).
    `boolean` | `addAll(java.util.Collection<? extends E> 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.
    `boolean` | `isEmpty()` Returns `true` if this set contains no elements.
    `java.util.Iterator<E>` | `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`

- - ### Constructor Detail

    - #### MatchSet

          public MatchSet()

      Constructor. This uses a `Match.DEFAULT_MATCHER` as matcher, i.e. uses the elements equals() method.

    - #### MatchSet

          public MatchSet(UniformMatcher<? super E> matcher)

      Constructor.
      Parameters:
        `matcher` - matcher to use for equality checking

    - #### MatchSet

          public MatchSet(UniformMatcher<? super E> matcher,
                          java.lang.Iterable<? extends E> iterable)

      Constructor.
      Parameters:
        `matcher` - matcher to use for equality checking
        `iterable` - elements to add

  - ### 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<E>`
      Specified by:
        `size` in interface `java.util.Set<E>`
      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<E>`
      Specified by:
        `isEmpty` in interface `java.util.Set<E>`
      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<E>`
      Specified by:
        `contains` in interface `java.util.Set<E>`
      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<E> 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<E>`
      Specified by:
        `iterator` in interface `java.util.Collection<E>`
      Specified by:
        `iterator` in interface `java.util.Set<E>`
      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<E>`
      Specified by:
        `toArray` in interface `java.util.Set<E>`
      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<E>`
      Specified by:
        `toArray` in interface `java.util.Set<E>`
      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(E 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<E>`
      Specified by:
        `add` in interface `java.util.Set<E>`
      Parameters:
        `o` - element to be added to this set.
      Returns:
        `true` if this set did not already contain the specified element.
      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). More formally, removes an element `e` such that `(o==null ? e==null : o.equals(e))`, if the set contains such an element. Returns `true` if the set contained the specified element (or equivalently, if the set changed as a result of the call). (The set will not contain the specified element once the call returns.)
      Specified by:
        `remove` in interface `java.util.Collection<E>`
      Specified by:
        `remove` in interface `java.util.Set<E>`
      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<E>`
      Specified by:
        `containsAll` in interface `java.util.Set<E>`
      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 E> 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<E>`
      Specified by:
        `addAll` in interface `java.util.Set<E>`
      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). In other words, removes from this set all of its elements that are not contained in the specified collection. If the specified collection is also a set, this operation effectively modifies this set so that its value is the intersection of the two sets.
      Specified by:
        `retainAll` in interface `java.util.Collection<E>`
      Specified by:
        `retainAll` in interface `java.util.Set<E>`
      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). If the specified collection is also a set, this operation effectively modifies this set so that its value is the asymmetric set difference of the two sets.
      Specified by:
        `removeAll` in interface `java.util.Collection<E>`
      Specified by:
        `removeAll` in interface `java.util.Set<E>`
      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<E>`
      Specified by:
        `clear` in interface `java.util.Set<E>`
      Throws:
        `java.lang.UnsupportedOperationException` - if the `clear` method is not supported by this set.