View Javadoc
1   /*
2    * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org> and others
3    *
4    * This program and the accompanying materials are made available under the
5    * terms of the Eclipse Distribution License v. 1.0 which is available at
6    * https://www.eclipse.org/org/documents/edl-v10.php.
7    *
8    * SPDX-License-Identifier: BSD-3-Clause
9    */
10  
11  package org.eclipse.jgit.revwalk;
12  
13  import java.util.AbstractSet;
14  import java.util.ArrayList;
15  import java.util.Collection;
16  import java.util.Iterator;
17  import java.util.List;
18  
19  /**
20   * Multiple application level mark bits for
21   * {@link org.eclipse.jgit.revwalk.RevObject}s.
22   *
23   * @see RevFlag
24   */
25  public class RevFlagSet extends AbstractSet<RevFlag> {
26  	int mask;
27  
28  	private final List<RevFlag> active;
29  
30  	/**
31  	 * Create an empty set of flags.
32  	 */
33  	public RevFlagSet() {
34  		active = new ArrayList<>();
35  	}
36  
37  	/**
38  	 * Create a set of flags, copied from an existing set.
39  	 *
40  	 * @param s
41  	 *            the set to copy flags from.
42  	 */
43  	public RevFlagSethref="../../../../org/eclipse/jgit/revwalk/RevFlagSet.html#RevFlagSet">RevFlagSet(RevFlagSet s) {
44  		mask = s.mask;
45  		active = new ArrayList<>(s.active);
46  	}
47  
48  	/**
49  	 * Create a set of flags, copied from an existing collection.
50  	 *
51  	 * @param s
52  	 *            the collection to copy flags from.
53  	 */
54  	public RevFlagSet(Collection<RevFlag> s) {
55  		this();
56  		addAll(s);
57  	}
58  
59  	/** {@inheritDoc} */
60  	@Override
61  	public boolean contains(Object o) {
62  		if (o instanceof RevFlag)
63  			return (mask & ((RevFlag) o).mask) != 0;
64  		return false;
65  	}
66  
67  	/** {@inheritDoc} */
68  	@Override
69  	public boolean containsAll(Collection<?> c) {
70  		if (c instanceof RevFlagSet) {
71  			final int cMask = ((RevFlagSet) c).mask;
72  			return (mask & cMask) == cMask;
73  		}
74  		return super.containsAll(c);
75  	}
76  
77  	/** {@inheritDoc} */
78  	@Override
79  	public boolean add(RevFlag flag) {
80  		if ((mask & flag.mask) != 0)
81  			return false;
82  		mask |= flag.mask;
83  		int p = 0;
84  		while (p < active.size() && active.get(p).mask < flag.mask)
85  			p++;
86  		active.add(p, flag);
87  		return true;
88  	}
89  
90  	/** {@inheritDoc} */
91  	@Override
92  	public boolean remove(Object o) {
93  		final RevFlag"../../../../org/eclipse/jgit/revwalk/RevFlag.html#RevFlag">RevFlag flag = (RevFlag) o;
94  		if ((mask & flag.mask) == 0)
95  			return false;
96  		mask &= ~flag.mask;
97  		for (int i = 0; i < active.size(); i++)
98  			if (active.get(i).mask == flag.mask)
99  				active.remove(i);
100 		return true;
101 	}
102 
103 	/** {@inheritDoc} */
104 	@Override
105 	public Iterator<RevFlag> iterator() {
106 		final Iterator<RevFlag> i = active.iterator();
107 		return new Iterator<RevFlag>() {
108 			private RevFlag current;
109 
110 			@Override
111 			public boolean hasNext() {
112 				return i.hasNext();
113 			}
114 
115 			@Override
116 			public RevFlag next() {
117 				return current = i.next();
118 			}
119 
120 			@Override
121 			public void remove() {
122 				mask &= ~current.mask;
123 				i.remove();
124 			}
125 		};
126 	}
127 
128 	/** {@inheritDoc} */
129 	@Override
130 	public int size() {
131 		return active.size();
132 	}
133 }