/*
 * Copyright 2009-2013 by The Regents of the University of California
 * Licensed 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 from
 * 
 *     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.
 */
/**
 * 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 edu.uci.ics.hivesterix.serde.lazy;

import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;

import edu.uci.ics.hyracks.dataflow.common.data.accessors.IFrameTupleReference;

/**
 * LazyObject stores an object in a range of bytes in a byte[].
 * A LazyObject can represent any primitive object or hierarchical object like
 * array, map or struct.
 */
public abstract class LazyObject<OI extends ObjectInspector> {

    OI oi;

    /**
     * Create a LazyObject.
     * 
     * @param oi
     *            Derived classes can access meta information about this Lazy
     *            Object (e.g, separator, nullSequence, escaper) from it.
     */
    protected LazyObject(OI oi) {
        this.oi = oi;
    }

    /**
     * Set the data for this LazyObject. We take ByteArrayRef instead of byte[]
     * so that we will be able to drop the reference to byte[] by a single
     * assignment. The ByteArrayRef object can be reused across multiple rows.
     * 
     * @param bytes
     *            The wrapper of the byte[].
     * @param start
     *            The start position inside the bytes.
     * @param length
     *            The length of the data, starting from "start"
     * @see ByteArrayRef
     */
    public abstract void init(byte[] bytes, int start, int length);

    public abstract void init(IFrameTupleReference tuple);

    /**
     * If the LazyObject is a primitive Object, then deserialize it and return
     * the actual primitive Object. Otherwise (array, map, struct), return this.
     */
    public abstract Object getObject();

    @Override
    public abstract int hashCode();

    protected OI getInspector() {
        return oi;
    }

    protected void setInspector(OI oi) {
        this.oi = oi;
    }
}
