// Copyright 2018 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 BLOBFS_NODE_FINDER_H_
#define BLOBFS_NODE_FINDER_H_

#include <blobfs/format.h>

namespace blobfs {

class NodeFinder;

// NodeFinder subclasses return pointers to Inodes. When they go out of scope, DropInodePtr is
// called. This can be used to maintain any locks that might need to be in place.
struct InodePtrDeleter {
  InodePtrDeleter() = default;
  explicit InodePtrDeleter(NodeFinder* finder) : finder_(finder) {}
  void operator()(Inode* inode);
  NodeFinder* finder_ = nullptr;
};

// Don't assume that memory is freed when the pointer goes out of scope. Subclasses are free to
// implement a cache of nodes and hand out pointers to the cache instead.
using InodePtr = std::unique_ptr<Inode, InodePtrDeleter>;

// Interface to look up nodes.
class NodeFinder {
 public:
  virtual ~NodeFinder() = default;

  // Returns a pointer to the requested node.
  //
  // TODO(smklein): Return a zx_status_t to allow for invalid |ino| values.
  virtual InodePtr GetNode(uint32_t node_index) = 0;

  // Called when an InodePtr goes out of scope.
  virtual void DropInodePtr() {}
};

inline void InodePtrDeleter::operator ()(Inode* inode) {
  if (finder_) {
    finder_->DropInodePtr();
  }
}

}  // namespace blobfs

#endif  // BLOBFS_NODE_FINDER_H_
