/*
 * 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.
 */

#ifndef OUTPUTSTREAM_H_INCLUDED
#define OUTPUTSTREAM_H_INCLUDED

#include "InputStream.h"
namespace rocketmq {
//==============================================================================
/**
    The base class for streams that write data to some kind of destination.

    Input and output streams are used throughout the library - subclasses can
   override
    some or all of the virtual functions to implement their behaviour.

    @see InputStream, MemoryOutputStream, FileOutputStream
*/
class ROCKETMQCLIENT_API OutputStream {
 protected:
  //==============================================================================
  OutputStream();

 public:
  /** Destructor.

      Some subclasses might want to do things like call flush() during their
      destructors.
  */
  virtual ~OutputStream();

  //==============================================================================
  /** If the stream is using a buffer, this will ensure it gets written
      out to the destination. */
  virtual void flush() = 0;

  /** Tries to move the stream's output position.

      Not all streams will be able to seek to a new position - this will return
      false if it fails to work.

      @see getPosition
  */
  virtual bool setPosition(int64 newPosition) = 0;

  /** Returns the stream's current position.

      @see setPosition
  */
  virtual int64 getPosition() = 0;

  //==============================================================================
  /** Writes a block of data to the stream.

      When creating a subclass of OutputStream, this is the only write method
      that needs to be overloaded - the base class has methods for writing other
      types of data which use this to do the work.

      @param dataToWrite      the target buffer to receive the data. This must
     not be null.
      @param numberOfBytes    the number of bytes to write.
      @returns false if the write operation fails for some reason
  */
  virtual bool write(const void* dataToWrite, size_t numberOfBytes) = 0;

  //==============================================================================
  /** Writes a single byte to the stream.
      @returns false if the write operation fails for some reason
      @see InputStream::readByte
  */
  virtual bool writeByte(char byte);

  /** Writes a boolean to the stream as a single byte.
      This is encoded as a binary byte (not as text) with a value of 1 or 0.
      @returns false if the write operation fails for some reason
      @see InputStream::readBool
  */
  virtual bool writeBool(bool boolValue);

  /** Writes a 16-bit integer to the stream in a big-endian byte order.
      This will write two bytes to the stream: (value >> 8), then (value &
     0xff).
      @returns false if the write operation fails for some reason
      @see InputStream::readShortBigEndian
  */
  virtual bool writeShortBigEndian(short value);

  /** Writes a 32-bit integer to the stream in a big-endian byte order.
      @returns false if the write operation fails for some reason
      @see InputStream::readIntBigEndian
  */
  virtual bool writeIntBigEndian(int value);

  /** Writes a 64-bit integer to the stream in a big-endian byte order.
      @returns false if the write operation fails for some reason
      @see InputStream::readInt64BigEndian
  */
  virtual bool writeInt64BigEndian(int64 value);

  /** Writes a 32-bit floating point value to the stream in a binary format.
      The binary 32-bit encoding of the float is written as a big-endian int.
      @returns false if the write operation fails for some reason
      @see InputStream::readFloatBigEndian
  */
  virtual bool writeFloatBigEndian(float value);

  /** Writes a 64-bit floating point value to the stream in a binary format.
      The eight raw bytes of the double value are written out as a big-endian
     64-bit int.
      @see InputStream::readDoubleBigEndian
      @returns false if the write operation fails for some reason
  */
  virtual bool writeDoubleBigEndian(double value);

  /** Writes a byte to the output stream a given number of times.
      @returns false if the write operation fails for some reason
  */
  virtual bool writeRepeatedByte(uint8 byte, size_t numTimesToRepeat);

  /** Reads data from an input stream and writes it to this stream.

      @param source               the stream to read from
      @param maxNumBytesToWrite   the number of bytes to read from the stream
     (if this is
                                  less than zero, it will keep reading until the
     input
                                  is exhausted)
      @returns the number of bytes written
  */
  virtual int64 writeFromInputStream(InputStream& source, int64 maxNumBytesToWrite);
};
}  // namespace rocketmq

#endif  // OUTPUTSTREAM_H_INCLUDED
