#ifndef ABSL_FLAGS_COMMANDLINEFLAG_H_
#define ABSL_FLAGS_COMMANDLINEFLAG_H_
#include <memory>
#include <string>
#include "absl/base/config.h"
#include "absl/base/internal/fast_type_id.h"
#include "absl/flags/internal/commandlineflag.h"
#include "absl/strings/string_view.h"
#include "absl/types/optional.h"
namespace absl {
ABSL_NAMESPACE_BEGIN
namespace flags_internal {
class PrivateHandleAccessor;
}
#if defined(__GNUC__) && !defined(__clang__)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wnon-virtual-dtor"
#endif
class CommandLineFlag {
public:
constexpr CommandLineFlag() = default;
CommandLineFlag(const CommandLineFlag&) = delete;
CommandLineFlag& operator=(const CommandLineFlag&) = delete;
template <typename T>
inline bool IsOfType() const {
return TypeId() == base_internal::FastTypeId<T>();
}
template <typename T>
absl::optional<T> TryGet() const {
if (IsRetired() || !IsOfType<T>()) {
return absl::nullopt;
}
union U {
T value;
U() {}
~U() { value.~T(); }
};
U u;
Read(&u.value);
if (IsRetired()) {
return absl::nullopt;
}
return std::move(u.value);
}
virtual absl::string_view Name() const = 0;
virtual std::string Filename() const = 0;
virtual std::string Help() const = 0;
virtual bool IsRetired() const;
virtual std::string DefaultValue() const = 0;
virtual std::string CurrentValue() const = 0;
bool ParseFrom(absl::string_view value, std::string* error);
protected:
~CommandLineFlag() = default;
private:
friend class flags_internal::PrivateHandleAccessor;
virtual bool ParseFrom(absl::string_view value,
flags_internal::FlagSettingMode set_mode,
flags_internal::ValueSource source,
std::string& error) = 0;
virtual flags_internal::FlagFastTypeId TypeId() const = 0;
virtual std::unique_ptr<flags_internal::FlagStateInterface> SaveState() = 0;
virtual void Read(void* dst) const = 0;
virtual bool IsSpecifiedOnCommandLine() const = 0;
virtual bool ValidateInputValue(absl::string_view value) const = 0;
virtual void CheckDefaultValueParsingRoundtrip() const = 0;
};
#if defined(__GNUC__) && !defined(__clang__)
#pragma GCC diagnostic pop
#endif
ABSL_NAMESPACE_END
}
#endif