/* * esodata - data structures and other things, of varying utility * Copyright 2022, Ben Culkin * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package bjc.esodata; import java.util.AbstractList; import java.util.ArrayList; import java.util.List; /** * A list that has a default value that out-of-bounds accesses return. * * @author Ben Culkin * @param * The type of the values contained in the list. */ public class DefaultList extends AbstractList { /* * @NOTE 9/17/18 * * A possible feature to add would be the ability to set a 'default index', so * that the default value is 'whatever is at that list index' * * Of course, this would cause an exception if that index was out of bounds, but * what are you going to do? */ private ValueType defVal; private List backing; /** * Create a new DefaultList. */ public DefaultList() { this(new ArrayList<>(), null); } /** * Create a new DefaultList, with a set default value. * * @param defVal * The default value for the list. */ public DefaultList(ValueType defVal) { this(new ArrayList<>(), defVal); } /** * Create a new DefaultList, with a specific backing list. * * @param backer * The backing list to use. * */ public DefaultList(List backer) { this(backer, null); } /** * Create a new DefaultList, with a set default value. * * @param backer * The backing list to use. * * @param defVal * The default value for the list. */ public DefaultList(List backer, ValueType defVal) { this.defVal = defVal; this.backing = backer; } /** * Get the default value. * * @return The default value. */ public ValueType getDefault() { return defVal; } /** * Set the default value. * * @param defVal * The default value. */ public void setDefault(ValueType defVal) { this.defVal = defVal; } @Override public ValueType get(int idx) { if (idx < 0 || idx >= backing.size()) return defVal; else return backing.get(idx); } @Override public int size() { return backing.size(); } @Override public ValueType set(int idx, ValueType val) { return backing.set(idx, val); } @Override public void add(int idx, ValueType val) { backing.add(idx, val); } @Override public ValueType remove(int idx) { return backing.remove(idx); } }