1 package cz.cuni.amis.utils.flag.connective; 2 3 import java.util.Map; 4 import java.util.WeakHashMap; 5 6 import cz.cuni.amis.utils.flag.Flag; 7 8 9 public class And extends Connective { 10 11 private static Map<And, And> ands = new WeakHashMap<And, And>(); 12 13 public static And get(Flag<Boolean> flag1, Flag<Boolean> flag2) { 14 return get(new Flag[]{flag1, flag2}); 15 } 16 17 public static And get(Flag<Boolean>[] flags) { 18 synchronized(ands) { 19 And and = new And(flags); 20 And existingAnd = ands.get(and); 21 if (existingAnd != null) return existingAnd; 22 ands.put(and, and); 23 return and; 24 } 25 } 26 27 protected int trueValue = 0; 28 29 private And(Flag<Boolean> flag1, Flag<Boolean> flag2) { 30 this(new Flag[]{flag1, flag2}); 31 } 32 33 private And(Flag<Boolean>[] flags) { 34 super(flags); 35 trueValue = (int) Math.pow(2, flags.length-1); 36 } 37 38 @Override 39 protected void truthValueChanged() { 40 synchronized(truthValue) { 41 setFlag(truthValue[0] == trueValue); 42 } 43 } 44 45 public boolean equals(Object obj) { 46 if (!(obj instanceof And)) return false; 47 And and = (And)obj; 48 for (Flag<Boolean> flag : this.flags) { 49 if (!and.flags.contains(flag)) return false; 50 } 51 return true; 52 } 53 54 }