// Copyright (c) 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "quic/core/frames/quic_stream_frame.h"

#include "absl/strings/string_view.h"
#include "quic/platform/api/quic_logging.h"

namespace quic {

QuicStreamFrame::QuicStreamFrame() : QuicInlinedFrame(STREAM_FRAME) {}

QuicStreamFrame::QuicStreamFrame(QuicStreamId stream_id,
                                 bool fin,
                                 QuicStreamOffset offset,
                                 absl::string_view data)
    : QuicStreamFrame(stream_id, fin, offset, data.data(), data.length()) {}

QuicStreamFrame::QuicStreamFrame(QuicStreamId stream_id,
                                 bool fin,
                                 QuicStreamOffset offset,
                                 QuicPacketLength data_length)
    : QuicStreamFrame(stream_id, fin, offset, nullptr, data_length) {}

QuicStreamFrame::QuicStreamFrame(QuicStreamId stream_id,
                                 bool fin,
                                 QuicStreamOffset offset,
                                 const char* data_buffer,
                                 QuicPacketLength data_length)
    : QuicInlinedFrame(STREAM_FRAME),
      fin(fin),
      data_length(data_length),
      stream_id(stream_id),
      data_buffer(data_buffer),
      offset(offset) {}

std::ostream& operator<<(std::ostream& os,
                         const QuicStreamFrame& stream_frame) {
  os << "{ stream_id: " << stream_frame.stream_id
     << ", fin: " << stream_frame.fin << ", offset: " << stream_frame.offset
     << ", length: " << stream_frame.data_length << " }\n";
  return os;
}

bool QuicStreamFrame::operator==(const QuicStreamFrame& rhs) const {
  return fin == rhs.fin && data_length == rhs.data_length &&
         stream_id == rhs.stream_id && data_buffer == rhs.data_buffer &&
         offset == rhs.offset;
}

bool QuicStreamFrame::operator!=(const QuicStreamFrame& rhs) const {
  return !(*this == rhs);
}

}  // namespace quic
