// Path: src/main/java/com/bah/lucene/blockcache_v2/CacheValue.java
// public interface CacheValue {
// 
//   /**
//    * The actual size of the the underlying resource.
//    * 
//    * @return the size.
//    */
//   int size();
// 
//   /**
//    * The length of the data in this block.
//    * 
//    * @return the length.
//    */
//   int length();
// 
//   /**
//    * Writes data out to a given position in this block.
//    * 
//    * @param position
//    *          the position.
//    * @param buf
//    *          the buffer.
//    * @param offset
//    *          the offset in the buffer.
//    * @param length
//    *          the length of bytes to write.
//    */
//   void write(int position, byte[] buf, int offset, int length);
// 
//   /**
//    * Reads data into the buffer given the position.
//    * 
//    * @param position
//    *          the position to read.
//    * @param buf
//    *          the buffer to read into.
//    * @param offset
//    *          the offset within the buffer.
//    * @param length
//    *          the length of data to read.
//    */
//   void read(int position, byte[] buf, int offset, int length);
// 
//   /**
//    * Reads a byte from the given position.
//    * 
//    * @param position
//    *          the position.
//    * @return the byte.
//    */
//   byte read(int position);
// 
//   /**
//    * Increments the reference.
//    */
//   void incRef();
// 
//   /**
//    * Decrements the reference.
//    */
//   void decRef();
// 
//   /**
//    * Gets the reference count.
//    */
//   long refCount();
// 
//   /**
//    * Releases any underlying resources.
//    */
//   void release();
// 
//   /**
//    * Reads a short from the given position.
//    * 
//    * @param position
//    *          the {@link Position} to read from.
//    * @return the short.
//    */
//   short readShort(int position);
// 
//   /**
//    * Reads a int from the given position.
//    * 
//    * @param position
//    *          the {@link Position} to read from.
//    * @return the int.
//    */
//   int readInt(int position);
// 
//   /**
//    * Reads a long from the given position.
//    * 
//    * @param position
//    *          the {@link Position} to read from.
//    * @return the long.
//    */
//   long readLong(int position);
// 
//   /**
//    * This method will trim the existing {@link CacheValue} and produce
//    * potentially a new {@link CacheValue} with the same data up to the length
//    * provided. Also if a new {@link CacheValue} is produced then this method is
//    * responsible to calling release on the old {@link CacheValue}.
//    * 
//    * @param length
//    *          the valid amount of data in the {@link CacheValue}.
//    * @return new trim {@link CacheValue} that has been trimmed if needed.
//    */
//   CacheValue trim(int length);
// 
// }


import com.bah.lucene.blockcache_v2.CacheValue;
/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF 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 com.bah.lucene.blockcache_v2.cachevalue;


@SuppressWarnings("serial")
public class ByteArrayCacheValue extends BaseCacheValue {

  private final byte[] _buffer;

  public ByteArrayCacheValue(int length) {
    super(length);
    _buffer = new byte[length];
  }

  @Override
  protected void writeInternal(int position, byte[] buf, int offset, int length) {
    System.arraycopy(buf, offset, _buffer, position, length);
  }

  @Override
  protected void readInternal(int position, byte[] buf, int offset, int length) {
    System.arraycopy(_buffer, position, buf, offset, length);
  }

  @Override
  protected byte readInternal(int position) {
    return _buffer[position];
  }

  @Override
  public void release() {
    _released = true;
  }

  @Override
  public int size() {
    return length();
  }

  @Override
// Path: src/main/java/com/bah/lucene/blockcache_v2/CacheValue.java
// public interface CacheValue {
// 
//   /**
//    * The actual size of the the underlying resource.
//    * 
//    * @return the size.
//    */
//   int size();
// 
//   /**
//    * The length of the data in this block.
//    * 
//    * @return the length.
//    */
//   int length();
// 
//   /**
//    * Writes data out to a given position in this block.
//    * 
//    * @param position
//    *          the position.
//    * @param buf
//    *          the buffer.
//    * @param offset
//    *          the offset in the buffer.
//    * @param length
//    *          the length of bytes to write.
//    */
//   void write(int position, byte[] buf, int offset, int length);
// 
//   /**
//    * Reads data into the buffer given the position.
//    * 
//    * @param position
//    *          the position to read.
//    * @param buf
//    *          the buffer to read into.
//    * @param offset
//    *          the offset within the buffer.
//    * @param length
//    *          the length of data to read.
//    */
//   void read(int position, byte[] buf, int offset, int length);
// 
//   /**
//    * Reads a byte from the given position.
//    * 
//    * @param position
//    *          the position.
//    * @return the byte.
//    */
//   byte read(int position);
// 
//   /**
//    * Increments the reference.
//    */
//   void incRef();
// 
//   /**
//    * Decrements the reference.
//    */
//   void decRef();
// 
//   /**
//    * Gets the reference count.
//    */
//   long refCount();
// 
//   /**
//    * Releases any underlying resources.
//    */
//   void release();
// 
//   /**
//    * Reads a short from the given position.
//    * 
//    * @param position
//    *          the {@link Position} to read from.
//    * @return the short.
//    */
//   short readShort(int position);
// 
//   /**
//    * Reads a int from the given position.
//    * 
//    * @param position
//    *          the {@link Position} to read from.
//    * @return the int.
//    */
//   int readInt(int position);
// 
//   /**
//    * Reads a long from the given position.
//    * 
//    * @param position
//    *          the {@link Position} to read from.
//    * @return the long.
//    */
//   long readLong(int position);
// 
//   /**
//    * This method will trim the existing {@link CacheValue} and produce
//    * potentially a new {@link CacheValue} with the same data up to the length
//    * provided. Also if a new {@link CacheValue} is produced then this method is
//    * responsible to calling release on the old {@link CacheValue}.
//    * 
//    * @param length
//    *          the valid amount of data in the {@link CacheValue}.
//    * @return new trim {@link CacheValue} that has been trimmed if needed.
//    */
//   CacheValue trim(int length);
// 
// }


// Path: src/main/java/com/bah/lucene/blockcache_v2/cachevalue/ByteArrayCacheValue.java
import com.bah.lucene.blockcache_v2.CacheValue;

/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF 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 com.bah.lucene.blockcache_v2.cachevalue;


@SuppressWarnings("serial")
public class ByteArrayCacheValue extends BaseCacheValue {

  private final byte[] _buffer;

  public ByteArrayCacheValue(int length) {
    super(length);
    _buffer = new byte[length];
  }

  @Override
  protected void writeInternal(int position, byte[] buf, int offset, int length) {
    System.arraycopy(buf, offset, _buffer, position, length);
  }

  @Override
  protected void readInternal(int position, byte[] buf, int offset, int length) {
    System.arraycopy(_buffer, position, buf, offset, length);
  }

  @Override
  protected byte readInternal(int position) {
    return _buffer[position];
  }

  @Override
  public void release() {
    _released = true;
  }

  @Override
  public int size() {
    return length();
  }

  @Override
  public CacheValue trim(int length) {