Sourcemeta Core 0.0.0
Loading...
Searching...
No Matches
options.h
1#ifndef SOURCEMETA_CORE_OPTIONS_H_
2#define SOURCEMETA_CORE_OPTIONS_H_
3
4#ifndef SOURCEMETA_CORE_OPTIONS_EXPORT
5#include <sourcemeta/core/options_export.h>
6#endif
7
8// NOLINTBEGIN(misc-include-cleaner)
9#include <sourcemeta/core/options_error.h>
10// NOLINTEND(misc-include-cleaner)
11
12#include <cstddef> // std::size_t
13#include <initializer_list> // std::initializer_list
14#include <memory> // std::unique_ptr
15#include <string> // std::string
16#include <string_view> // std::string_view
17#include <unordered_map> // std::unordered_map
18#include <unordered_set> // std::unordered_set
19#include <vector> // std::vector
20
29
30namespace sourcemeta::core {
31
36 std::size_t skip{0};
37};
38
70class SOURCEMETA_CORE_OPTIONS_EXPORT Options {
71public:
72 Options() = default;
73 // Disallow copies given the unique pointers
74 Options(const Options &) = delete;
75 auto operator=(const Options &) -> Options & = delete;
77 Options(Options &&) noexcept = default;
78 auto operator=(Options &&) noexcept -> Options & = default;
79
81 auto option(std::string &&name, std::initializer_list<std::string> aliases)
82 -> void;
83
85 auto flag(std::string &&name, std::initializer_list<std::string> aliases)
86 -> void;
87
89 [[nodiscard]] auto at(const std::string_view name) const
90 -> const std::vector<std::string_view> &;
91
93 [[nodiscard]] auto contains(const std::string_view name) const -> bool;
94
96 [[nodiscard]] auto positional() const
97 -> const std::vector<std::string_view> &;
98
100 auto parse(const int argc,
101 // We want to be compatible with `main`s `argv`
102 // NOLINTNEXTLINE(modernize-avoid-c-arrays)
103 const char *const argv[], const OptionsModifiers options = {})
104 -> void;
105
106private:
107// Exporting symbols that depends on the standard C++ library is considered
108// safe.
109// https://learn.microsoft.com/en-us/cpp/error-messages/compiler-warnings/compiler-warning-level-2-c4275?view=msvc-170&redirectedfrom=MSDN
110#if defined(_MSC_VER)
111#pragma warning(disable : 4251 4275)
112#endif
113 static constexpr std::string_view POSITIONAL_ARGUMENT_NAME{""};
114 static const std::vector<std::string_view> EMPTY;
115
116 std::vector<std::unique_ptr<std::string>> storage;
117 std::unordered_map<std::string_view, std::string_view> aliases_;
118 std::unordered_map<std::string_view, std::vector<std::string_view>> options_;
119 std::unordered_set<std::string_view> flags;
120#if defined(_MSC_VER)
121#pragma warning(default : 4251 4275)
122#endif
123};
124
125} // namespace sourcemeta::core
126
127#endif // SOURCEMETA_CORE_OPTIONS_H_
auto positional() const -> const std::vector< std::string_view > &
Access the positional arguments, if any.
auto parse(const int argc, const char *const argv[], const OptionsModifiers options={}) -> void
Parse program arguments given the declared options and flags.
Options(Options &&) noexcept=default
Move constructor.
auto at(const std::string_view name) const -> const std::vector< std::string_view > &
Access the values (if any) set for an option or flag, by its main name.
auto contains(const std::string_view name) const -> bool
Check if an option or flag was set, by its main name.
auto option(std::string &&name, std::initializer_list< std::string > aliases) -> void
Declare a new option, which must take a value.
auto flag(std::string &&name, std::initializer_list< std::string > aliases) -> void
Declare a new flag, which must not take a value.
std::size_t skip
Ignore the first N command-line arguments.
Definition options.h:36
Definition options.h:34