Switch jgit library to the EDL (3-clause BSD)
[egit/zawir.git] / org.spearce.jgit / src / org / spearce / jgit / revwalk / RevFlagSet.java
blob62a1dd22b07bcb264c7cc7cb7409d139695bbfbe
1 /*
2 * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>
4 * All rights reserved.
6 * Redistribution and use in source and binary forms, with or
7 * without modification, are permitted provided that the following
8 * conditions are met:
10 * - Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
13 * - Redistributions in binary form must reproduce the above
14 * copyright notice, this list of conditions and the following
15 * disclaimer in the documentation and/or other materials provided
16 * with the distribution.
18 * - Neither the name of the Git Development Community nor the
19 * names of its contributors may be used to endorse or promote
20 * products derived from this software without specific prior
21 * written permission.
23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
24 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
25 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
26 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
28 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
29 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
30 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
31 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
32 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
33 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
35 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38 package org.spearce.jgit.revwalk;
40 import java.util.AbstractSet;
41 import java.util.ArrayList;
42 import java.util.Collection;
43 import java.util.Iterator;
44 import java.util.List;
46 /**
47 * Multiple application level mark bits for {@link RevObject}s.
49 * @see RevFlag
51 public class RevFlagSet extends AbstractSet<RevFlag> {
52 int mask;
54 private final List<RevFlag> active;
56 /** Create an empty set of flags. */
57 public RevFlagSet() {
58 active = new ArrayList<RevFlag>();
61 /**
62 * Create a set of flags, copied from an existing set.
64 * @param s
65 * the set to copy flags from.
67 public RevFlagSet(final RevFlagSet s) {
68 mask = s.mask;
69 active = new ArrayList<RevFlag>(s.active);
72 /**
73 * Create a set of flags, copied from an existing collection.
75 * @param s
76 * the collection to copy flags from.
78 public RevFlagSet(final Collection<RevFlag> s) {
79 this();
80 addAll(s);
83 @Override
84 public boolean contains(final Object o) {
85 if (o instanceof RevFlag)
86 return (mask & ((RevFlag) o).mask) != 0;
87 return false;
90 @Override
91 public boolean containsAll(final Collection<?> c) {
92 if (c instanceof RevFlagSet) {
93 final int cMask = ((RevFlagSet) c).mask;
94 return (mask & cMask) == cMask;
96 return super.containsAll(c);
99 @Override
100 public boolean add(final RevFlag flag) {
101 if ((mask & flag.mask) != 0)
102 return false;
103 mask |= flag.mask;
104 int p = 0;
105 while (p < active.size() && active.get(p).mask < flag.mask)
106 p++;
107 active.add(p, flag);
108 return true;
111 @Override
112 public boolean remove(final Object o) {
113 final RevFlag flag = (RevFlag) o;
114 if ((mask & flag.mask) == 0)
115 return false;
116 mask &= ~flag.mask;
117 for (int i = 0; i < active.size(); i++)
118 if (active.get(i).mask == flag.mask)
119 active.remove(i);
120 return true;
123 @Override
124 public Iterator<RevFlag> iterator() {
125 final Iterator<RevFlag> i = active.iterator();
126 return new Iterator<RevFlag>() {
127 private RevFlag current;
129 public boolean hasNext() {
130 return i.hasNext();
133 public RevFlag next() {
134 return current = i.next();
137 public void remove() {
138 mask &= ~current.mask;
139 i.remove();
144 @Override
145 public int size() {
146 return active.size();