/* * Copyright (c) Facebook, Inc. and its affiliates. * * This software may be used and distributed according to the terms of the * GNU General Public License version 2. */ #include "eden/fs/inodes/InodePtr.h" #include "eden/fs/inodes/InodePtr-defs.h" #include #include "eden/fs/inodes/FileInode.h" #include "eden/fs/inodes/InodeBase.h" #include "eden/fs/inodes/InodeError.h" #include "eden/fs/inodes/TreeInode.h" namespace facebook { namespace eden { template SubclassRawPtrType InodePtr::asSubclass() const { if (this->value_ == nullptr) { return nullptr; } auto* subclassPtr = dynamic_cast(this->value_); if (subclassPtr == nullptr) { throw InodeError( std::remove_pointer::type::WRONG_TYPE_ERRNO, *this); } return subclassPtr; } template SubclassPtrType InodePtr::asSubclassPtr() const { if (this->value_ == nullptr) { return SubclassPtrType{}; } auto* subclassPtr = dynamic_cast(this->value_); if (subclassPtr == nullptr) { throw InodeError(SubclassPtrType::InodeType::WRONG_TYPE_ERRNO, *this); } return SubclassPtrType{subclassPtr, SubclassPtrType::NORMAL_INCREMENT}; } template SubclassPtrType InodePtr::asSubclassPtrOrNull() const& { return SubclassPtrType{ dynamic_cast(this->value_), SubclassPtrType::NORMAL_INCREMENT}; } template SubclassPtrType InodePtr::extractSubclassPtr() { if (this->value_ == nullptr) { return SubclassPtrType{}; } auto* subclassPtr = dynamic_cast(this->value_); if (subclassPtr == nullptr) { throw InodeError(SubclassPtrType::InodeType::WRONG_TYPE_ERRNO, *this); } this->value_ = nullptr; return SubclassPtrType{subclassPtr, SubclassPtrType::NO_INCREMENT}; } template FileInodePtr InodePtr::extractSubclassPtr(); template TreeInodePtr InodePtr::extractSubclassPtr(); template SubclassPtrType InodePtr::extractSubclassPtrOrNull() { if (this->value_ == nullptr) { return SubclassPtrType{}; } auto* subclassPtr = dynamic_cast(this->value_); if (subclassPtr == nullptr) { return SubclassPtrType{}; } this->value_ = nullptr; return SubclassPtrType{subclassPtr, SubclassPtrType::NO_INCREMENT}; } template FileInodePtr InodePtr::extractSubclassPtrOrNull(); template TreeInodePtr InodePtr::extractSubclassPtrOrNull(); FileInode* InodePtr::asFile() const { return asSubclass(); } FileInodePtr InodePtr::asFilePtr() const& { return asSubclassPtr(); } FileInodePtr InodePtr::asFilePtr() && { return extractSubclassPtr(); } FileInode* InodePtr::asFileOrNull() const { return dynamic_cast(this->value_); } FileInodePtr InodePtr::asFilePtrOrNull() const& { return FileInodePtr{ dynamic_cast(this->value_), FileInodePtr::NORMAL_INCREMENT}; } FileInodePtr InodePtr::asFilePtrOrNull() && { return extractSubclassPtrOrNull(); } TreeInode* InodePtr::asTree() const { return asSubclass(); } TreeInodePtr InodePtr::asTreePtr() const& { return asSubclassPtr(); } TreeInodePtr InodePtr::asTreePtr() && { return extractSubclassPtr(); } TreeInode* InodePtr::asTreeOrNull() const { return dynamic_cast(this->value_); } TreeInodePtr InodePtr::asTreePtrOrNull() const& { return TreeInodePtr{ dynamic_cast(this->value_), TreeInodePtr::NORMAL_INCREMENT}; } TreeInodePtr InodePtr::asTreePtrOrNull() && { return extractSubclassPtrOrNull(); } // Explicitly instantiate InodePtrImpl for all inode class types template class InodePtrImpl; template class InodePtrImpl; template FileInodePtr InodePtr::asSubclassPtrOrNull() const&; template TreeInodePtr InodePtr::asSubclassPtrOrNull() const&; } // namespace eden } // namespace facebook