Go to the documentation of this file.
16 #ifndef ABSL_FLAGS_INTERNAL_FLAG_H_
17 #define ABSL_FLAGS_INTERNAL_FLAG_H_
27 #include <type_traits>
30 #include "absl/base/attributes.h"
31 #include "absl/base/call_once.h"
32 #include "absl/base/config.h"
33 #include "absl/base/optimization.h"
34 #include "absl/base/thread_annotations.h"
35 #include "absl/flags/commandlineflag.h"
36 #include "absl/flags/config.h"
37 #include "absl/flags/internal/commandlineflag.h"
38 #include "absl/flags/internal/registry.h"
39 #include "absl/flags/internal/sequence_lock.h"
40 #include "absl/flags/marshalling.h"
41 #include "absl/meta/type_traits.h"
42 #include "absl/strings/string_view.h"
43 #include "absl/synchronization/mutex.h"
44 #include "absl/utility/utility.h"
51 namespace flags_internal {
56 #if defined(_MSC_VER) && !defined(__clang__)
61 using Flag = flags_internal::Flag<T>;
70 template <
typename T,
typename V>
80 namespace flags_internal {
138 return static_cast<size_t>(
reinterpret_cast<intptr_t>(
148 return reinterpret_cast<const std::type_info*
>(
158 return static_cast<ptrdiff_t
>(
reinterpret_cast<intptr_t>(
163 template <
typename T>
165 #if defined(ABSL_FLAGS_INTERNAL_HAS_RTTI)
181 struct FixedCharArray {
184 template <
size_t...
I>
191 template <
typename Gen,
size_t N =
Gen::Value().size()>
197 template <
typename Gen>
233 template <
typename Gen,
size_t N>
234 constexpr FlagHelpArg
HelpArg(
const FixedCharArray<N>&
value) {
238 template <
typename Gen>
250 union FlagDefaultSrc {
254 #define ABSL_FLAGS_INTERNAL_DFLT_FOR_TYPE(T, name) \
256 constexpr explicit FlagDefaultSrc(T value) : name##_value(value) {} // NOLINT
258 #undef ABSL_FLAGS_INTERNAL_DFLT_FOR_TYPE
270 struct FlagDefaultArg {
278 struct EmptyBraces {};
280 template <
typename T>
285 template <
typename T>
290 template <
typename ValueT,
typename GenT,
297 template <
typename ValueT,
typename GenT>
307 template <
typename T>
323 template <
typename T>
331 struct FlagOneWordValue {
334 std::atomic<int64_t>
value;
337 template <
typename T,
341 template <
typename T>
345 alignas(
T)
char value[
sizeof(
T)];
348 template <
typename T>
351 int64_t one_word_val =
value.load(std::memory_order_acquire);
360 template <
typename T>
366 static constexpr
int kNumWords =
370 std::atomic<uint64_t>) std::atomic<uint64_t> value_words[kNumWords];
381 struct FlagCallback {
390 struct DynValueDeleter {
399 class FlagImpl final :
public CommandLineFlag {
598 return impl_.IsSpecifiedOnCommandLine();
604 template <
typename,
bool>
618 impl_.AssertValidType(base_internal::FastTypeId<T>(), &GenRuntimeTypeId<T>);
627 impl_.AssertValidType(base_internal::FastTypeId<T>(), &GenRuntimeTypeId<T>);
647 template <
typename T,
typename FlagType>
651 template <
typename FlagType,
typename T>
655 template <
typename FlagType>
663 template <
typename T>
667 std::allocator<T>
alloc;
668 return std::allocator_traits<std::allocator<T>>::allocate(
alloc, 1);
671 T* p =
static_cast<T*
>(v2);
673 std::allocator<T>
alloc;
674 std::allocator_traits<std::allocator<T>>::deallocate(
alloc, p, 1);
678 *
static_cast<T*
>(v2) = *
static_cast<const T*
>(v1);
681 new (v2)
T(*
static_cast<const T*
>(v1));
684 return reinterpret_cast<void*
>(
static_cast<uintptr_t>(
sizeof(
T)));
686 return const_cast<void*
>(base_internal::FastTypeId<T>());
688 return const_cast<std::type_info*
>(GenRuntimeTypeId<T>());
692 T temp(*
static_cast<T*
>(v2));
702 absl::UnparseFlag<T>(*
static_cast<const T*
>(v1));
707 ptrdiff_t round_to =
alignof(FlagValue<T>);
709 (
sizeof(
FlagImpl) + round_to - 1) / round_to * round_to;
710 return reinterpret_cast<void*
>(
offset);
720 struct FlagRegistrarEmpty {};
721 template <
typename T,
bool do_register>
722 class FlagRegistrar {
747 #endif // ABSL_FLAGS_INTERNAL_FLAG_H_
const uint8_t value_storage_kind_
#define ABSL_PREDICT_FALSE(x)
const CommandLineFlag & GetFlagReflectionHandle(const absl::Flag< T > &f)
void CheckDefaultValueParsingRoundtrip() const override ABSL_LOCKS_EXCLUDED(*DataGuard())
flags_internal::SequenceLock seq_lock_
OPENSSL_EXPORT const ASN1_OBJECT * obj
size_t Sizeof(FlagOpFn op)
int64_t ModificationCount() const ABSL_EXCLUSIVE_LOCKS_REQUIRED(*DataGuard())
FlagRegistrar(Flag< T > &flag, const char *filename)
constexpr FlagDefaultSrc(FlagDfltGenFunc gen_func_arg)
void SetFlag(absl::Flag< T > *flag, const T &v)
bool RegisterCommandLineFlag(CommandLineFlag &, const char *filename)
const CommandLineFlag & Reflect() const
FlagDefaultSrc default_value_
void * FlagOps(FlagOp op, const void *v1, void *v2, void *v3)
std::string DefaultValue() const override ABSL_LOCKS_EXCLUDED(*DataGuard())
FlagHelpKind HelpSourceKind() const
void SetCallback(const FlagCallbackFunc mutation_callback) ABSL_LOCKS_EXCLUDED(*DataGuard())
std::string Help() const override
std::string CurrentValue() const override ABSL_LOCKS_EXCLUDED(*DataGuard())
#define ABSL_FLAGS_INTERNAL_DFLT_FOR_TYPE(T, name)
absl::string_view Name() const override
bool RestoreState(const FlagState &flag_state) ABSL_LOCKS_EXCLUDED(*DataGuard())
absl::base_internal::FastTypeIdType FlagFastTypeId
std::string Unparse(FlagOpFn op, const void *val)
integral_constant< bool, false > false_type
constexpr int64_t UninitializedFlagValue()
constexpr FlagHelpMsg(HelpGenFunc help_gen)
OPENSSL_EXPORT pem_password_cb void * u
const char kStrippedFlagHelp[]
bool Get(const SequenceLock &, T &dst) const
constexpr size_t AlignUp(size_t x, size_t align)
constexpr FixedCharArray< N+1 > HelpStringAsArray(int)
void(*)() FlagCallbackFunc
std::integral_constant< bool, absl::type_traits_internal::is_trivially_copyable< T >::value &&(sizeof(T)<=8)> FlagUseOneWordStorage
#define ABSL_NAMESPACE_END
void(*)(void *) FlagDfltGenFunc
constexpr Flag(const char *name, const char *filename, FlagHelpArg help, const FlagDefaultArg default_arg)
FlagValueStorageKind ValueStorageKind() const
#define T(upbtypeconst, upbtype, ctype, default_value)
absl::string_view Name() const
std::string(*)() HelpGenFunc
std::unique_ptr< FlagStateInterface > SaveState() override ABSL_LOCKS_EXCLUDED(*DataGuard())
FlagDefaultKind DefaultKind() const ABSL_EXCLUSIVE_LOCKS_REQUIRED(*DataGuard())
constexpr T InitDefaultValue(T t)
#define ABSL_MUST_USE_RESULT
bool ParseFrom(absl::string_view value, FlagSettingMode set_mode, ValueSource source, std::string &error) override ABSL_LOCKS_EXCLUDED(*DataGuard())
memcpy(mem, inblock.get(), min(CONTAINING_RECORD(inblock.get(), MEMBLOCK, data) ->size, size))
#define ABSL_NAMESPACE_BEGIN
FlagFastTypeId FastTypeId(FlagOpFn op)
std::string Filename() const override
static ABSL_CONST_INIT std::string *program_name ABSL_GUARDED_BY(program_name_guard)
static const CommandLineFlag & InvokeReflect(const FlagType &f)
void Write(const void *src) ABSL_LOCKS_EXCLUDED(*DataGuard())
constexpr absl::remove_reference_t< T > && move(T &&t) noexcept
void * Clone(FlagOpFn op, const void *obj)
bool IsSpecifiedOnCommandLine() const
std::shared_ptr< ExternalConnectionAcceptorImpl > impl_
make_integer_sequence< size_t, N > make_index_sequence
#define ABSL_LOCK_RETURNED(x)
#define ABSL_EXCLUSIVE_LOCKS_REQUIRED(...)
unsigned __int64 uint64_t
void AssertValidType(FlagFastTypeId type_id, const std::type_info *(*gen_rtti)()) const
bool TryRead(void *dst, const std::atomic< uint64_t > *src, size_t size) const
std::atomic< int64_t > & OneWordValue() const
constexpr FlagImpl(const char *name, const char *filename, FlagOpFn op, FlagHelpArg help, FlagValueStorageKind value_kind, FlagDefaultArg default_arg)
std::unique_ptr< void, DynValueDeleter > TryParse(absl::string_view value, std::string &err) const ABSL_EXCLUSIVE_LOCKS_REQUIRED(*DataGuard())
ABSL_MUST_USE_RESULT T GetFlag(const absl::Flag< T > &flag)
bool Parse(FlagOpFn op, absl::string_view text, void *dst, std::string *error)
void * Alloc(FlagOpFn op)
_W64 unsigned int uintptr_t
FlagCallback *callback_ ABSL_GUARDED_BY * DataGuard()
constexpr FlagHelpArg HelpArg(const FixedCharArray< N > &value)
flags_internal::Flag< T > Flag
bool Get(const SequenceLock &lock, T &dst) const
const uint8_t help_source_kind_
FlagRegistrar OnUpdate(FlagCallbackFunc cb) &&
bool Get(const SequenceLock &, T &) const
const std::type_info * GenRuntimeTypeId()
#define ABSL_FLAGS_INTERNAL_BUILTIN_TYPES(A)
bool IsSpecifiedOnCommandLine() const override ABSL_LOCKS_EXCLUDED(*DataGuard())
std::atomic< uint64_t > * AtomicBufferValue() const
char data_guard_[sizeof(absl::Mutex)]
void Delete(FlagOpFn op, void *obj)
void CopyConstruct(FlagOpFn op, const void *src, void *dst)
FlagFastTypeId TypeId() const override
void Read(void *dst) const override ABSL_LOCKS_EXCLUDED(*DataGuard())
static T InvokeGet(const FlagType &flag)
std::string Filename() const
#define ABSL_LOCKS_EXCLUDED(...)
void ReadSequenceLockedData(void *dst) const ABSL_LOCKS_EXCLUDED(*DataGuard())
bool ValidateInputValue(absl::string_view value) const override ABSL_LOCKS_EXCLUDED(*DataGuard())
const char *const filename_
absl::once_flag init_control_
ptrdiff_t ValueOffset(FlagOpFn op)
static constexpr FlagValueStorageKind StorageKind()
std::string CurrentValue() const
static void InvokeSet(FlagType &flag, const T &v)
absl::Mutex *DataGuard() const ABSL_LOCK_RETURNED(reinterpret_cast< absl std::unique_ptr< void, DynValueDeleter > MakeInitValue() const ABSL_EXCLUSIVE_LOCKS_REQUIRED(*DataGuard())
DynValueDeleter(FlagOpFn op_arg=nullptr)
void *(*)(FlagOp, const void *, void *, void *) FlagOpFn
class PROTOBUF_EXPORT alignas(8) Arena final
std::integral_constant< bool, absl::type_traits_internal::is_trivially_copyable< T >::value &&(sizeof(T) > 8)> FlagShouldUseSequenceLock
std::atomic< int64_t > value
StorageT * OffsetValue() const
const std::type_info * RuntimeTypeId(FlagOpFn op)
std::string DefaultValue() const
void operator()(void *ptr) const
static constexpr FixedCharArray< N > FromLiteralString(absl::string_view str, absl::index_sequence< I... >)
void * AlignedBufferValue() const
constexpr FlagOneWordValue()
void StoreValue(const void *src) ABSL_EXCLUSIVE_LOCKS_REQUIRED(*DataGuard())
std::allocator< int > alloc
OPENSSL_EXPORT pem_password_cb * cb
void Copy(FlagOpFn op, const void *src, void *dst)
constexpr FlagHelpMsg(const char *help_msg)
constexpr FlagDefaultArg DefaultArg(int)
void InvokeCallback() const ABSL_EXCLUSIVE_LOCKS_REQUIRED(*DataGuard())
grpc
Author(s):
autogenerated on Fri May 16 2025 02:58:24