Skip to content

Commit 16b734a

Browse files
committed
impl/fix: Replace typetraits with concepts, impl new caster for types from string, add lib exceptions, add some examples, some refactor code
1 parent 303cbb9 commit 16b734a

22 files changed

+975
-678
lines changed

CMakeLists.txt

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,18 @@ cmake_minimum_required(VERSION 3.0)
33
project(SimpleArgsParser)
44

55
set(LIBRARY_NAME "argsparser")
6+
set(EXECUTABLE_OUTPUT_PATH "examples")
67

7-
option(RELEASE_BUILD "Silence all runtime asserts" OFF)
8+
option(BUILD_WITHOUT_ASSERTS "Silence all runtime asserts" OFF)
9+
option(BUILD_EXAMPLES "Build examples of library usage" ON )
810

911
# Build flags
1012
set(CMAKE_CXX_STANDARD 20)
1113
set(CMAKE_C_STANDARD 17)
1214
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -Wall -Werror -Wempty-body -Wredundant-move -pedantic -Wimplicit-fallthrough")
1315
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -Wall -Werror -Wempty-body -pedantic -Wno-nested-anon-types")
1416

15-
if (NO_AUTH_BUILD)
17+
if (BUILD_WITHOUT_ASSERTS)
1618
add_compile_definitions(RELEASE_BUILD)
1719
endif()
1820

