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}