From 914ff44510505f209d8e85a01e31f4c5fb1b6a5b Mon Sep 17 00:00:00 2001 From: Abseil Team Date: Thu, 20 Feb 2020 12:34:37 -0800 Subject: Export of internal Abseil changes -- bffb14058bb46137d42c7a113a36b6b582997cda by Xiaoyi Zhang : Add ABSL_MUST_USE_RESULT to Status. PiperOrigin-RevId: 296272498 -- b426fdd3b3f687d7a8aeb644925923bbab503778 by CJ Johnson : Optimizes absl::InlinedVector::clear() by not deallocating the data, if allocated. This allows allocations to be reused. This matches the behavior of std::vector::clear() PiperOrigin-RevId: 296197235 -- 8cb9fbfe20e749816065c1a042e84f72dac9bfc0 by CJ Johnson : Optimizes absl::InlinedVector::clear() by not deallocating the data, if allocated. This allows allocations to be reused. This matches the behavior of std::vector::clear() PiperOrigin-RevId: 296058092 -- 2558d3369a482879919155b6f46317ccafe0ca13 by Matthew Brown : Internal cleanup PiperOrigin-RevId: 296025806 -- cf7ee57228534021c15ed7421df92acf6c27c9c7 by Gennadiy Rozental : Make FlagOps enum class. We also add comments to all the functions used to invoke flag ops. PiperOrigin-RevId: 295975809 -- 74bbdbd12fbc54e9c4ebcb3005e727becf0e509d by Xiaoyi Zhang : Release `absl::Status`. PiperOrigin-RevId: 295777662 -- 3dbc622b4e2227863525da2f7de7ecbeb3ede21f by Xiaoyi Zhang : Internal change. PiperOrigin-RevId: 295733658 -- 48d74aa0ab01d611da6012b377f038d8b26c712e by Abseil Team : Fix typo in container/CMakeLists.txt for container_common PiperOrigin-RevId: 295491438 GitOrigin-RevId: bffb14058bb46137d42c7a113a36b6b582997cda Change-Id: Ia966857b07fa7412cd6489ac37b5fa26640e4141 --- absl/flags/internal/flag.h | 48 +++++++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 20 deletions(-) (limited to 'absl/flags/internal/flag.h') diff --git a/absl/flags/internal/flag.h b/absl/flags/internal/flag.h index 1c2f15d..ec67348 100644 --- a/absl/flags/internal/flag.h +++ b/absl/flags/internal/flag.h @@ -43,10 +43,10 @@ template class Flag; /////////////////////////////////////////////////////////////////////////////// -// Type-specific operations, eg., parsing, copying, etc. are provided +// Flag value type operations, eg., parsing, copying, etc. are provided // by function specific to that type with a signature matching FlagOpFn. -enum FlagOp { +enum class FlagOp { kDelete, kClone, kCopy, @@ -58,26 +58,26 @@ enum FlagOp { }; using FlagOpFn = void* (*)(FlagOp, const void*, void*, void*); -// The per-type function +// Flag value specific operations routine. template void* FlagOps(FlagOp op, const void* v1, void* v2, void* v3) { switch (op) { - case flags_internal::kDelete: + case FlagOp::kDelete: delete static_cast(v1); return nullptr; - case flags_internal::kClone: + case FlagOp::kClone: return new T(*static_cast(v1)); - case flags_internal::kCopy: + case FlagOp::kCopy: *static_cast(v2) = *static_cast(v1); return nullptr; - case flags_internal::kCopyConstruct: + case FlagOp::kCopyConstruct: new (v2) T(*static_cast(v1)); return nullptr; - case flags_internal::kSizeof: + case FlagOp::kSizeof: return reinterpret_cast(sizeof(T)); - case flags_internal::kStaticTypeId: + case FlagOp::kStaticTypeId: return reinterpret_cast(&FlagStaticTypeIdGen); - case flags_internal::kParse: { + case FlagOp::kParse: { // Initialize the temporary instance of type T based on current value in // destination (which is going to be flag's default value). T temp(*static_cast(v2)); @@ -88,7 +88,7 @@ void* FlagOps(FlagOp op, const void* v1, void* v2, void* v3) { *static_cast(v2) = std::move(temp); return v2; } - case flags_internal::kUnparse: + case FlagOp::kUnparse: *static_cast(v2) = absl::UnparseFlag(*static_cast(v1)); return nullptr; @@ -97,37 +97,45 @@ void* FlagOps(FlagOp op, const void* v1, void* v2, void* v3) { } } -// Functions that invoke flag-type-specific operations. +// Deletes memory interpreting obj as flag value type pointer. inline void Delete(FlagOpFn op, const void* obj) { - op(flags_internal::kDelete, obj, nullptr, nullptr); + op(FlagOp::kDelete, obj, nullptr, nullptr); } +// Makes a copy of flag value pointed by obj. inline void* Clone(FlagOpFn op, const void* obj) { - return op(flags_internal::kClone, obj, nullptr, nullptr); + return op(FlagOp::kClone, obj, nullptr, nullptr); } +// Copies src to dst interpreting as flag value type pointers. inline void Copy(FlagOpFn op, const void* src, void* dst) { - op(flags_internal::kCopy, src, dst, nullptr); + op(FlagOp::kCopy, src, dst, nullptr); } +// Construct a copy of flag value in a location pointed by dst +// based on src - pointer to the flag's value. inline void CopyConstruct(FlagOpFn op, const void* src, void* dst) { - op(flags_internal::kCopyConstruct, src, dst, nullptr); + op(FlagOp::kCopyConstruct, src, dst, nullptr); } +// Returns true if parsing of input text is successfull. inline bool Parse(FlagOpFn op, absl::string_view text, void* dst, std::string* error) { - return op(flags_internal::kParse, &text, dst, error) != nullptr; + return op(FlagOp::kParse, &text, dst, error) != nullptr; } +// Returns string representing supplied value. inline std::string Unparse(FlagOpFn op, const void* val) { std::string result; - op(flags_internal::kUnparse, val, &result, nullptr); + op(FlagOp::kUnparse, val, &result, nullptr); return result; } +// Returns size of flag value type. inline size_t Sizeof(FlagOpFn op) { // This sequence of casts reverses the sequence from // `flags_internal::FlagOps()` return static_cast(reinterpret_cast( - op(flags_internal::kSizeof, nullptr, nullptr, nullptr))); + op(FlagOp::kSizeof, nullptr, nullptr, nullptr))); } +// Returns static type id coresponding to the value type. inline FlagStaticTypeId StaticTypeId(FlagOpFn op) { return reinterpret_cast( - op(flags_internal::kStaticTypeId, nullptr, nullptr, nullptr)); + op(FlagOp::kStaticTypeId, nullptr, nullptr, nullptr)); } /////////////////////////////////////////////////////////////////////////////// -- cgit v1.2.3