001    /*
002     *  Copyright 2001-2010 Stephen Colebourne
003     *
004     *  Licensed under the Apache License, Version 2.0 (the "License");
005     *  you may not use this file except in compliance with the License.
006     *  You may obtain a copy of the License at
007     *
008     *      http://www.apache.org/licenses/LICENSE-2.0
009     *
010     *  Unless required by applicable law or agreed to in writing, software
011     *  distributed under the License is distributed on an "AS IS" BASIS,
012     *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     *  See the License for the specific language governing permissions and
014     *  limitations under the License.
015     */
016    package org.joda.primitives.list.impl;
017    
018    import java.util.Collection;
019    
020    import org.joda.primitives.DoubleUtils;
021    
022    /**
023     * Immutable array-based implementation of <code>DoubleList</code> for
024     * primitive <code>int</code> elements.
025     * <p>
026     * This class implements {@link java.util.List List} allowing
027     * seamless integration with other APIs.
028     * <p>
029     * Add, Remove, Set and Clear are not supported as this class is immutable.
030     *
031     * @author Stephen Colebourne
032     * @version CODE GENERATED
033     * @since 1.0
034     */
035    public final class ImmutableArrayDoubleList extends AbstractDoubleList {
036        // This file is CODE GENERATED. Do not change manually.
037    
038        /** The empty singleton. */
039        private static final ImmutableArrayDoubleList EMPTY = new ImmutableArrayDoubleList(DoubleUtils.EMPTY_DOUBLE_ARRAY);
040    
041        /** The array of elements. */
042        private double[] data;
043    
044        /**
045         * Gets a list that is empty.
046         */
047        public static ImmutableArrayDoubleList empty() {
048            return EMPTY;
049        }
050    
051        /**
052         * Creates a list copying the specified array.
053         * 
054         * @param values  an array of values to copy, null treated as zero size array
055         * @return the created list, not null
056         */
057        public static ImmutableArrayDoubleList copyOf(double[] values) {
058            if (values == null) {
059                return EMPTY;
060            } else {
061                return new ImmutableArrayDoubleList(values.clone());
062            }
063        }
064    
065        /**
066         * Creates a list copying the values from the specified collection.
067         * <p>
068         * If the collection is an instance of this class, then it is simply returned.
069         * 
070         * @param coll  a collection of values to copy, null treated as zero size collection
071         * @return the created list, not null
072         */
073        public static ImmutableArrayDoubleList copyOf(Collection<Double> coll) {
074            if (coll == null) {
075                return EMPTY;
076            } else if (coll instanceof ImmutableArrayDoubleList) {
077                return (ImmutableArrayDoubleList) coll;
078            } else {
079                return new ImmutableArrayDoubleList(DoubleUtils.toPrimitiveArray(coll));
080            }
081        }
082    
083        /**
084         * Constructor that copies the specified values.
085         * 
086         * @param values  the array to assign
087         */
088        private ImmutableArrayDoubleList(double[] values) {
089            super();
090            data = values;
091        }
092    
093        // Implementation
094        //-----------------------------------------------------------------------
095        /**
096         * Gets the current size of the collection.
097         * 
098         * @return the current size
099         */
100        public int size() {
101            return data.length;
102        }
103    
104        /**
105         * Gets the primitive value at the specified index.
106         *
107         * @param index  the index to get from
108         * @return value at the index
109         * @throws IndexOutOfBoundsException if the index is invalid
110         */
111        public double getDouble(int index) {
112            checkIndexExists(index);
113            return data[index];
114        }
115    
116        // Overrides
117        //-----------------------------------------------------------------------
118        /**
119         * Checks whether this collection contains a specified primitive value.
120         * <p>
121         * This implementation accesses the internal storage array directly.
122         *
123         * @param value  the value to search for
124         * @return <code>true</code> if the value is found
125         */
126        public boolean contains(double value) {
127            for (int i = 0; i < data.length; i++) {
128                if (data[i] == value) {
129                    return true;
130                }
131            }
132            return false;
133        }
134    
135        //-----------------------------------------------------------------------
136        /**
137         * Clone implementation that returns {@code this}.
138         * 
139         * @return {@code this}
140         */
141        public Object clone() {
142            return this;
143        }
144    
145        /**
146         * Copies data from this collection into the specified array.
147         * This method is pre-validated.
148         * 
149         * @param fromIndex  the index to start from
150         * @param dest  the destination array
151         * @param destIndex  the destination start index
152         * @param size  the number of items to copy
153         */
154        protected void arrayCopy(int fromIndex, double[] dest, int destIndex, int size) {
155            System.arraycopy(data, fromIndex, dest, destIndex, size);
156        }
157    
158    }
159