/**
 * 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.twitter.distributedlog.io;

import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;

import java.util.Arrays;
import org.apache.bookkeeper.stats.OpStatsLogger;

/**
 * An identity compression codec implementation for {@link CompressionCodec}.
 */
public class IdentityCompressionCodec implements CompressionCodec {
    @Override
    public byte[] compress(byte[] data, int offset, int length, OpStatsLogger compressionStat) {
        checkNotNull(data);
        checkArgument(length >= 0);
        return Arrays.copyOfRange(data, offset, offset + length);
    }

    @Override
    public byte[] decompress(byte[] data, int offset, int length, OpStatsLogger decompressionStat) {
        checkNotNull(data);
        return Arrays.copyOfRange(data, offset, offset + length);
    }

    @Override
    // Decompressed size is the same as the length of the data because this is an
    // Identity compressor
    public byte[] decompress(byte[] data, int offset, int length,
                             int decompressedSize, OpStatsLogger decompressionStat) {
        return decompress(data, offset, length, decompressionStat);
    }
}
