/* * Licensed to Elasticsearch under one or more contributor * license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright * ownership. Elasticsearch licenses this file to you under * the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.elasticsearch.common.bytes; import org.apache.lucene.util.BytesRef; public final class BytesArray extends BytesReference { public static final BytesArray EMPTY = new BytesArray(BytesRef.EMPTY_BYTES, 0, 0); private final byte[] bytes; private final int offset; private final int length; public BytesArray(String bytes) { this(new BytesRef(bytes)); } public BytesArray(BytesRef bytesRef) { this(bytesRef, false); } public BytesArray(BytesRef bytesRef, boolean deepCopy) { if (deepCopy) { bytesRef = BytesRef.deepCopyOf(bytesRef); } bytes = bytesRef.bytes; offset = bytesRef.offset; length = bytesRef.length; } public BytesArray(byte[] bytes) { this(bytes, 0, bytes.length); } public BytesArray(byte[] bytes, int offset, int length) { this.bytes = bytes; this.offset = offset; this.length = length; } @Override public byte get(int index) { return bytes[offset + index]; } @Override public int length() { return length; } @Override public BytesReference slice(int from, int length) { if (from < 0 || (from + length) > this.length) { throw new IllegalArgumentException("can't slice a buffer with length [" + this.length + "], with slice parameters from [" + from + "], length [" + length + "]"); } return new BytesArray(bytes, offset + from, length); } public byte[] array() { return bytes; } public int offset() { return offset; } @Override public BytesRef toBytesRef() { return new BytesRef(bytes, offset, length); } @Override public long ramBytesUsed() { return bytes.length; } }