/*
 * [TestEnumSet.java]
 *
 * Summary: Test out the features of an EnumSet.
 *
 * Copyright: (c) 2009-2017 Roedy Green, Canadian Mind Products, http://mindprod.com
 *
 * Licence: This software may be copied and used freely for any purpose but military.
 *          http://mindprod.com/contact/nonmil.html
 *
 * Requires: JDK 1.8+
 *
 * Created with: JetBrains IntelliJ IDEA IDE http://www.jetbrains.com/idea/
 *
 * Version History:
 *  1.0 2007-07-29
 */
package com.mindprod.example;

import java.util.EnumSet;

import static java.lang.System.*;

/**
 * top level default scope enum class, in same *.java file as import static java.lang.System.*; public class.
 * Normally it would be public in its own
 * *.java file.
 */
@SuppressWarnings( { "UnusedDeclaration" } )
enum TreeSpecies
    {
        ALDER, ASPEN, BIRCH, CEDAR, FIR,
        HEMLOCK, PINE, SEQUOIA, SPRUCE
    }

/**
 * Test out the features of an EnumSet.
 *
 * @author Roedy Green, Canadian Mind Products
 * @version 1.0 2007-07-29
 * @since 2007-07-29
 */
public final class TestEnumSet
    {
    /**
     * test driver.
     *
     * @param args not used
     */
    @SuppressWarnings( { "RedundantTypeArguments" } )
    public static void main( String[] args )
        {
        // create a set by explicitly listing the individual elements
        EnumSet<TreeSpecies> pair =
                EnumSet.<TreeSpecies>of( TreeSpecies.ASPEN, TreeSpecies.CEDAR
                        /* ... */ );
        // Note . comes BEFORE <TreeSpecies>.
        // Or trust the compiler static type inference,
        // shortening to EnumSet.of( ASPEN, CEDAR );
        // prints [ASPEN, CEDAR]
        out.println( pair );
        // get all but those selected
        EnumSet<TreeSpecies> most = EnumSet.complementOf( pair );
        // If you leave out the <TreeSpecies> in the line above,
        // you revert to untyped Enums,
        // but the compiler will not warn you!
        // prints [ALDER, BIRCH, FIR, HEMLOCK, PINE, SEQUOIA, SPRUCE]
        // size gives you the current number elements in the set, not TreeSpecies.values().length
        out.println( most.size() );
        out.println( most );
        // Iterate over all the elements of the set.
        // Prints ALDER, BIRCH, FIR, HEMLOCK, PINE, SEQUOIA, SPRUCE one per line.
        for ( TreeSpecies s : most )
            {
            out.println( s );
            }
        // get empty set
        EnumSet<TreeSpecies> empty = EnumSet.noneOf( TreeSpecies.class );
        // prints []
        out.println( empty );
        // get everything
        EnumSet<TreeSpecies> everything = EnumSet.allOf( TreeSpecies.class );
        // prints [ALDER, ASPEN, BIRCH, CEDAR, FIR, HEMLOCK, PINE, SEQUOIA, SPRUCE]
        out.println( everything );
        // get just one element
        EnumSet<TreeSpecies> single = EnumSet.of( TreeSpecies.SEQUOIA );
        // prints [SEQUOIA]
        out.println( single );
        // This is the most c o m m o n method, the main reason to concoct an EnumSet.
        // You commonly construct an EnumSet combo of things to do, then one by one test if you are supposed to do them.
        // Is CEDAR an element of pair?
        // Prints [true]
        out.println( pair.contains( TreeSpecies.CEDAR ) );
        // is pair a subset of most? Prints false
        // Note containsAll, not contains.
        // You won't get an error message if you forget
        // prints [false]
        out.println( most.containsAll( pair ) );
        // is pair a subset of everything?
        // prints [true]
        out.println( everything.containsAll( pair ) );
        // adding a single element
        // prints [ASPEN, CEDAR, PINE]
        EnumSet<TreeSpecies> triple = pair.clone();
        triple.add( TreeSpecies.PINE );
        out.println( triple );
        // You would think there would be methods corresponding to the things mathematicians do with sets,
        // but they are not implemented. e.g. union, intersection, subtract, isSubsetOf,
        // isSupersetOf… There is Interface.containsAll Set.retainAll, but not very efficiently implemented.
        }
    }