001/**
002 * Copyright (c) 2011, The University of Southampton and the individual contributors.
003 * All rights reserved.
004 *
005 * Redistribution and use in source and binary forms, with or without modification,
006 * are permitted provided that the following conditions are met:
007 *
008 *   *  Redistributions of source code must retain the above copyright notice,
009 *      this list of conditions and the following disclaimer.
010 *
011 *   *  Redistributions in binary form must reproduce the above copyright notice,
012 *      this list of conditions and the following disclaimer in the documentation
013 *      and/or other materials provided with the distribution.
014 *
015 *   *  Neither the name of the University of Southampton nor the names of its
016 *      contributors may be used to endorse or promote products derived from this
017 *      software without specific prior written permission.
018 *
019 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
020 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
021 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
022 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
023 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
024 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
025 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
026 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
027 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
028 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
029 */
030package org.openimaj.data;
031
032import java.lang.reflect.Array;
033
034/**
035 * This {@link DataSource} provides an indexed view of a subset of another
036 * {@link DataSource}.
037 *
038 * @author Jonathon Hare (jsh2@ecs.soton.ac.uk)
039 *
040 * @param <DATATYPE>
041 *            the data type which can be returned
042 */
043public class IndexedViewDataSource<DATATYPE> extends AbstractDataSource<DATATYPE> {
044        DataSource<DATATYPE> innerSource;
045        int[] indexes;
046
047        /**
048         * Construct a new {@link IndexedViewDataSource} with the given inner data
049         * and indexes into the inner data.
050         *
051         * @param dataSource
052         *            the inner {@link DataSource}.
053         * @param indexes
054         *            the indexed into the inner datasource.
055         */
056        public IndexedViewDataSource(DataSource<DATATYPE> dataSource, int[] indexes) {
057                this.innerSource = dataSource;
058                this.indexes = indexes;
059        }
060
061        @SuppressWarnings("unchecked")
062        @Override
063        public void getData(int startRow, int stopRow, DATATYPE[] data) {
064                DATATYPE[] tmp;
065                if (data[0] == null) {
066                        tmp = (DATATYPE[]) Array.newInstance(getData(0).getClass(), 1);
067                } else {
068                        tmp = (DATATYPE[]) Array.newInstance(data[0].getClass(), 1);
069                }
070
071                for (int i = 0, j = startRow; j < stopRow; i++, j++) {
072                        final int row = indexes[j];
073                        tmp[0] = data[i];
074                        innerSource.getData(row, row + 1, tmp);
075                }
076        }
077
078        @Override
079        public DATATYPE getData(int row) {
080                return innerSource.getData(indexes[row]);
081        }
082
083        @Override
084        public int numDimensions() {
085                return innerSource.numDimensions();
086        }
087
088        @Override
089        public int size() {
090                return indexes.length;
091        }
092
093        @Override
094        public DATATYPE[] createTemporaryArray(int size) {
095                return innerSource.createTemporaryArray(size);
096        }
097}