@@ -31,11 +33,27 @@ execute_process(
3133
string(REPLACE "\n" ";" SOURCE_DIR_HEADER ${SOURCE_DIR_HEADER})
3234

3335
add_library(${LIBRARY_NAME} STATIC ${LIBRARY_SRC})
34-
3536
include_directories(${SOURCE_DIR_HEADER})
3637

37-
add_executable(basic_usage ${PROJECT_SOURCE_DIR}/examples/basic_usage.cpp)
38-
target_link_libraries(basic_usage ${LIBRARY_NAME})
38+
if (BUILD_EXAMPLES)
39+
file(GLOB_RECURSE APPS_LIST
40+
${CMAKE_CURRENT_SOURCE_DIR}/examples/*.cpp)
41+
42+
foreach(FILE ${APPS_LIST})
43+
string(REPLACE "/" " " FILE_STRINGS ${FILE})
44+
separate_arguments(FILE_STRINGS)
45+
46+
list(GET FILE_STRINGS -1 EXECUTABLE_FILE_NAME)
47+
48+
string(REPLACE "." " " EXECUTABLE_STRINGS ${EXECUTABLE_FILE_NAME})
49+
separate_arguments(EXECUTABLE_STRINGS)
50+
list(GET EXECUTABLE_STRINGS 0 EXECUTABLE_NAME)
51+
52+
add_executable(${EXECUTABLE_NAME} ${FILE})
53+
54+
target_link_libraries(${EXECUTABLE_NAME} ${LIBRARY_NAME})
55+
target_link_libraries(${EXECUTABLE_NAME} ${TARGET_NAME} "-rdynamic")
3956

40-
# add_executable(${CMAKE_CURRENT_SOURCE_DIR}/examples/example.cpp shacke_opts)
41-
# target_link_libraries(shacke_opts ${LIBRARY_NAME})
57+
message("-- Compile example: ${EXECUTABLE_NAME}")
58+
endforeach()
59+
endif()

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
# Simple c++ library args parser
22

3-
...
3+
## Requires C++20

examples/basic_types.cpp

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
#include <iostream>
2+
3+
#include "simple-args-parser.hpp"
4+
5+
template <typename T>
6+
void GetAndPrintValue(const args::Parser &parser, const std::string &name)
7+
{
8+
auto val = parser.GetOptValue<T>(name);
9+
10+
if (val)
11+
{
12+
std::cout << "Option (" << name << ") - value: " << *val << std::endl;
13+
}
14+
else
15+
{
16+
std::cout << "No option (" << name << ")" << std::endl;
17+
}
18+
}
19+
20+
int main(int argc, char **argv)
21+
{
22+
args::Parser args_parser(args::ParserMode::IGNORE_UNKNOWN_ARGUMENTS);
23+
24+
args_parser.SetOpt<int> ({"-i" , "--int" , "--integer" }, args::ArgType::ARGS_REQUIRED, "Int description" );
25+
args_parser.SetOpt<long> ({"-l" , "--long" }, args::ArgType::ARGS_REQUIRED, "Long description" );
26+
args_parser.SetOpt<unsigned int> ({"-ui", "--uint" , "--unsignedinteger"}, args::ArgType::ARGS_REQUIRED, "Unsigned int description" );
27+
args_parser.SetOpt<unsigned long>({"-ul", "--ulong" , "--unsignedlong" }, args::ArgType::ARGS_REQUIRED, "Unsigned long description");
28+
args_parser.SetOpt<double> ({"-d" , "--double" }, args::ArgType::ARGS_REQUIRED, "Double description" );
29+
args_parser.SetOpt<float> ({"-f" , "--float" }, args::ArgType::ARGS_REQUIRED, "Float description" );
30+
args_parser.SetOpt<std::string> ({"-s" , "--string" }, args::ArgType::ARGS_REQUIRED, "String description" );
31+
32+
args_parser.Parse(argc, argv);
33+
34+
GetAndPrintValue<int> (args_parser, "-i");
35+
GetAndPrintValue<long> (args_parser, "-l");
36+
GetAndPrintValue<unsigned int> (args_parser, "-ui");
37+
GetAndPrintValue<unsigned long>(args_parser, "-ul");
38+
GetAndPrintValue<double> (args_parser, "-d");
39+
GetAndPrintValue<float> (args_parser, "-f");
40+
GetAndPrintValue<std::string> (args_parser, "-s");
41+
42+
return 0;
43+
}

examples/basic_usage.cpp

Lines changed: 0 additions & 82 deletions
This file was deleted.

examples/collections.cpp

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
#include <iostream>
2+
3+
#include <set>
4+
#include <stack>
5+
#include <queue>
6+
#include <deque>
7+
#include <list>
8+
#include <vector>
9+
#include <forward_list>
10+
#include <unordered_set>
11+
12+
#include "simple-args-parser.hpp"
13+
14+
/* -- Helpers functions -- */
15+
template <typename T>
16+
void GetAndPrintIterableContainer(const args::Parser &parser, const std::string &name);
17+
18+
template <typename T>
19+
void GetAndPrintStack(const args::Parser &parser, const std::string &name);
20+
21+
template <typename T>
22+
void GetAndPrintDeque(const args::Parser &parser, const std::string &name);
23+
24+
template <typename T>
25+
void GetAndPrintQueue(const args::Parser &parser, const std::string &name);
26+
27+
28+
29+
int main(int argc, char **argv)
30+
{
31+
args::Parser args_parser(args::ParserMode::IGNORE_UNKNOWN_ARGUMENTS);
32+
33+
args_parser.SetOpt<std::stack<float>> ({"--stack"} , args::ArgType::ARGS_OPTIONAL, "Stack of float description" );
34+
args_parser.SetOpt<std::deque<long>> ({"--deque"} , args::ArgType::ARGS_OPTIONAL, "Deque of long description" );
35+
args_parser.SetOpt<std::queue<unsigned int>> ({"--queue"} , args::ArgType::ARGS_OPTIONAL, "Queue of unsigned int description" );
36+
args_parser.SetOpt<std::set<double>> ({"--set"} , args::ArgType::ARGS_OPTIONAL, "Set of double description" );
37+
args_parser.SetOpt<std::forward_list<std::string>> ({"--forwardlist"}, args::ArgType::ARGS_OPTIONAL, "Forward list of sting description" );
38+
args_parser.SetOpt<std::list<int>> ({"--list"} , args::ArgType::ARGS_OPTIONAL, "List of int description" );
39+
args_parser.SetOpt<std::vector<int>> ({"--vector"} , args::ArgType::ARGS_OPTIONAL, "Vector of int description" );
40+
args_parser.SetOpt<std::unordered_set<std::string>>({"--hashset"} , args::ArgType::ARGS_OPTIONAL, "Unordered set of string description");
41+
42+
args_parser.Parse(argc, argv);
43+
44+
GetAndPrintStack<std::stack<float>> (args_parser, "--stack" );
45+
GetAndPrintDeque<std::deque<long>> (args_parser, "--deque" );
46+
GetAndPrintQueue<std::queue<unsigned int>> (args_parser, "--queue" );
47+
GetAndPrintIterableContainer<std::set<double>> (args_parser, "--set" );
48+
GetAndPrintIterableContainer<std::forward_list<std::string>> (args_parser, "--forwardlist");
49+
GetAndPrintIterableContainer<std::list<int>> (args_parser, "--list" );
50+
GetAndPrintIterableContainer<std::vector<int>> (args_parser, "--vector" );
51+
GetAndPrintIterableContainer<std::unordered_set<std::string>>(args_parser, "--hashset" );
52+
53+
return 0;
54+
}
55+
56+
57+
template <typename T>
58+
void GetAndPrintQueue(const args::Parser &parser, const std::string &name)
59+
{
60+
auto val = parser.GetOptValue<T>(name);
61+
62+
if (val)
63+
{
64+
std::cout << "Option (" << name << ") - value:";
65+
66+
while (val->size())
67+
{
68+
std::cout << " " << val->front() << " ";
69+
val->pop();
70+
}
71+
72+
std::cout << std::endl;
73+
}
74+
else
75+
{
76+
std::cout << "No option (" << name << ")" << std::endl;
77+
}
78+
}
79+
80+
template <typename T>
81+
void GetAndPrintDeque(const args::Parser &parser, const std::string &name)
82+
{
83+
auto val = parser.GetOptValue<T>(name);
84+
85+
if (val)
86+
{
87+
std::cout << "Option (" << name << ") - value:";
88+
89+
while (val->size())
90+
{
91+
std::cout << " " << val->front() << " ";
92+
val->pop_front();
93+
}
94+
95+
std::cout << std::endl;
96+
}
97+
else
98+
{
99+
std::cout << "No option (" << name << ")" << std::endl;
100+
}
101+
}
102+
103+
template <typename T>
104+
void GetAndPrintStack(const args::Parser &parser, const std::string &name)
105+
{
106+
auto val = parser.GetOptValue<T>(name);
107+
108+
if (val)
109+
{
110+
std::cout << "Option (" << name << ") - value:";
111+
112+
while (val->size())
113+
{
114+
std::cout << " " << val->top() << " ";
115+
val->pop();
116+
}
117+
118+
std::cout << std::endl;
119+
}
120+
else
121+
{
122+
std::cout << "No option (" << name << ")" << std::endl;
123+
}
124+
}
125+
126+
template <typename T>
127+
void GetAndPrintIterableContainer(const args::Parser &parser, const std::string &name)
128+
{
129+
auto val = parser.GetOptValue<T>(name);
130+
131+
if (val)
132+
{
133+
std::cout << "Option (" << name << ") - value:";
134+
135+
for (auto &element : *val)
136+
{
137+
std::cout << " " << element << " ";
138+
}
139+
140+
std::cout << std::endl;
141+
}
142+
else
143+
{
144+
std::cout << "No option (" << name << ")" << std::endl;
145+
}
146+
}

examples/error_get_option.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#include <iostream>
2+
3+
#include "simple-args-parser.hpp"
4+
5+
int main(int argc, char **argv)
6+
{
7+
args::Parser args_parser(args::ParserMode::IGNORE_UNKNOWN_ARGUMENTS);
8+
9+
args_parser.SetOpt<int>({"-i", "--int", "--integer"}, args::ArgType::ARGS_REQUIRED, "Int description");
10+
11+
args_parser.Parse(argc, argv);
12+
13+
try
14+
{
15+
auto val = args_parser.GetOptValue<double>("-i");
16+
std::cout << *val << std::endl;
17+
}
18+
catch(const args::TypeError &e)
19+
{
20+
std::cout << "Handle type error: " << e.what() << std::endl;
21+
}
22+
23+
return 0;
24+
}

0 commit comments

Comments
 (0)