/*
 * 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 MEMORYOUTPUTSTREAM_H_INCLUDED
#define MEMORYOUTPUTSTREAM_H_INCLUDED

#include "OutputStream.h"

namespace rocketmq {
//==============================================================================
/**
    Writes data to an internal memory buffer, which grows as required.

    The data that was written into the stream can then be accessed later as
    a contiguous block of memory.
*/
class ROCKETMQCLIENT_API MemoryOutputStream : public OutputStream {
 public:
  //==============================================================================
  /** Creates an empty memory stream, ready to be written into.
      @param initialSize  the intial amount of capacity to allocate for writing
     into
  */
  MemoryOutputStream(size_t initialSize = 256);

  /** Creates a memory stream for writing into into a pre-existing MemoryBlock
     object.

      Note that the destination block will always be larger than the amount of
     data
      that has been written to the stream, because the MemoryOutputStream keeps
     some
      spare capactity at its end. To trim the block's size down to fit the
     actual
      data, call flush(), or delete the MemoryOutputStream.

      @param memoryBlockToWriteTo             the block into which new data will
     be written.
      @param appendToExistingBlockContent     if this is true, the contents of
     the block will be
                                              kept, and new data will be
     appended to it. If false,
                                              the block will be cleared before
     use
  */
  MemoryOutputStream(MemoryBlock& memoryBlockToWriteTo, bool appendToExistingBlockContent);

  /** Creates a MemoryOutputStream that will write into a user-supplied,
     fixed-size
      block of memory.
      When using this mode, the stream will write directly into this memory area
     until
      it's full, at which point write operations will fail.
  */
  MemoryOutputStream(void* destBuffer, size_t destBufferSize);

  /** Destructor.
      This will free any data that was written to it.
  */
  ~MemoryOutputStream();

  //==============================================================================
  /** Returns a pointer to the data that has been written to the stream.
      @see getDataSize
  */
  const void* getData() const;

  /** Returns the number of bytes of data that have been written to the stream.
      @see getData
  */
  size_t getDataSize() const { return size; }

  /** Resets the stream, clearing any data that has been written to it so far.
   */
  void reset();

  /** Increases the internal storage capacity to be able to contain at least the
     specified
      amount of data without needing to be resized.
  */
  void preallocate(size_t bytesToPreallocate);

  /** Returns a copy of the stream's data as a memory block. */
  MemoryBlock getMemoryBlock() const;

  //==============================================================================
  /** If the stream is writing to a user-supplied MemoryBlock, this will trim
     any excess
      capacity off the block, so that its length matches the amount of actual
     data that
      has been written so far.
  */
  void flush();

  bool write(const void*, size_t);
  int64 getPosition() { return (int64)position; }
  bool setPosition(int64);
  int64 writeFromInputStream(InputStream&, int64 maxNumBytesToWrite);
  bool writeRepeatedByte(uint8 byte, size_t numTimesToRepeat);

 private:
  //==============================================================================
  MemoryBlock* const blockToUse;
  MemoryBlock internalBlock;
  void* externalData;
  size_t position, size, availableSize;

  void trimExternalBlockSize();
  char* prepareToWrite(size_t);
};

/** Copies all the data that has been written to a MemoryOutputStream into
 * another stream. */
OutputStream& operator<<(OutputStream& stream, const MemoryOutputStream& streamToRead);
}  // namespace rocketmq
#endif  // MEMORYOUTPUTSTREAM_H_INCLUDED
