001 package edu.rice.cs.cunit.threadCheck; 002 003 import java.lang.annotation.Retention; 004 import java.lang.annotation.RetentionPolicy; 005 import java.lang.annotation.Target; 006 import java.lang.annotation.ElementType; 007 008 /** 009 * Meta-annotation that specifies what Boolean operation is used to combine the predicate annotations 010 * contained in the annotation that is annotated by this meta-annotation. 011 * 012 * The @Combine meta-annotation lets the Thread Checker know that the annotation interface annotated with 013 * it is intended to be processed by the Thread Checker. If an annotation interface is intended to be 014 * a Thread Checker annotation and it contains annotations or arrays of annotations as members, then 015 * the annotations used must also be Thread Checker annotations, and the annotation interface must be 016 * annotated with the @Combine meta-annotation. 017 * 018 * An annotation interface annotated with @Combine may not contain members that are not annotations or 019 * arrays of annotations, and those annotation interfaces must themselves be Thread Checker annotations. 020 * 021 * The @PredicateLink and @Combine meta-annotations are mutually exclusive. 022 * @author Mathias Ricken 023 */ 024 @Retention(RetentionPolicy.RUNTIME) 025 @Target({ElementType.ANNOTATION_TYPE}) 026 public @interface Combine { 027 /** 028 * Boolean operation used to combine the results of other predicates. 029 */ 030 public static enum Mode { 031 /** 032 * Combine results of predicates using AND. 033 */ 034 AND, 035 036 /** 037 * Combine results of predicates using OR. 038 */ 039 OR, 040 041 /** 042 * Results in TRUE when one and only one of the operands is TRUE. It follows the true meaning of 043 * "exclusive or". 044 * 045 * (a XOR b XOR c) is therefore equivalent to 046 * (a AND (NOT b) AND (NOT c)) OR ((NOT a) AND b AND (NOT c)) OR ((NOT a) AND (NOT b) AND c) 047 */ 048 XOR, 049 050 /** 051 * Invert result of predicate result. This is intended to be applied to only one predicate annotation. 052 */ 053 NOT, 054 055 /** 056 * Implication. This is intended to be applied to exactly one array of two predicate annotation. 057 * It is necessary to have an array of two predicate annotations, because implication is defined 058 * only with two operands, and without the array, we would not be able to guarantee consistent 059 * ordering as required by the non-commutable implication operation. 060 */ 061 IMPLIES 062 } 063 064 /** 065 * Class containing the predicate method. 066 * @return class containing the predicate method. 067 */ 068 Mode value() default Mode.OR; 069 070 /** 071 * Whether the method arguments should be passed as well, after the value of "this" and 072 * before the annotation values. 073 * @return true if method arguments should be passed 074 */ 075 boolean arguments() default false; 076 }