2017-01-18 02:01:37 +03:00
|
|
|
/*
|
2017-01-21 09:02:33 +03:00
|
|
|
* Copyright (c) 2016-present, Facebook, Inc.
|
2017-01-18 02:01:37 +03:00
|
|
|
* 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"
|
|
|
|
|
2017-03-09 04:07:00 +03:00
|
|
|
#include <type_traits>
|
2017-01-18 02:01:37 +03:00
|
|
|
#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 <typename SubclassRawPtrType>
|
2017-04-06 23:08:15 +03:00
|
|
|
SubclassRawPtrType InodePtr::asSubclass() const {
|
2017-01-18 02:01:37 +03:00
|
|
|
if (this->value_ == nullptr) {
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
auto* subclassPtr = dynamic_cast<SubclassRawPtrType>(this->value_);
|
|
|
|
if (subclassPtr == nullptr) {
|
2017-03-09 04:07:00 +03:00
|
|
|
throw InodeError(
|
|
|
|
std::remove_pointer<SubclassRawPtrType>::type::WRONG_TYPE_ERRNO, *this);
|
2017-01-18 02:01:37 +03:00
|
|
|
}
|
|
|
|
return subclassPtr;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename SubclassPtrType>
|
2017-04-06 23:08:15 +03:00
|
|
|
SubclassPtrType InodePtr::asSubclassPtr() const {
|
2017-01-18 02:01:37 +03:00
|
|
|
if (this->value_ == nullptr) {
|
|
|
|
return SubclassPtrType{};
|
|
|
|
}
|
|
|
|
|
|
|
|
auto* subclassPtr =
|
|
|
|
dynamic_cast<typename SubclassPtrType::InodeType*>(this->value_);
|
|
|
|
if (subclassPtr == nullptr) {
|
2017-03-09 04:07:00 +03:00
|
|
|
throw InodeError(SubclassPtrType::InodeType::WRONG_TYPE_ERRNO, *this);
|
2017-01-18 02:01:37 +03:00
|
|
|
}
|
|
|
|
return SubclassPtrType{subclassPtr, SubclassPtrType::NORMAL_INCREMENT};
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename SubclassPtrType>
|
2017-04-06 23:08:15 +03:00
|
|
|
SubclassPtrType InodePtr::asSubclassPtrOrNull() const& {
|
2017-03-09 04:07:00 +03:00
|
|
|
return SubclassPtrType{
|
|
|
|
dynamic_cast<typename SubclassPtrType::InodeType*>(this->value_),
|
|
|
|
SubclassPtrType::NORMAL_INCREMENT};
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename SubclassPtrType>
|
2017-04-06 23:08:15 +03:00
|
|
|
SubclassPtrType InodePtr::extractSubclassPtr() {
|
2017-01-18 02:01:37 +03:00
|
|
|
if (this->value_ == nullptr) {
|
|
|
|
return SubclassPtrType{};
|
|
|
|
}
|
|
|
|
|
|
|
|
auto* subclassPtr =
|
|
|
|
dynamic_cast<typename SubclassPtrType::InodeType*>(this->value_);
|
|
|
|
if (subclassPtr == nullptr) {
|
2017-03-09 04:07:00 +03:00
|
|
|
throw InodeError(SubclassPtrType::InodeType::WRONG_TYPE_ERRNO, *this);
|
2017-01-18 02:01:37 +03:00
|
|
|
}
|
|
|
|
this->value_ = nullptr;
|
|
|
|
return SubclassPtrType{subclassPtr, SubclassPtrType::NO_INCREMENT};
|
|
|
|
}
|
|
|
|
|
2018-03-13 08:15:07 +03:00
|
|
|
template FileInodePtr InodePtr::extractSubclassPtr<FileInodePtr>();
|
|
|
|
template TreeInodePtr InodePtr::extractSubclassPtr<TreeInodePtr>();
|
|
|
|
|
2017-01-18 02:01:37 +03:00
|
|
|
template <typename SubclassPtrType>
|
2017-04-06 23:08:15 +03:00
|
|
|
SubclassPtrType InodePtr::extractSubclassPtrOrNull() {
|
2017-01-18 02:01:37 +03:00
|
|
|
if (this->value_ == nullptr) {
|
|
|
|
return SubclassPtrType{};
|
|
|
|
}
|
|
|
|
auto* subclassPtr =
|
|
|
|
dynamic_cast<typename SubclassPtrType::InodeType*>(this->value_);
|
|
|
|
if (subclassPtr == nullptr) {
|
|
|
|
return SubclassPtrType{};
|
|
|
|
}
|
|
|
|
this->value_ = nullptr;
|
|
|
|
return SubclassPtrType{subclassPtr, SubclassPtrType::NO_INCREMENT};
|
|
|
|
}
|
|
|
|
|
2018-03-13 08:15:07 +03:00
|
|
|
template FileInodePtr InodePtr::extractSubclassPtrOrNull<FileInodePtr>();
|
|
|
|
template TreeInodePtr InodePtr::extractSubclassPtrOrNull<TreeInodePtr>();
|
|
|
|
|
2017-04-06 23:08:15 +03:00
|
|
|
FileInode* InodePtr::asFile() const {
|
|
|
|
return asSubclass<FileInode*>();
|
2017-01-18 02:01:37 +03:00
|
|
|
}
|
|
|
|
|
2017-04-06 23:08:15 +03:00
|
|
|
FileInodePtr InodePtr::asFilePtr() const& {
|
2017-03-09 04:07:00 +03:00
|
|
|
return asSubclassPtr<FileInodePtr>();
|
2017-01-18 02:01:37 +03:00
|
|
|
}
|
|
|
|
|
2017-11-04 01:58:04 +03:00
|
|
|
FileInodePtr InodePtr::asFilePtr() && {
|
2017-03-09 04:07:00 +03:00
|
|
|
return extractSubclassPtr<FileInodePtr>();
|
2017-01-18 02:01:37 +03:00
|
|
|
}
|
|
|
|
|
2017-04-06 23:08:15 +03:00
|
|
|
FileInode* InodePtr::asFileOrNull() const {
|
|
|
|
return dynamic_cast<FileInode*>(this->value_);
|
2017-01-18 02:01:37 +03:00
|
|
|
}
|
|
|
|
|
2017-04-06 23:08:15 +03:00
|
|
|
FileInodePtr InodePtr::asFilePtrOrNull() const& {
|
|
|
|
return FileInodePtr{dynamic_cast<FileInode*>(this->value_),
|
2017-01-18 02:01:37 +03:00
|
|
|
FileInodePtr::NORMAL_INCREMENT};
|
|
|
|
}
|
|
|
|
|
2017-11-04 01:58:04 +03:00
|
|
|
FileInodePtr InodePtr::asFilePtrOrNull() && {
|
2017-01-18 02:01:37 +03:00
|
|
|
return extractSubclassPtrOrNull<FileInodePtr>();
|
|
|
|
}
|
|
|
|
|
2017-04-06 23:08:15 +03:00
|
|
|
TreeInode* InodePtr::asTree() const {
|
|
|
|
return asSubclass<TreeInode*>();
|
2017-01-18 02:01:37 +03:00
|
|
|
}
|
|
|
|
|
2017-04-06 23:08:15 +03:00
|
|
|
TreeInodePtr InodePtr::asTreePtr() const& {
|
2017-03-09 04:07:00 +03:00
|
|
|
return asSubclassPtr<TreeInodePtr>();
|
2017-01-18 02:01:37 +03:00
|
|
|
}
|
|
|
|
|
2017-11-04 01:58:04 +03:00
|
|
|
TreeInodePtr InodePtr::asTreePtr() && {
|
2017-03-09 04:07:00 +03:00
|
|
|
return extractSubclassPtr<TreeInodePtr>();
|
2017-01-18 02:01:37 +03:00
|
|
|
}
|
|
|
|
|
2017-04-06 23:08:15 +03:00
|
|
|
TreeInode* InodePtr::asTreeOrNull() const {
|
|
|
|
return dynamic_cast<TreeInode*>(this->value_);
|
2017-01-18 02:01:37 +03:00
|
|
|
}
|
|
|
|
|
2017-04-06 23:08:15 +03:00
|
|
|
TreeInodePtr InodePtr::asTreePtrOrNull() const& {
|
|
|
|
return TreeInodePtr{dynamic_cast<TreeInode*>(this->value_),
|
2017-01-18 02:01:37 +03:00
|
|
|
TreeInodePtr::NORMAL_INCREMENT};
|
|
|
|
}
|
|
|
|
|
2017-11-04 01:58:04 +03:00
|
|
|
TreeInodePtr InodePtr::asTreePtrOrNull() && {
|
2017-01-18 02:01:37 +03:00
|
|
|
return extractSubclassPtrOrNull<TreeInodePtr>();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Explicitly instantiate InodePtrImpl for all inode class types
|
|
|
|
template class InodePtrImpl<FileInode>;
|
|
|
|
template class InodePtrImpl<TreeInode>;
|
2017-04-06 23:08:15 +03:00
|
|
|
template FileInodePtr InodePtr::asSubclassPtrOrNull<FileInodePtr>() const&;
|
|
|
|
template TreeInodePtr InodePtr::asSubclassPtrOrNull<TreeInodePtr>() const&;
|
2017-11-04 01:58:04 +03:00
|
|
|
} // namespace eden
|
|
|
|
} // namespace facebook
|