// 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_COMMON_PLATFORM_API_QUICHE_MEM_SLICE_H_
#define QUICHE_COMMON_PLATFORM_API_QUICHE_MEM_SLICE_H_

#include <cstddef>
#include <memory>

#include "absl/strings/string_view.h"
#include "quiche/common/platform/api/quiche_export.h"
#include "quiche/common/quiche_buffer_allocator.h"
#include "quiche/common/quiche_callbacks.h"

namespace quiche {

// QuicheMemSlice is a memory buffer with a type-erased deleter callback.
class QUICHE_EXPORT QuicheMemSlice {
 public:
  using ReleaseCallback = SingleUseCallback<void(absl::string_view)>;

  // Creates a QuicheMemSlice by allocating memory on heap and copying the
  // specified bytes.
  static QuicheMemSlice Copy(absl::string_view data);

  // Constructs a empty QuicheMemSlice with no underlying data.
  QuicheMemSlice() = default;

  // Constructs a QuicheMemSlice that takes ownership of |buffer|.  The length
  // of the |buffer| must not be zero.  To construct an empty QuicheMemSlice,
  // use the zero-argument constructor instead.
  explicit QuicheMemSlice(QuicheBuffer buffer);

  // Constructs a QuicheMemSlice that takes ownership of |buffer| allocated on
  // heap.  |length| must not be zero.
  QuicheMemSlice(std::unique_ptr<char[]> buffer, size_t length);

  // Constructs a QuicheMemSlice with a custom deleter callback.
  QuicheMemSlice(const char* buffer, size_t length,
                 ReleaseCallback done_callback);

  QuicheMemSlice(const QuicheMemSlice& other) = delete;
  QuicheMemSlice& operator=(const QuicheMemSlice& other) = delete;

  // Move constructors. |other| will not hold a reference to the data buffer
  // after this call completes.
  QuicheMemSlice(QuicheMemSlice&& other);
  QuicheMemSlice& operator=(QuicheMemSlice&& other);

  ~QuicheMemSlice();

  // Release the underlying reference. Further access the memory will result in
  // undefined behavior.
  void Reset();

  // Returns a const char pointer to underlying data buffer.
  const char* data() const { return data_; }
  // Returns the length of underlying data buffer.
  size_t length() const { return size_; }
  // Returns the representation of the underlying data as a string view.
  absl::string_view AsStringView() const {
    return absl::string_view(data_, size_);
  }

  bool empty() const { return size_ == 0; }

 private:
  const char* data_ = nullptr;
  size_t size_ = 0;
  ReleaseCallback done_callback_ = nullptr;
};

}  // namespace quiche

#endif  // QUICHE_COMMON_PLATFORM_API_QUICHE_MEM_SLICE_H_
