1 /* 2 * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org> 3 * and other copyright owners as documented in the project's IP log. 4 * 5 * This program and the accompanying materials are made available 6 * under the terms of the Eclipse Distribution License v1.0 which 7 * accompanies this distribution, is reproduced below, and is 8 * available at http://www.eclipse.org/org/documents/edl-v10.php 9 * 10 * All rights reserved. 11 * 12 * Redistribution and use in source and binary forms, with or 13 * without modification, are permitted provided that the following 14 * conditions are met: 15 * 16 * - Redistributions of source code must retain the above copyright 17 * notice, this list of conditions and the following disclaimer. 18 * 19 * - Redistributions in binary form must reproduce the above 20 * copyright notice, this list of conditions and the following 21 * disclaimer in the documentation and/or other materials provided 22 * with the distribution. 23 * 24 * - Neither the name of the Eclipse Foundation, Inc. nor the 25 * names of its contributors may be used to endorse or promote 26 * products derived from this software without specific prior 27 * written permission. 28 * 29 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 30 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 31 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 32 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 33 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 34 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 35 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 36 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 37 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 38 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 40 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 41 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 42 */ 43 44 package org.eclipse.jgit.revwalk; 45 46 import java.util.AbstractSet; 47 import java.util.ArrayList; 48 import java.util.Collection; 49 import java.util.Iterator; 50 import java.util.List; 51 52 /** 53 * Multiple application level mark bits for 54 * {@link org.eclipse.jgit.revwalk.RevObject}s. 55 * 56 * @see RevFlag 57 */ 58 public class RevFlagSet extends AbstractSet<RevFlag> { 59 int mask; 60 61 private final List<RevFlag> active; 62 63 /** 64 * Create an empty set of flags. 65 */ 66 public RevFlagSet() { 67 active = new ArrayList<>(); 68 } 69 70 /** 71 * Create a set of flags, copied from an existing set. 72 * 73 * @param s 74 * the set to copy flags from. 75 */ 76 public RevFlagSet(RevFlagSet s) { 77 mask = s.mask; 78 active = new ArrayList<>(s.active); 79 } 80 81 /** 82 * Create a set of flags, copied from an existing collection. 83 * 84 * @param s 85 * the collection to copy flags from. 86 */ 87 public RevFlagSet(Collection<RevFlag> s) { 88 this(); 89 addAll(s); 90 } 91 92 /** {@inheritDoc} */ 93 @Override 94 public boolean contains(Object o) { 95 if (o instanceof RevFlag) 96 return (mask & ((RevFlag) o).mask) != 0; 97 return false; 98 } 99 100 /** {@inheritDoc} */ 101 @Override 102 public boolean containsAll(Collection<?> c) { 103 if (c instanceof RevFlagSet) { 104 final int cMask = ((RevFlagSet) c).mask; 105 return (mask & cMask) == cMask; 106 } 107 return super.containsAll(c); 108 } 109 110 /** {@inheritDoc} */ 111 @Override 112 public boolean add(RevFlag flag) { 113 if ((mask & flag.mask) != 0) 114 return false; 115 mask |= flag.mask; 116 int p = 0; 117 while (p < active.size() && active.get(p).mask < flag.mask) 118 p++; 119 active.add(p, flag); 120 return true; 121 } 122 123 /** {@inheritDoc} */ 124 @Override 125 public boolean remove(Object o) { 126 final RevFlag flag = (RevFlag) o; 127 if ((mask & flag.mask) == 0) 128 return false; 129 mask &= ~flag.mask; 130 for (int i = 0; i < active.size(); i++) 131 if (active.get(i).mask == flag.mask) 132 active.remove(i); 133 return true; 134 } 135 136 /** {@inheritDoc} */ 137 @Override 138 public Iterator<RevFlag> iterator() { 139 final Iterator<RevFlag> i = active.iterator(); 140 return new Iterator<RevFlag>() { 141 private RevFlag current; 142 143 @Override 144 public boolean hasNext() { 145 return i.hasNext(); 146 } 147 148 @Override 149 public RevFlag next() { 150 return current = i.next(); 151 } 152 153 @Override 154 public void remove() { 155 mask &= ~current.mask; 156 i.remove(); 157 } 158 }; 159 } 160 161 /** {@inheritDoc} */ 162 @Override 163 public int size() { 164 return active.size(); 165 } 166 }