summaryrefslogtreecommitdiff
path: root/absl/flags/internal
diff options
context:
space:
mode:
authorGravatar Abseil Team <absl-team@google.com>2020-09-09 19:13:17 -0700
committerGravatar Derek Mauro <dmauro@google.com>2020-09-10 10:10:40 -0400
commitf2c9c663db28a8a898c1fc8c8e06ab9b93eb5610 (patch)
tree2a6917d880a84a4dc4c95d21ffed0a9fe07d470c /absl/flags/internal
parent3c8b5d7587dc8ecf730ce9996c89e156e408c3ed (diff)
Export of internal Abseil changes
-- cfb567ed02096320663d882d2c0c2fb7db7af1e4 by Derek Mauro <dmauro@google.com>: Upgrade to GCC 10.2.0, Bazel 3.5.0, and CMake 3.18.2 PiperOrigin-RevId: 330847323 -- 5dcb9ce14d92315163079366a91c43cbd5184ea4 by Evan Brown <ezb@google.com>: Optimize equal_range() by avoiding the call to upper_bound() when possible. We need to support heterogeneous comparators that have different behavior when comparing key_type to non-key_type. See the new test. Also update the comment for `key_compare_to_adapter`. PiperOrigin-RevId: 330794444 -- 744405dbda5513527d74094a5c3b9db1e0927693 by Gennadiy Rozental <rogeeff@google.com>: Introduce trampoline for friend access to avoid friending routines and classes from different namespace. PiperOrigin-RevId: 330773156 -- a195d1226576f8a7bb5671f3e42d1021b827fad9 by Abseil Team <absl-team@google.com>: Fix an incorrect version number test for std::variant availability in tvOs. PiperOrigin-RevId: 330759480 -- 58b02eb9159a577953676d9928cb26b30068b847 by Derek Mauro <dmauro@google.com>: Use c++20 instead of c++2a now that it is supported by GCC PiperOrigin-RevId: 330559797 GitOrigin-RevId: cfb567ed02096320663d882d2c0c2fb7db7af1e4 Change-Id: I0e0d68409c95da42f5609920155ba5694ade8df0
Diffstat (limited to 'absl/flags/internal')
-rw-r--r--absl/flags/internal/flag.h38
1 files changed, 21 insertions, 17 deletions
diff --git a/absl/flags/internal/flag.h b/absl/flags/internal/flag.h
index 89e43ad7..370d8a02 100644
--- a/absl/flags/internal/flag.h
+++ b/absl/flags/internal/flag.h
@@ -632,20 +632,9 @@ class Flag {
std::string CurrentValue() const { return impl_.CurrentValue(); }
private:
- template <typename U, bool do_register>
+ template <typename, bool>
friend class FlagRegistrar;
-
-#if !defined(_MSC_VER) || defined(__clang__)
- template <typename U>
- friend U absl::GetFlag(const flags_internal::Flag<U>& flag);
- template <typename U>
- friend void absl::SetFlag(flags_internal::Flag<U>* flag, const U& v);
- template <typename U, typename V>
- friend void absl::SetFlag(flags_internal::Flag<U>* flag, const V& v);
-#else
- template <typename U>
- friend class absl::Flag;
-#endif
+ friend class FlagImplPeer;
T Get() const {
// See implementation notes in CommandLineFlag::Get().
@@ -668,10 +657,6 @@ class Flag {
impl_.Write(&v);
}
- template <typename U>
- friend const CommandLineFlag& absl::GetFlagReflectionHandle(
- const absl::Flag<U>& f);
-
// Access to the reflection.
const CommandLineFlag& Reflect() const { return impl_; }
@@ -684,6 +669,25 @@ class Flag {
};
///////////////////////////////////////////////////////////////////////////////
+// Trampoline for friend access
+
+class FlagImplPeer {
+ public:
+ template <typename T, typename FlagType>
+ static T InvokeGet(const FlagType& flag) {
+ return flag.Get();
+ }
+ template <typename FlagType, typename T>
+ static void InvokeSet(FlagType& flag, const T& v) {
+ flag.Set(v);
+ }
+ template <typename FlagType>
+ static const CommandLineFlag& InvokeReflect(const FlagType& f) {
+ return f.Reflect();
+ }
+};
+
+///////////////////////////////////////////////////////////////////////////////
// Implementation of Flag value specific operations routine.
template <typename T>
void* FlagOps(FlagOp op, const void* v1, void* v2, void* v3) {