001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *     http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.commons.collections.primitives;
018    
019    /**
020     * Abstract base class for {@link BooleanCollection}s.
021     * <p/>
022     * Read-only subclasses must override {@link #iterator} and {@link #size}.
023     * Mutable subclasses should also override {@link #add} and {@link
024     * BooleanIterator#remove BooleanIterator.remove}.  All other methods have
025     * at least some base implementation derived from these.  Subclasses may
026     * choose to override these methods to provide a more efficient implementation.
027     * 
028     * @since Commons Primitives 1.1
029     * @version $Revision: 480460 $ $Date: 2006-11-29 09:14:21 +0100 (Wed, 29 Nov 2006) $
030     */
031    public abstract class AbstractBooleanCollection implements BooleanCollection {
032        public abstract BooleanIterator iterator();
033        public abstract int size();
034              
035        protected AbstractBooleanCollection() { }
036                  
037        /** Unsupported in this base implementation. */
038        public boolean add(boolean element) {
039            throw new UnsupportedOperationException(
040                    "add(boolean) is not supported.");
041        }
042    
043        public boolean addAll(BooleanCollection c) {
044            boolean modified = false;
045            for(BooleanIterator iter = c.iterator(); iter.hasNext(); ) {
046                modified  |= add(iter.next());
047            }
048            return modified;
049        }
050        
051        public void clear() {
052            for(BooleanIterator iter = iterator(); iter.hasNext();) {
053                iter.next();
054                iter.remove();
055            }
056        }        
057    
058        public boolean contains(boolean element) {
059            for(BooleanIterator iter = iterator(); iter.hasNext();) {
060                if(iter.next() == element) {
061                    return true;
062                }
063            }
064            return false;
065        }
066            
067        public boolean containsAll(BooleanCollection c) {
068            for(BooleanIterator iter = c.iterator(); iter.hasNext();) {
069                if(!contains(iter.next())) {
070                    return false;
071                }
072            }
073            return true;
074        }
075        
076        public boolean isEmpty() {
077            return (0 == size());
078        }
079           
080        public boolean removeElement(boolean element) {
081            for(BooleanIterator iter = iterator(); iter.hasNext();) {
082                if(iter.next() == element) {
083                    iter.remove();
084                    return true;
085                }
086            }
087            return false;
088        }        
089        
090        public boolean removeAll(BooleanCollection c) {
091            boolean modified = false;
092            for(BooleanIterator iter = c.iterator(); iter.hasNext(); ) {
093                modified  |= removeElement(iter.next());
094            }
095            return modified;
096        }       
097        
098        public boolean retainAll(BooleanCollection c) {
099            boolean modified = false;
100            for(BooleanIterator iter = iterator(); iter.hasNext();) {
101                if(!c.contains(iter.next())) {
102                    iter.remove();
103                    modified = true;
104                }
105            }
106            return modified;
107        }
108        
109        public boolean[] toArray() {
110            boolean[] array = new boolean[size()];
111            int i = 0;
112            for(BooleanIterator iter = iterator(); iter.hasNext();) {
113                array[i] = iter.next();
114                i++;
115            }
116            return array;
117        }
118            
119        public boolean[] toArray(boolean[] a) {
120            if(a.length < size()) {
121                return toArray();
122            } else {
123                int i = 0;
124                for(BooleanIterator iter = iterator(); iter.hasNext();) {
125                    a[i] = iter.next();
126                    i++;
127                }
128                return a;
129            }            
130        }
131    }