beegfs/meta/source/storage/MetaFileHandle.h
2025-08-10 01:34:16 +02:00

66 lines
1.6 KiB
C++

#pragma once
#include <storage/DirInode.h>
#include <storage/FileInode.h>
class MetaStore;
// this class is used to transport referenced file inode out of and back into the meta store.
// since file inodes must keep their parent directory alive, a handle to an inode also requires a
// handle to a directory to function properly.
class MetaFileHandle
{
friend class MetaStore;
public:
typedef void (MetaFileHandle::*bool_type)();
MetaFileHandle():
inode(nullptr), parent(nullptr)
{}
MetaFileHandle(FileInode* inode, DirInode* parent):
inode(inode), parent(parent)
{}
MetaFileHandle(const MetaFileHandle&) = delete;
MetaFileHandle& operator=(const MetaFileHandle&) = delete;
MetaFileHandle(MetaFileHandle&& other):
inode(nullptr), parent(nullptr)
{
swap(other);
}
MetaFileHandle& operator=(MetaFileHandle&& other)
{
MetaFileHandle(std::move(other)).swap(*this);
return *this;
}
FileInode* operator->() const { return inode; }
FileInode& operator*() const { return *inode; }
FileInode* get() const { return inode; }
operator bool_type() const { return inode ? &MetaFileHandle::bool_value : 0; }
void swap(MetaFileHandle& other)
{
std::swap(inode, other.inode);
std::swap(parent, other.parent);
}
friend void swap(MetaFileHandle& a, MetaFileHandle& b)
{
a.swap(b);
}
private:
FileInode* inode;
DirInode* parent;
void bool_value() {}
};