X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2FDiscriminatedPtr.h;h=f12e3d9cde660f4de83de7f325aa676b18cfc96d;hb=f19e2b86e49ad30f2279262a672be852283644d2;hp=24494eff0124553f92ff414ec50167ae3e72bd21;hpb=dee8a5180aa542d98d1b71c74f83a006e4627952;p=folly.git diff --git a/folly/DiscriminatedPtr.h b/folly/DiscriminatedPtr.h index 24494eff..f12e3d9c 100644 --- a/folly/DiscriminatedPtr.h +++ b/folly/DiscriminatedPtr.h @@ -1,5 +1,5 @@ /* - * Copyright 2016 Facebook, Inc. + * Copyright 2017 Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,13 +28,15 @@ #include #include + #include + #include #include #include -#if !FOLLY_X64 && !FOLLY_PPC64 -# error "DiscriminatedPtr is x64 and ppc64 specific code." +#if !FOLLY_X64 && !FOLLY_AARCH64 && !FOLLY_PPC64 +# error "DiscriminatedPtr is x64, arm64 and ppc64 specific code." #endif namespace folly { @@ -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