/*=============================================================================#
 # Copyright (c) 2009, 2020 Stephan Wahlbrink and others.
 # 
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
 # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
 # which is available at https://www.apache.org/licenses/LICENSE-2.0.
 # 
 # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
 # 
 # Contributors:
 #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
 #=============================================================================*/

package org.eclipse.statet.rj.data.impl;

import org.eclipse.statet.rj.data.RObject;
import org.eclipse.statet.rj.data.RRawStore;
import org.eclipse.statet.rj.data.RStore;


public abstract class AbstractRawStore extends AbstractRStore<Byte>
		implements RRawStore {
	
	
	private static final char[] HEX_CHARS= new char[] {
			'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
	};
	
	protected static final String toChar(final byte raw) {
		return new String(new char[] { HEX_CHARS[(raw >>> 4) & 0x0F], HEX_CHARS[(raw & 0x0F)] });
	}
	
	
	@Override
	public final byte getStoreType() {
		return RStore.RAW;
	}
	
	@Override
	public final String getBaseVectorRClassName() {
		return RObject.CLASSNAME_RAW;
	}
	
	
	@Override
	public final boolean isNA(final int idx) {
		return false;
	}
	
	@Override
	public final boolean isNA(final long idx) {
		return false;
	}
	
	@Override
	public final boolean isMissing(final int idx) {
		return false;
	}
	
	@Override
	public final boolean isMissing(final long idx) {
		return false;
	}
	
	@Override
	public int getInt(final int idx) {
		return (getRaw(idx) & 0xff);
	}
	
	@Override
	public int getInt(final long idx) {
		return (getRaw(idx) & 0xff);
	}
	
	@Override
	public void setInt(final long idx, final int integer) {
		setRaw(idx, AbstractIntegerStore.toRaw(integer));
	}
	
	@Override
	public void setInt(final int idx, final int integer) {
		setRaw(idx, AbstractIntegerStore.toRaw(integer));
	}
	
	@Override
	public final String getChar(final int idx) {
		return toChar(getRaw(idx));
	}
	
	@Override
	public final String getChar(final long idx) {
		return toChar(getRaw(idx));
	}
	
	
	@Override
	public long indexOfNA(final long fromIdx) {
		return -1;
	}
	
}
