summaryrefslogtreecommitdiff
path: root/base/src/main/java/bjc/utils/esodata/DefaultList.java
blob: 4d3d1dcdd8a82687fda7421ba5e0cbc9c0e6ac3d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package bjc.utils.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 <ValueType>
 *                The type of the values contained in the list.
 */
public class DefaultList<ValueType> extends AbstractList<ValueType> {
	/*
	 * @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<ValueType> 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<ValueType> 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<ValueType> 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;

		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);
	}
}