Skip to content

Commit

Permalink
Fix constructor
Browse files Browse the repository at this point in the history
  • Loading branch information
gen740 committed Dec 6, 2023
1 parent 0fcc9be commit 80254a8
Show file tree
Hide file tree
Showing 8 changed files with 166 additions and 85 deletions.
3 changes: 3 additions & 0 deletions Argo/ArgoMetaParse.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ module;
export module Argo:MetaParse;
import :std_module;
import :Arg;
import :TypeTraits;

// generator start here

Expand All @@ -16,6 +17,7 @@ struct SubParser {
};

template <class SubParsers>
requires(is_tuple_v<SubParsers>)
auto MetaParse(SubParsers sub_parsers, int index, int argc,
char** argv) -> bool {
return std::apply(
Expand All @@ -29,6 +31,7 @@ auto MetaParse(SubParsers sub_parsers, int index, int argc,
};

template <class SubParsers>
requires(is_tuple_v<SubParsers>)
constexpr auto ParserIndex(SubParsers sub_parsers, //
std::string_view key) -> std::int64_t {
return std::apply(
Expand Down
26 changes: 13 additions & 13 deletions Argo/ArgoParser.cc
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,8 @@ struct ParserInfo {
};

export template <ParserID ID = 0, class Args = std::tuple<>, class PArg = void,
class HArg = void, class SubParserTuple = std::tuple<>>
class HArg = void, class SubParsers = std::tuple<>>
requires(is_tuple_v<Args> && is_tuple_v<SubParsers>)
class Parser {
private:
bool parsed_ = false;
Expand Down Expand Up @@ -78,12 +79,11 @@ class Parser {
Parser(const Parser&) = delete;
Parser(Parser&&) = delete;

SubParserTuple subParsers;
SubParsers subParsers;

constexpr explicit Parser(SubParserTuple tuple) : subParsers(tuple) {}
constexpr explicit Parser(SubParsers tuple) : subParsers(tuple) {}

constexpr explicit Parser(std::unique_ptr<ParserInfo> info,
SubParserTuple tuple)
constexpr explicit Parser(std::unique_ptr<ParserInfo> info, SubParsers tuple)
: info_(std::move(info)), subParsers(tuple){};

template <class Type, ArgName Name, auto arg1 = Unspecified(),
Expand Down Expand Up @@ -191,7 +191,7 @@ class Parser {
tuple_append_t<Args, typename decltype(arg)::type>,
PArg,
HArg,
SubParserTuple>(std::move(this->info_), subParsers);
SubParsers>(std::move(this->info_), subParsers);
}

template <ArgName Name, class Type, auto arg1 = Unspecified(),
Expand All @@ -202,7 +202,7 @@ class Parser {
static_assert(Name.shortName == '\0',
"Positional argment cannot have short name");
auto arg = createArg<Type, Name, arg1, arg2>(std::forward<T>(args)...);
return Parser<ID, Args, typename decltype(arg)::type, HArg, SubParserTuple>(
return Parser<ID, Args, typename decltype(arg)::type, HArg, SubParsers>(
std::move(this->info_), subParsers);
}

Expand All @@ -223,7 +223,7 @@ class Parser {
tuple_append_t<Args, FlagArg<Name, ID>>,
PArg,
HArg,
SubParserTuple>(std::move(this->info_), subParsers);
SubParsers>(std::move(this->info_), subParsers);
}

template <ArgName Name = "help,h">
Expand All @@ -232,7 +232,7 @@ class Parser {
"Duplicated short name");
static_assert(Argo::SearchIndex<Args, Name>::value == -1,
"Duplicated name");
return Parser<ID, Args, PArg, HelpArg<Name, ID>, SubParserTuple>(
return Parser<ID, Args, PArg, HelpArg<Name, ID>, SubParsers>(
std::move(this->info_), subParsers);
}

Expand All @@ -246,7 +246,7 @@ class Parser {
static_assert(Name.hasValidNameLength(),
"Short name can't be more than one charactor");
this->info_->help = help;
return Parser<ID, Args, PArg, HelpArg<Name, ID>, SubParserTuple>(
return Parser<ID, Args, PArg, HelpArg<Name, ID>, SubParsers>(
std::move(this->info_), subParsers);
}

Expand All @@ -272,12 +272,12 @@ class Parser {

template <ArgName Name>
auto& getParser() {
if constexpr (std::is_same_v<SubParserTuple, std::tuple<>>) {
if constexpr (std::is_same_v<SubParsers, std::tuple<>>) {
static_assert(false, "Parser has no sub parser");
}
static_assert(!(SearchIndex<SubParserTuple, Name>::value == -1),
static_assert(!(SearchIndex<SubParsers, Name>::value == -1),
"Could not find subparser");
return std::get<SearchIndex<SubParserTuple, Name>::value>(subParsers)
return std::get<SearchIndex<SubParsers, Name>::value>(subParsers)
.parser.get();
}

Expand Down
16 changes: 11 additions & 5 deletions Argo/ArgoParserImpl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,13 @@ inline auto splitStringView(std::string_view str,
}

template <ParserID ID, class Args, class PArg, class HArg, class SubParsers>
requires(is_tuple_v<Args> && is_tuple_v<SubParsers>)
auto Parser<ID, Args, PArg, HArg, SubParsers>::resetArgs() -> void {
ValueReset<Args>();
}

template <ParserID ID, class Args, class PArg, class HArg, class SubParsers>
requires(is_tuple_v<Args> && is_tuple_v<SubParsers>)
auto Parser<ID, Args, PArg, HArg, SubParsers>::setArg(
std::string_view key, std::span<std::string_view> val) const -> void {
if constexpr (!std::is_same_v<HArg, void>) {
Expand All @@ -50,6 +52,7 @@ auto Parser<ID, Args, PArg, HArg, SubParsers>::setArg(
}

template <ParserID ID, class Args, class PArg, class HArg, class SubParsers>
requires(is_tuple_v<Args> && is_tuple_v<SubParsers>)
auto Parser<ID, Args, PArg, HArg, SubParsers>::setArg(
std::span<char> key, std::span<std::string_view> val) const -> void {
if constexpr (!std::is_same_v<HArg, void>) {
Expand All @@ -66,6 +69,7 @@ auto Parser<ID, Args, PArg, HArg, SubParsers>::setArg(
}

template <ParserID ID, class Args, class PArg, class HArg, class SubParsers>
requires(is_tuple_v<Args> && is_tuple_v<SubParsers>)
auto Parser<ID, Args, PArg, HArg, SubParsers>::parse(int argc,
char* argv[]) -> void {
if (this->parsed_) [[unlikely]] {
Expand Down Expand Up @@ -210,9 +214,9 @@ struct AnsiEscapeCode {
}
};

auto createUsageSection(const auto& program_name,
[[maybe_unused]] const auto& help_info,
const auto& sub_commands) {
inline auto createUsageSection(const auto& program_name,
[[maybe_unused]] const auto& help_info,
const auto& sub_commands) {
std::string ret;
ret.append(program_name);

Expand Down Expand Up @@ -247,7 +251,8 @@ auto createUsageSection(const auto& program_name,
return ret;
}

auto createSubcommandSection(const auto& ansi, const auto& sub_commands) {
inline auto createSubcommandSection(const auto& ansi,
const auto& sub_commands) {
std::string ret;
std::size_t max_command_length = 0;
for (const auto& command : sub_commands) {
Expand Down Expand Up @@ -282,7 +287,7 @@ auto createSubcommandSection(const auto& ansi, const auto& sub_commands) {
return ret;
}

auto createOptionsSection(const auto& ansi, const auto& help_info) {
inline auto createOptionsSection(const auto& ansi, const auto& help_info) {
std::string ret;
std::size_t max_name_len = 0;
for (const auto& option : help_info) {
Expand Down Expand Up @@ -339,6 +344,7 @@ auto createPositionalArgumentSection(const auto& ansi) {
}

template <ParserID ID, class Args, class PArg, class HArg, class SubParsers>
requires(is_tuple_v<Args> && is_tuple_v<SubParsers>)
auto Parser<ID, Args, PArg, HArg, SubParsers>::formatHelp(bool no_color) const
-> std::string {
std::string ret;
Expand Down
5 changes: 1 addition & 4 deletions Taskfile.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,11 @@ version: '3'
tasks:
cmake:
cmds:
# - cmake -B build -S . -GNinja -DARGO_BENCHMARKS_ENABLE=true
- cmake -B build -S . -GNinja -DARGO_TESTS_ENABLE=true -DCMAKE_INSTALL_PREFIX=/Users/gen/.local
- cmake -B build -S . -GNinja -DARGO_TESTS_ENABLE=true
compile:
cmds:
- cmake --build build
execute:
cmds:
# - ./build/main --arg1=42 --arg2="Hello,World"
- ./build/test-argo-release
# - ./build/bench-parser-release
silent: true
1 change: 0 additions & 1 deletion generator/generate.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import re


base = "./Argo.hh"


Expand Down
44 changes: 26 additions & 18 deletions include/Argo.hh
Original file line number Diff line number Diff line change
Expand Up @@ -1234,6 +1234,7 @@ struct SubParser {
};

template <class SubParsers>
requires(is_tuple_v<SubParsers>)
auto MetaParse(SubParsers sub_parsers, int index, int argc,
char** argv) -> bool {
return std::apply(
Expand All @@ -1247,6 +1248,7 @@ auto MetaParse(SubParsers sub_parsers, int index, int argc,
};

template <class SubParsers>
requires(is_tuple_v<SubParsers>)
constexpr auto ParserIndex(SubParsers sub_parsers, //
std::string_view key) -> std::int64_t {
return std::apply(
Expand Down Expand Up @@ -1295,7 +1297,8 @@ struct ParserInfo {
};

template <ParserID ID = 0, class Args = std::tuple<>, class PArg = void,
class HArg = void, class SubParserTuple = std::tuple<>>
class HArg = void, class SubParsers = std::tuple<>>
requires(is_tuple_v<Args> && is_tuple_v<SubParsers>)
class Parser {
private:
bool parsed_ = false;
Expand Down Expand Up @@ -1326,12 +1329,11 @@ class Parser {
Parser(const Parser&) = delete;
Parser(Parser&&) = delete;

SubParserTuple subParsers;
SubParsers subParsers;

constexpr explicit Parser(SubParserTuple tuple) : subParsers(tuple) {}
constexpr explicit Parser(SubParsers tuple) : subParsers(tuple) {}

constexpr explicit Parser(std::unique_ptr<ParserInfo> info,
SubParserTuple tuple)
constexpr explicit Parser(std::unique_ptr<ParserInfo> info, SubParsers tuple)
: info_(std::move(info)), subParsers(tuple){};

template <class Type, ArgName Name, auto arg1 = Unspecified(),
Expand Down Expand Up @@ -1439,7 +1441,7 @@ class Parser {
tuple_append_t<Args, typename decltype(arg)::type>,
PArg,
HArg,
SubParserTuple>(std::move(this->info_), subParsers);
SubParsers>(std::move(this->info_), subParsers);
}

template <ArgName Name, class Type, auto arg1 = Unspecified(),
Expand All @@ -1450,7 +1452,7 @@ class Parser {
static_assert(Name.shortName == '\0',
"Positional argment cannot have short name");
auto arg = createArg<Type, Name, arg1, arg2>(std::forward<T>(args)...);
return Parser<ID, Args, typename decltype(arg)::type, HArg, SubParserTuple>(
return Parser<ID, Args, typename decltype(arg)::type, HArg, SubParsers>(
std::move(this->info_), subParsers);
}

Expand All @@ -1471,7 +1473,7 @@ class Parser {
tuple_append_t<Args, FlagArg<Name, ID>>,
PArg,
HArg,
SubParserTuple>(std::move(this->info_), subParsers);
SubParsers>(std::move(this->info_), subParsers);
}

template <ArgName Name = "help,h">
Expand All @@ -1480,7 +1482,7 @@ class Parser {
"Duplicated short name");
static_assert(Argo::SearchIndex<Args, Name>::value == -1,
"Duplicated name");
return Parser<ID, Args, PArg, HelpArg<Name, ID>, SubParserTuple>(
return Parser<ID, Args, PArg, HelpArg<Name, ID>, SubParsers>(
std::move(this->info_), subParsers);
}

Expand All @@ -1494,7 +1496,7 @@ class Parser {
static_assert(Name.hasValidNameLength(),
"Short name can't be more than one charactor");
this->info_->help = help;
return Parser<ID, Args, PArg, HelpArg<Name, ID>, SubParserTuple>(
return Parser<ID, Args, PArg, HelpArg<Name, ID>, SubParsers>(
std::move(this->info_), subParsers);
}

Expand All @@ -1520,12 +1522,12 @@ class Parser {

template <ArgName Name>
auto& getParser() {
if constexpr (std::is_same_v<SubParserTuple, std::tuple<>>) {
if constexpr (std::is_same_v<SubParsers, std::tuple<>>) {
static_assert(false, "Parser has no sub parser");
}
static_assert(!(SearchIndex<SubParserTuple, Name>::value == -1),
static_assert(!(SearchIndex<SubParsers, Name>::value == -1),
"Could not find subparser");
return std::get<SearchIndex<SubParserTuple, Name>::value>(subParsers)
return std::get<SearchIndex<SubParsers, Name>::value>(subParsers)
.parser.get();
}

Expand Down Expand Up @@ -1612,11 +1614,13 @@ inline auto splitStringView(std::string_view str,
}

template <ParserID ID, class Args, class PArg, class HArg, class SubParsers>
requires(is_tuple_v<Args> && is_tuple_v<SubParsers>)
auto Parser<ID, Args, PArg, HArg, SubParsers>::resetArgs() -> void {
ValueReset<Args>();
}

template <ParserID ID, class Args, class PArg, class HArg, class SubParsers>
requires(is_tuple_v<Args> && is_tuple_v<SubParsers>)
auto Parser<ID, Args, PArg, HArg, SubParsers>::setArg(
std::string_view key, std::span<std::string_view> val) const -> void {
if constexpr (!std::is_same_v<HArg, void>) {
Expand All @@ -1629,6 +1633,7 @@ auto Parser<ID, Args, PArg, HArg, SubParsers>::setArg(
}

template <ParserID ID, class Args, class PArg, class HArg, class SubParsers>
requires(is_tuple_v<Args> && is_tuple_v<SubParsers>)
auto Parser<ID, Args, PArg, HArg, SubParsers>::setArg(
std::span<char> key, std::span<std::string_view> val) const -> void {
if constexpr (!std::is_same_v<HArg, void>) {
Expand All @@ -1645,6 +1650,7 @@ auto Parser<ID, Args, PArg, HArg, SubParsers>::setArg(
}

template <ParserID ID, class Args, class PArg, class HArg, class SubParsers>
requires(is_tuple_v<Args> && is_tuple_v<SubParsers>)
auto Parser<ID, Args, PArg, HArg, SubParsers>::parse(int argc,
char* argv[]) -> void {
if (this->parsed_) [[unlikely]] {
Expand Down Expand Up @@ -1789,9 +1795,9 @@ struct AnsiEscapeCode {
}
};

auto createUsageSection(const auto& program_name,
[[maybe_unused]] const auto& help_info,
const auto& sub_commands) {
inline auto createUsageSection(const auto& program_name,
[[maybe_unused]] const auto& help_info,
const auto& sub_commands) {
std::string ret;
ret.append(program_name);

Expand Down Expand Up @@ -1826,7 +1832,8 @@ auto createUsageSection(const auto& program_name,
return ret;
}

auto createSubcommandSection(const auto& ansi, const auto& sub_commands) {
inline auto createSubcommandSection(const auto& ansi,
const auto& sub_commands) {
std::string ret;
std::size_t max_command_length = 0;
for (const auto& command : sub_commands) {
Expand Down Expand Up @@ -1861,7 +1868,7 @@ auto createSubcommandSection(const auto& ansi, const auto& sub_commands) {
return ret;
}

auto createOptionsSection(const auto& ansi, const auto& help_info) {
inline auto createOptionsSection(const auto& ansi, const auto& help_info) {
std::string ret;
std::size_t max_name_len = 0;
for (const auto& option : help_info) {
Expand Down Expand Up @@ -1918,6 +1925,7 @@ auto createPositionalArgumentSection(const auto& ansi) {
}

template <ParserID ID, class Args, class PArg, class HArg, class SubParsers>
requires(is_tuple_v<Args> && is_tuple_v<SubParsers>)
auto Parser<ID, Args, PArg, HArg, SubParsers>::formatHelp(bool no_color) const
-> std::string {
std::string ret;
Expand Down
5 changes: 3 additions & 2 deletions tests/ExampleCode.cc
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ import Argo;
#include "TestHelper.h"

TEST(ArgoTest, ExampleCode) {
auto [argc, argv] = createArgcArgv("./main", "--arg1", "42", "--arg3", "Hello,World");
auto [argc, argv] =
createArgcArgv("./main", "--arg1", "42", "--arg3", "Hello,World");

auto parser = Argo::Parser<0>("Program name") //
.addArg<"arg1", int>()
Expand All @@ -22,4 +23,4 @@ TEST(ArgoTest, ExampleCode) {
EXPECT_TRUE((std::is_same_v<decltype(parser.getArg<"arg1">()), int>));
EXPECT_TRUE((std::is_same_v<decltype(parser.getArg<"arg2">()), float>));
EXPECT_TRUE((std::is_same_v<decltype(parser.getArg<"arg3">()), std::string>));
}
};
Loading

0 comments on commit 80254a8

Please sign in to comment.