feat: add helper macro and new Win32 function.

- add IsValidCodePage in WinFctHelper to check whether code page number is valid.
- add 6 macros to batchly (add / set default) (move / copy) (constructor / assign operator).
- add default or delete (copy / move) (constructor / assign operator) for some classes.
This commit is contained in:
2024-08-04 11:57:56 +08:00
parent 6da990876e
commit e6c24b8b61
12 changed files with 185 additions and 74 deletions

View File

@ -55,20 +55,13 @@ namespace YYCC::ArgParser {
private:
/**
* @brief Constructor of ArgumentList used internally.
* @param[in] arguments
* @param[in] arguments
* Underlying argument list.
* This argument list should remove first executable name before passing it to there.
*/
ArgumentList(std::vector<yycc_u8string>&& arguments);
public:
/// @brief Default copy constructor
ArgumentList(const ArgumentList&) = default;
/// @brief Default copy assigner
ArgumentList& operator=(const ArgumentList&) = default;
/// @brief Default move constructor
ArgumentList(ArgumentList&&) = default;
/// @brief Default move assigner
ArgumentList& operator=(ArgumentList&&) = default;
YYCC_DEF_CLS_COPY_MOVE(ArgumentList);
public:
/**
@ -89,17 +82,17 @@ namespace YYCC::ArgParser {
const yycc_u8string& Argument() const;
/**
* @brief Check whether current argument is a option / switch.
* @param[out] is_long_name
* @param[out] is_long_name
* It will be set true if this argument is long name, otherwise short name.
* nullptr if you don't want to receive this infomation.
* @param[out] long_name
* @param[out] long_name
* The container holding matched long name if it is (double dash stripped).
* nullptr if you don't want to receive this infomation.
* @param[out] short_name
* @param[out] short_name
* The variable holding matched short name if it is (dash stripped).
* nullptr if you don't want to receive this infomation.
* @exception std::runtime_error Try fetching data at the tail of argument list.
* @return
* @return
* True if it is, otherwise false.
* If this function return false, all given parameters are in undefined status.
*/
@ -109,7 +102,7 @@ namespace YYCC::ArgParser {
yycc_char8_t* short_name = nullptr) const;
/**
* @brief Check whether current argument is a value.
* @param[out] val
* @param[out] val
* The variable holding value if it is.
* nullptr if you don't want to receive this infomation.
* @exception std::runtime_error Try fetching data at the tail of argument list.
@ -133,7 +126,7 @@ namespace YYCC::ArgParser {
/**
* @brief Check whether current argument is long name option / switch.
* @details This function is used by IsSwitch() internally.
* @param[out] name_part
* @param[out] name_part
* The container holding matched long name if it is (double dash stripped).
* nullptr if you don't want to receive this infomation.
* @return True if it is, otherwise false.
@ -142,7 +135,7 @@ namespace YYCC::ArgParser {
/**
* @brief Check whether current argument is short name option / switch.
* @details This function is used by IsSwitch() internally.
* @param[out] name_part
* @param[out] name_part
* The variable holding matched short name if it is (dash stripped).
* nullptr if you don't want to receive this infomation.
* @return True if it is, otherwise false.
@ -151,7 +144,7 @@ namespace YYCC::ArgParser {
private:
std::vector<yycc_u8string> m_Arguments;
std::vector<yycc_u8string>::const_iterator m_ArgumentsIterator;
size_t m_ArgumentsCursor;
};
/**
@ -171,7 +164,7 @@ namespace YYCC::ArgParser {
/**
* @brief Check whether given short name is valid.
* @details
* An ASCII code of valid short name
* An ASCII code of valid short name
* should not lower than #MIN_SHORT_NAME or higher than #MAX_SHORT_NAME.
* It also can not be #DASH.
* @param[in] short_name Short name for checking.
@ -181,7 +174,7 @@ namespace YYCC::ArgParser {
/**
* @brief Check whether given long name is valid.
* @details
* An ASCII code of every item in valid long name
* An ASCII code of every item in valid long name
* should not lower than #MIN_SHORT_NAME or higher than #MAX_SHORT_NAME.
* However it can be #DASH. This is different with short name.
* @param[in] long_name Long name for checking.
@ -209,6 +202,7 @@ namespace YYCC::ArgParser {
const yycc_char8_t* description = nullptr, const yycc_char8_t* argument_example = nullptr,
bool is_optional = false);
virtual ~AbstractArgument();
YYCC_DEL_CLS_COPY_MOVE(AbstractArgument);
// ===== User Implementation =====
protected:
@ -226,12 +220,12 @@ namespace YYCC::ArgParser {
virtual bool Parse(ArgumentList& al) = 0;
/**
* @brief User implemented custom reset function
* @remarks
* @remarks
* In this function, user should claer its stored value if is has.
* You don't need clar capture state. That is done by library self.
*/
virtual void Reset() = 0;
// ===== Basic Infos =====
public:
/// @brief Check whether this argument specify long name.
@ -267,7 +261,7 @@ namespace YYCC::ArgParser {
yycc_u8string m_Description;
yycc_u8string m_ArgumentExample;
bool m_IsOptional;
// ===== Capture State =====
public:
/// @brief Check whether this argument has been captured.
@ -296,12 +290,13 @@ namespace YYCC::ArgParser {
const yycc_char8_t* summary, const yycc_char8_t* description,
std::initializer_list<AbstractArgument*> arguments);
~OptionContext();
YYCC_DEL_CLS_COPY_MOVE(OptionContext);
public:
/**
* @brief Start a parse.
* @param[in] al The reference to ArgumentList for parsing.
* @return
* @return
* True if success, otherwise false.
* If this function return false, you should not visit any arguments it managed.
*/
@ -325,7 +320,7 @@ namespace YYCC::ArgParser {
};
#pragma region Argument Presets
/**
* @brief Arithmetic (integral, floating point. except bool) type argument
* @tparam _Ty The internal stored type belongs to arithmetic type.
@ -350,6 +345,7 @@ namespace YYCC::ArgParser {
Constraints::Constraint<_Ty> constraint = Constraints::Constraint<_Ty> {}) :
AbstractArgument(long_name, short_name, description, argument_example, is_optional), m_Data(), m_Constraint(constraint) {}
virtual ~NumberArgument() {}
YYCC_DEL_CLS_COPY_MOVE(NumberArgument);
public:
/// @brief Get stored data in argument.
@ -401,14 +397,15 @@ namespace YYCC::ArgParser {
const yycc_char8_t* description = nullptr) :
// bool switch must be optional, because it is false if no given switch.
// bool switch doesn't have argument, so it doesn't have example property.
AbstractArgument(long_name, short_name, description, nullptr, true) {}
AbstractArgument(long_name, short_name, description, nullptr, true) {}
virtual ~SwitchArgument() {}
YYCC_DEL_CLS_COPY_MOVE(SwitchArgument);
protected:
virtual bool Parse(ArgumentList& al) override { return true; } // simply return true because no value to store.
virtual void Reset() override {} // nothing need to be reset.
};
/// @brief String type argument
class StringArgument : public AbstractArgument {
public:
@ -429,6 +426,7 @@ namespace YYCC::ArgParser {
Constraints::Constraint<yycc_u8string> constraint = Constraints::Constraint<yycc_u8string> {}) :
AbstractArgument(long_name, short_name, description, argument_example, is_optional), m_Data(), m_Constraint(constraint) {}
virtual ~StringArgument() {}
YYCC_DEL_CLS_COPY_MOVE(StringArgument);
public:
/// @brief Get stored data in argument.