001    package edu.rice.cs.cunit.threadCheck.predicates;
002    
003    import edu.rice.cs.cunit.threadCheck.PredicateLink;
004    import edu.rice.cs.cunit.threadCheck.Combine;
005    
006    import java.lang.annotation.Retention;
007    import java.lang.annotation.RetentionPolicy;
008    import java.lang.annotation.Target;
009    import java.lang.annotation.ElementType;
010    
011    /**
012     * An annotation used to designate methods that are only allowed to be run when the
013     * method argument indexed are distinct.
014     * @author Mathias Ricken
015     */
016    @Retention(RetentionPolicy.RUNTIME)
017    @Target({ElementType.CONSTRUCTOR,ElementType.METHOD,ElementType.TYPE})
018    
019    @PredicateLink(value = ThreadCheckPredicates.class, method = "checkDistinctArguments", arguments = true)
020    public @interface DistinctArguments {
021        /**
022         * Array of undices of the method argument that must be distinct.
023         * @return array of indices of the method argument to be distinct
024         */
025        int[] value();
026    
027    
028        //
029        // nested interfaces
030        //
031    
032        /**
033         * Annotation used to designate methods that are only allowed to be run if
034         * one or more of the arguments are distinct, i.e. the individual
035         * @DistinctArguments annotations are combined using OR.
036         */
037        @Retention(RetentionPolicy.RUNTIME)
038        @Target({ElementType.CONSTRUCTOR,ElementType.METHOD,ElementType.TYPE})
039    
040        @Combine(Combine.Mode.OR)
041        public static @interface Any {
042            DistinctArguments[] value();
043        }
044    
045        /**
046         * Annotation used to designate methods that are only allowed to be run if
047         * all of the arguments are distinct, i.e. the individual
048         * @DistinctArguments annotations are combined using ALL.
049         */
050        @Retention(RetentionPolicy.RUNTIME)
051        @Target({ElementType.CONSTRUCTOR,ElementType.METHOD,ElementType.TYPE})
052    
053        @Combine(Combine.Mode.AND)
054        public static @interface All {
055            DistinctArguments[] value();
056        }
057    
058        /**
059         * Annotation used to designate methods that are only allowed to be run if
060         * none of the arguments are distinct, i.e. the individual
061         * @DistinctArguments annotations are combined using NOT.
062         */
063        @Retention(RetentionPolicy.RUNTIME)
064        @Target({ElementType.CONSTRUCTOR,ElementType.METHOD,ElementType.TYPE})
065    
066        @Combine(Combine.Mode.NOT)
067        public static @interface None {
068            DistinctArguments[] value();
069        }
070    }