001package de.monochromata.anaphors.ast.feature;
002
003import java.util.Collections;
004import java.util.HashSet;
005import java.util.Set;
006
007/**
008 * @param <QI>
009 *            The type used to represent qualified identifiers
010 */
011public class DefaultFeatureContainer<QI> implements FeatureContainer<QI> {
012
013        private final Set<Feature<QI>> features = new HashSet<Feature<QI>>();
014
015        protected void add(final Feature<QI> feature) {
016                features.add(feature);
017        }
018
019        protected void addAll(final Set<Feature<QI>> features) {
020                this.features.addAll(features);
021        }
022
023        protected void remove(final Feature<QI> feature) {
024                features.remove(feature);
025        }
026
027        protected void removeAll(final Set<Feature<QI>> features) {
028                this.features.removeAll(features);
029        }
030
031        @Override
032        public Set<Feature<QI>> getFeatures() {
033                return Collections.unmodifiableSet(features);
034        }
035
036        @Override
037        public boolean isEmpty() {
038                return features.isEmpty();
039        }
040
041        @Override
042        public boolean containsFeaturesOf(final FeatureContainer<QI> other) {
043                return features.containsAll(other.getFeatures());
044        }
045
046        @Override
047        public int hashCode() {
048                final int prime = 31;
049                int result = 1;
050                result = prime * result + ((features == null) ? 0 : features.hashCode());
051                return result;
052        }
053
054        @Override
055        public boolean equals(final Object obj) {
056                if (this == obj) {
057                        return true;
058                }
059                if (obj == null) {
060                        return false;
061                }
062                if (getClass() != obj.getClass()) {
063                        return false;
064                }
065                final DefaultFeatureContainer other = (DefaultFeatureContainer) obj;
066                if (features == null) {
067                        if (other.features != null) {
068                                return false;
069                        }
070                } else if (!features.equals(other.features)) {
071                        return false;
072                }
073                return true;
074        }
075
076        @Override
077        public String toString() {
078                return "AbstractFeatureContainer [features=" + features + "]";
079        }
080
081}