/*
 * 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 org.apache.ignite.network.internal.direct.stream;

import java.nio.ByteBuffer;
import java.util.BitSet;
import java.util.Collection;
import java.util.Map;
import java.util.UUID;
import org.apache.ignite.lang.IgniteUuid;
import org.apache.ignite.network.NetworkMessage;
import org.apache.ignite.network.serialization.MessageReader;
import org.apache.ignite.network.serialization.MessageWriter;
import org.apache.ignite.plugin.extensions.communication.MessageCollectionItemType;

/**
 * Direct marshalling I/O stream.
 */
public interface DirectByteBufferStream {
    /**
     * @param buf Buffer.
     */
    public void setBuffer(ByteBuffer buf);

    /**
     * @return Number of remaining bytes.
     */
    public int remaining();

    /**
     * @return Whether last object was fully written or read.
     */
    public boolean lastFinished();

    /**
     * @param val Value.
     */
    public void writeByte(byte val);

    /**
     * @param val Value.
     */
    public void writeShort(short val);

    /**
     * @param val Value.
     */
    public void writeInt(int val);

    /**
     * @param val Value.
     */
    public void writeLong(long val);

    /**
     * @param val Value.
     */
    public void writeFloat(float val);

    /**
     * @param val Value.
     */
    public void writeDouble(double val);

    /**
     * @param val Value.
     */
    public void writeChar(char val);

    /**
     * @param val Value.
     */
    public void writeBoolean(boolean val);

    /**
     * @param val Value.
     */
    public void writeByteArray(byte[] val);

    /**
     * @param val Value.
     * @param off Offset.
     * @param len Length.
     */
    public void writeByteArray(byte[] val, long off, int len);

    /**
     * @param val Value.
     */
    public void writeShortArray(short[] val);

    /**
     * @param val Value.
     */
    public void writeIntArray(int[] val);

    /**
     * @param val Value.
     */
    public void writeLongArray(long[] val);

    /**
     * @param val Value.
     * @param len Length.
     */
    public void writeLongArray(long[] val, int len);

    /**
     * @param val Value.
     */
    public void writeFloatArray(float[] val);

    /**
     * @param val Value.
     */
    public void writeDoubleArray(double[] val);

    /**
     * @param val Value.
     */
    public void writeCharArray(char[] val);

    /**
     * @param val Value.
     */
    public void writeBooleanArray(boolean[] val);

    /**
     * @param val Value.
     */
    public void writeString(String val);

    /**
     * @param val Value.
     */
    public void writeBitSet(BitSet val);

    /**
     * @param val Value.
     */
    public void writeUuid(UUID val);

    /**
     * @param val Value.
     */
    public void writeIgniteUuid(IgniteUuid val);

    /**
     * @param msg Message.
     * @param writer Writer.
     */
    public void writeMessage(NetworkMessage msg, MessageWriter writer);

    /**
     * @param <T> Type of the array.
     * @param arr Array.
     * @param itemType Component type.
     * @param writer Writer.
     */
    public <T> void writeObjectArray(T[] arr, MessageCollectionItemType itemType, MessageWriter writer);

    /**
     * @param <T> Type of the collection.
     * @param col Collection.
     * @param itemType Component type.
     * @param writer Writer.
     */
    public <T> void writeCollection(Collection<T> col, MessageCollectionItemType itemType, MessageWriter writer);

    /**
     * @param <K> Type of the map's keys.
     * @param <V> Type of the map's values.
     * @param map Map.
     * @param keyType Key type.
     * @param valType Value type.
     * @param writer Writer.
     */
    public <K, V> void writeMap(Map<K, V> map, MessageCollectionItemType keyType, MessageCollectionItemType valType,
        MessageWriter writer);

    /**
     * @return Value.
     */
    public byte readByte();

    /**
     * @return Value.
     */
    public short readShort();

    /**
     * @return Value.
     */
    public int readInt();

    /**
     * @return Value.
     */
    public long readLong();

    /**
     * @return Value.
     */
    public float readFloat();

    /**
     * @return Value.
     */
    public double readDouble();

    /**
     * @return Value.
     */
    public char readChar();

    /**
     * @return Value.
     */
    public boolean readBoolean();

    /**
     * @return Value.
     */
    public byte[] readByteArray();

    /**
     * @return Value.
     */
    public short[] readShortArray();

    /**
     * @return Value.
     */
    public int[] readIntArray();

    /**
     * @return Value.
     */
    public long[] readLongArray();

    /**
     * @return Value.
     */
    public float[] readFloatArray();

    /**
     * @return Value.
     */
    public double[] readDoubleArray();

    /**
     * @return Value.
     */
    public char[] readCharArray();

    /**
     * @return Value.
     */
    public boolean[] readBooleanArray();

    /**
     * @return Value.
     */
    public String readString();

    /**
     * @return Value.
     */
    public BitSet readBitSet();

    /**
     * @return Value.
     */
    public UUID readUuid();

    /**
     * @return Value.
     */
    public IgniteUuid readIgniteUuid();

    /**
     * @param <T> Type of a message.
     * @param reader Reader.
     * @return Message.
     */
    public <T extends NetworkMessage> T readMessage(MessageReader reader);

    /**
     * @param <T> Type of an array.
     * @param itemType Item type.
     * @param itemCls Item class.
     * @param reader Reader.
     * @return Array.
     */
    public <T> T[] readObjectArray(MessageCollectionItemType itemType, Class<T> itemCls, MessageReader reader);

    /**
     * @param <C> Type of a collection.
     * @param itemType Item type.
     * @param reader Reader.
     * @return Collection.
     */
    public <C extends Collection<?>> C readCollection(MessageCollectionItemType itemType, MessageReader reader);

    /**
     * @param <M> Type of a map.
     * @param keyType Key type.
     * @param valType Value type.
     * @param linked Whether linked map should be created.
     * @param reader Reader.
     * @return Map.
     */
    public <M extends Map<?, ?>> M readMap(MessageCollectionItemType keyType, MessageCollectionItemType valType,
        boolean linked, MessageReader reader);
}
