/*=============================================================================# # 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 de.walware.rj.data.RCharacterStore; import de.walware.rj.data.RObject; import de.walware.rj.data.RStore; public abstract class AbstractCharacterData extends AbstractRData<String> implements RCharacterStore { protected static final boolean toLogi(final String character) { switch (character.length()) { case 1: switch (character.charAt(0)) { case 'F': return false; case 'T': return true; default: break; } break; case 4: if ("true".regionMatches(0, character, 0, 4)) { return true; } break; case 5: if ("false".regionMatches(0, character, 0, 5)) { return false; } break; default: break; } throw new NumberFormatException(character); } @Override public final byte getStoreType() { return RStore.CHARACTER; } @Override public final String getBaseVectorRClassName() { return RObject.CLASSNAME_CHARACTER; } @Override public void setLogi(final int idx, final boolean logi) { setChar(idx, AbstractLogicalData.toChar(logi)); } @Override public void setLogi(final long idx, final boolean logi) { setChar(idx, AbstractLogicalData.toChar(logi)); } @Override public boolean getLogi(final int idx) { return toLogi(getChar(idx)); } @Override public boolean getLogi(final long idx) { return toLogi(getChar(idx)); } @Override public final void setInt(final int idx, final int integer) { setChar(idx, Integer.toString(integer)); } @Override public final void setInt(final long idx, final int integer) { setChar(idx, Integer.toString(integer)); } @Override public void setCplx(final int idx, final double real, final double imaginary) { setChar(idx, AbstractComplexData.toChar(real, imaginary)); } @Override public void setCplx(final long idx, final double real, final double imaginary) { setChar(idx, AbstractComplexData.toChar(real, imaginary)); } @Override public final void setRaw(final int idx, final byte raw) { setChar(idx, AbstractRawData.toChar(raw)); } @Override public final void setRaw(final long idx, final byte raw) { setChar(idx, AbstractRawData.toChar(raw)); } @Override public long indexOf(final int integer, final long fromIdx) { return indexOf(Integer.toString(integer), fromIdx); } @Override public abstract String[] toArray(); @Override public boolean allEqual(final RStore<?> other) { final long length = getLength(); if (CHARACTER != other.getStoreType() || length != other.getLength()) { return false; } if (length < 0) { return true; } else if (length <= Integer.MAX_VALUE) { final int ilength = (int) length; for (int idx = 0; idx < ilength; idx++) { if (!(isNA(idx) ? other.isNA(idx) : getChar(idx).equals(other.getChar(idx)) )) { return false; } } } else { for (long idx = 0; idx < length; idx++) { if (!(isNA(idx) ? other.isNA(idx) : getChar(idx).equals(other.getChar(idx)) )) { return false; } } } return true; } }