Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef ABSL_FLAGS_INTERNAL_FLAG_H_
00017 #define ABSL_FLAGS_INTERNAL_FLAG_H_
00018
00019 #include "absl/flags/internal/commandlineflag.h"
00020 #include "absl/flags/internal/registry.h"
00021
00022 namespace absl {
00023 namespace flags_internal {
00024
00025
00026 template <typename T>
00027 class Flag {
00028 public:
00029 constexpr Flag(const char* name, const flags_internal::HelpGenFunc help_gen,
00030 const char* filename,
00031 const flags_internal::FlagMarshallingOpFn marshalling_op,
00032 const flags_internal::InitialValGenFunc initial_value_gen)
00033 : internal(name, flags_internal::HelpText::FromFunctionPointer(help_gen),
00034 filename, &flags_internal::FlagOps<T>, marshalling_op,
00035 initial_value_gen,
00036 false, nullptr,
00037 nullptr) {}
00038
00039
00040 Flag(const Flag<T>&) = delete;
00041 Flag<T>& operator=(const Flag<T>&) = delete;
00042
00043 absl::string_view Name() const { return internal.Name(); }
00044 std::string Help() const { return internal.Help(); }
00045 std::string Filename() const { return internal.Filename(); }
00046
00047 absl::flags_internal::CommandLineFlag internal;
00048
00049 void SetCallback(const flags_internal::FlagCallback mutation_callback) {
00050 internal.SetCallback(mutation_callback);
00051 }
00052
00053 private:
00054
00055
00056
00057
00058
00059
00060
00061 };
00062
00063
00064
00065
00066 template <typename T, bool do_register>
00067 class FlagRegistrar {
00068 public:
00069 explicit FlagRegistrar(Flag<T>* flag) : flag_(flag) {
00070 if (do_register) flags_internal::RegisterCommandLineFlag(&flag_->internal);
00071 }
00072
00073 FlagRegistrar& OnUpdate(flags_internal::FlagCallback cb) && {
00074 flag_->SetCallback(cb);
00075 return *this;
00076 }
00077
00078
00079
00080 operator bool() const { return true; }
00081
00082 private:
00083 Flag<T>* flag_;
00084 };
00085
00086
00087
00088 struct EmptyBraces {};
00089
00090 template <typename T>
00091 T* MakeFromDefaultValue(T t) {
00092 return new T(std::move(t));
00093 }
00094
00095 template <typename T>
00096 T* MakeFromDefaultValue(EmptyBraces) {
00097 return new T;
00098 }
00099
00100 }
00101 }
00102
00103 #endif // ABSL_FLAGS_INTERNAL_FLAG_H_