X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2FDiscriminatedPtr.h;h=f12e3d9cde660f4de83de7f325aa676b18cfc96d;hb=712b8b8de747960ceeceedfd3a18ee23a0c03a80;hp=542064bddf81c9cc85b2cada74ddfb39fc454317;hpb=ed8c80a0e0988e4ce687f51ca832a00e4a6b7930;p=folly.git diff --git a/folly/DiscriminatedPtr.h b/folly/DiscriminatedPtr.h index 542064bd..f12e3d9c 100644 --- a/folly/DiscriminatedPtr.h +++ b/folly/DiscriminatedPtr.h @@ -28,12 +28,14 @@ #include #include + #include + #include #include #include -#if !FOLLY_X64 && !FOLLY_A64 && !FOLLY_PPC64 +#if !FOLLY_X64 && !FOLLY_AARCH64 && !FOLLY_PPC64 # error "DiscriminatedPtr is x64, arm64 and ppc64 specific code." #endif @@ -171,7 +173,9 @@ class DiscriminatedPtr { template typename dptr_detail::VisitorResult::type apply(V&& visitor) { size_t n = index(); - if (n == 0) throw std::invalid_argument("Empty DiscriminatedPtr"); + if (n == 0) { + throw std::invalid_argument("Empty DiscriminatedPtr"); + } return dptr_detail::ApplyVisitor()( n, std::forward(visitor), ptr()); } @@ -180,7 +184,9 @@ class DiscriminatedPtr { typename dptr_detail::ConstVisitorResult::type apply(V&& visitor) const { size_t n = index(); - if (n == 0) throw std::invalid_argument("Empty DiscriminatedPtr"); + if (n == 0) { + throw std::invalid_argument("Empty DiscriminatedPtr"); + } return dptr_detail::ApplyConstVisitor()( n, std::forward(visitor), ptr()); } @@ -190,8 +196,8 @@ class DiscriminatedPtr { * Get the 1-based type index of T in Types. */ template - size_t typeIndex() const { - return dptr_detail::GetTypeIndex::value; + uint16_t typeIndex() const { + return uint16_t(dptr_detail::GetTypeIndex::value); } uint16_t index() const { return data_ >> 48; } @@ -215,4 +221,25 @@ class DiscriminatedPtr { uintptr_t data_; }; -} // namespace folly +template +decltype(auto) apply_visitor( + Visitor&& visitor, + const DiscriminatedPtr& variant) { + return variant.apply(std::forward(visitor)); +} + +template +decltype(auto) apply_visitor( + Visitor&& visitor, + DiscriminatedPtr& variant) { + return variant.apply(std::forward(visitor)); +} + +template +decltype(auto) apply_visitor( + Visitor&& visitor, + DiscriminatedPtr&& variant) { + return variant.apply(std::forward(visitor)); +} + +} // namespace folly