text: // Copyright 2017 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.
  
  #ifndef QUICHE_QUIC_PLATFORM_API_QUIC_MEM_SLICE_SPAN_H_
  #define QUICHE_QUIC_PLATFORM_API_QUIC_MEM_SLICE_SPAN_H_
  
  #include "net/third_party/quiche/src/quic/platform/api/quic_export.h"
  #include "net/quic/platform/impl/quic_mem_slice_span_impl.h"
  
  namespace quic {
  
  // QuicMemSliceSpan is effectively wrapper around an array of data structures
  // used as QuicMemSlice. So it could implemented with:
  // QuicMemSlice* slices_;
  // size_t num_slices_;
  // But for efficiency reasons, the actual implementation is an array of
  // platform-specific objects. This could avoid the translation from
  // platform-specific object to QuicMemSlice.
  // QuicMemSliceSpan does not own the underling data buffers.
  class QUIC_EXPORT_PRIVATE QuicMemSliceSpan {
   public:
    explicit QuicMemSliceSpan(QuicMemSliceSpanImpl impl) : impl_(impl) {}
  
    QuicMemSliceSpan(const QuicMemSliceSpan& other) = default;
    QuicMemSliceSpan& operator=(const QuicMemSliceSpan& other) = default;
    QuicMemSliceSpan(QuicMemSliceSpan&& other) = default;
    QuicMemSliceSpan& operator=(QuicMemSliceSpan&& other) = default;
  
    ~QuicMemSliceSpan() = default;
  
    // Save data buffers to |send_buffer| and returns the amount of saved data.
    // |send_buffer| will hold a reference to all data buffer.
    QuicByteCount SaveMemSlicesInSendBuffer(QuicStreamSendBuffer* send_buffer) {
      return impl_.SaveMemSlicesInSendBuffer(send_buffer);
    }
  
    // Save data buffers as message data in |message_frame|. |message_frame| will
    // hold a reference to all data buffers.
    void SaveMemSlicesAsMessageData(QuicMessageFrame* message_frame) {
      impl_.SaveMemSlicesAsMessageData(message_frame);
    }
  
    // Return data of the span at |index| by the form of a QuicStringPiece.
    QuicStringPiece GetData(int index) { return impl_.GetData(index); }
  
    // Return the total length of the data inside the span.
    QuicByteCount total_length() { return impl_.total_length(); }
  
    // Return total number of slices in the span.
    size_t NumSlices() { return impl_.NumSlices(); }
  
    bool empty() const { return impl_.empty(); }
  
   private:
    QuicMemSliceSpanImpl impl_;
  };
  
  }  // namespace quic
  
  #endif  // QUICHE_QUIC_PLATFORM_API_QUIC_MEM_SLICE_SPAN_H_
  