/*=============================================================================#
# Copyright (c) 2009-2016 Stephan Wahlbrink (WalWare.de) and others.
# All rights reserved. This program and the accompanying materials
# are made available under the terms of either (per the licensee's choosing)
# - the Eclipse Public License v1.0
# which accompanies this distribution, and is available at
# http://www.eclipse.org/legal/epl-v10.html, or
# - the GNU Lesser General Public License v2.1 or newer
# which accompanies this distribution, and is available at
# http://www.gnu.org/licenses/lgpl.html
#
# Contributors:
# Stephan Wahlbrink - initial API and implementation
#=============================================================================*/
package de.walware.rj.data.defaultImpl;
import java.io.IOException;
import de.walware.rj.data.RJIO;
public class RUniqueCharacterDataImpl extends RCharacterDataImpl {
public RUniqueCharacterDataImpl() {
super();
}
public RUniqueCharacterDataImpl(final String[] initialValues) {
super(initialValues, initialValues.length);
}
RUniqueCharacterDataImpl(final RCharacterDataImpl source, final boolean reuse) {
super(source, reuse);
}
public RUniqueCharacterDataImpl(final RJIO io, final int length) throws IOException {
super(io, length);
}
@Override
public void setChar(final int idx, final String value) {
if (indexOf(value) >= 0) {
if (indexOf(value) == idx) {
return;
}
throw new IllegalArgumentException();
}
super.setChar(idx, value);
}
@Override
public void setChar(final long idx, final String value) {
if (idx < 0 || idx >= getLength()) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
setChar((int) idx, value);
}
@Override
public void insertChar(final int idx, final String value) {
if (indexOf(value) >= 0) {
throw new IllegalArgumentException();
}
super.insertChar(idx, value);
}
@Override
public void setNA(final int idx) {
}
@Override
public void setNA(final long idx) {
}
@Override
public void insertNA(final int idx) {
}
@Override
public void insertNA(final int[] idxs) {
}
protected void insertAuto(final int idx) {
insertChar(idx, createAuto(idx));
}
protected String createAuto(final int idx) {
final String nr = Integer.toString(idx+1);
if (indexOf(nr) < 0) {
return nr;
}
for (int i = 1; ; i++) {
final String sub = nr+'.'+Integer.toString(i);
if (indexOf(sub) < 0) {
return sub;
}
}
}
}