// Copyright 2020 The Fuchsia 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 SRC_STORAGE_MINFS_RESIZEABLE_VMO_BUFFER_H_
#define SRC_STORAGE_MINFS_RESIZEABLE_VMO_BUFFER_H_

#include <lib/fzl/resizeable-vmo-mapper.h>
#include <zircon/compiler.h>

#include <storage/buffer/block_buffer.h>
#include <storage/buffer/vmoid_registry.h>

namespace minfs {

// A resizeable VMO buffer. The buffer isn't usable until Attach is called.
class ResizeableVmoBuffer : public storage::BlockBuffer {
 public:
  using Handle = vmoid_t;

  ResizeableVmoBuffer(uint32_t block_size) : block_size_(block_size) {}

  // BlockBuffer interface:
  size_t capacity() const override { return vmo_.size() / block_size_; }
  uint32_t BlockSize() const override { return block_size_; }
  vmoid_t vmoid() const override { return vmoid_.get(); }
  zx_handle_t Vmo() const override { return vmo_.vmo().get(); }
  void* Data(size_t index) override {
    return reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(vmo_.start()) + index * block_size_);
  }
  const void* Data(size_t index) const override {
    return reinterpret_cast<const void*>(reinterpret_cast<uintptr_t>(vmo_.start()) +
                                         index * block_size_);
  }

  const zx::vmo& vmo() { return vmo_.vmo(); }
  zx_status_t Grow(size_t block_count) { return vmo_.Grow(block_count * block_size_); }
  zx_status_t Shrink(size_t block_count) { return vmo_.Shrink(block_count * block_size_); }

  // Avoid using this method unless *absolutely* necessary. Eventually, other interfaces that take
  // different handle types should go away and this should no longer be required.
  Handle GetHandle() { return vmoid(); }

  [[nodiscard]] zx_status_t Attach(const char* name, storage::VmoidRegistry* device);
  zx_status_t Detach(storage::VmoidRegistry* device);

  void Zero(size_t index, size_t count) override;

 private:
  ResizeableVmoBuffer();

  uint32_t block_size_;
  fzl::ResizeableVmoMapper vmo_;
  storage::Vmoid vmoid_;
};

}  // namespace minfs

#endif  // SRC_STORAGE_MINFS_RESIZEABLE_VMO_BUFFER_H_
