/* * Copyright (c) 2016-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * */ #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 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}; } 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&; } }