X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2FDiscriminatedPtr.h;h=f12e3d9cde660f4de83de7f325aa676b18cfc96d;hb=598926c4529b459ce535657ec76ac792f4ec010e;hp=1054f595681c200a5c51941734eed925d40a80c1;hpb=80c7ef06203a251bdc5ea88134847e386970f50d;p=folly.git diff --git a/folly/DiscriminatedPtr.h b/folly/DiscriminatedPtr.h index 1054f595..f12e3d9c 100644 --- a/folly/DiscriminatedPtr.h +++ b/folly/DiscriminatedPtr.h @@ -1,5 +1,5 @@ /* - * Copyright 2015 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. @@ -24,18 +24,19 @@ * @author Tudor Bosman (tudorb@fb.com) */ -#ifndef FOLLY_DISCRIMINATEDPTR_H_ -#define FOLLY_DISCRIMINATEDPTR_H_ +#pragma once #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 { @@ -172,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()); } @@ -181,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()); } @@ -191,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; } @@ -216,6 +221,25 @@ class DiscriminatedPtr { uintptr_t data_; }; -} // namespace folly - -#endif /* FOLLY_DISCRIMINATEDPTR_H_ */ +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