Skip to content

Commit

Permalink
update g++ flags and formatting
Browse files Browse the repository at this point in the history
  • Loading branch information
Jesse committed Dec 5, 2019
1 parent 29d131b commit 9da44e4
Show file tree
Hide file tree
Showing 4 changed files with 242 additions and 205 deletions.
22 changes: 19 additions & 3 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,16 +1,32 @@
cmake_minimum_required(VERSION 3.2 FATAL_ERROR)
cmake_policy(VERSION 3.2)
option(ARGPARSE_TEST_ENABLE "Build unit tests" ON)

set(ARGPARSE_VERSION "0.0.2")
project(argparse VERSION ${ARGPARSE_VERSION} LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
option(ARGPARSE_TEST_ENABLE "Build unit tests" ON)
option(ARGPARSE_BUILD_EXAMPLE "Build example" ON)
if(UNIX)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -pedantic-errors -Wall -Wextra \
-Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wdisabled-optimization -Wformat=2 \
-Winit-self -Wlogical-op -Wmissing-declarations -Wmissing-include-dirs -Wnoexcept \
-Wold-style-cast -Woverloaded-virtual -Wredundant-decls -Wshadow \
-Wsign-conversion -Wsign-promo -Wstrict-null-sentinel -Wstrict-overflow=5 \
-Wswitch-default -Wundef -Werror -Wno-unused -Winline -Wconversion -Wfloat-equal\
-Weffc++")
endif(UNIX)

enable_testing()

add_library(argparse INTERFACE)
target_include_directories(argparse INTERFACE .)

add_executable(example example.cpp)
target_link_libraries(example PRIVATE argparse)
if(ARGPARSE_BUILD_EXAMPLE)
add_executable(example example.cpp)
target_link_libraries(example PRIVATE argparse)
endif(ARGPARSE_BUILD_EXAMPLE)

if(ARGPARSE_TEST_ENABLE)
add_executable(tests tests.cpp)
Expand Down
34 changes: 19 additions & 15 deletions argparse.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,15 +37,18 @@ class ArgumentParser {
public:
class ArgumentNotFound : public std::runtime_error {
public:
ArgumentNotFound(ArgumentParser::Argument &arg,
ArgumentNotFound(
ArgumentParser::Argument &arg,
std::unordered_map<std::string, std::string> pairs) noexcept
: std::runtime_error(
("Required argument not found: " + arg._name + ((pairs.find(arg._name) == pairs.end())
? "" : " or " + pairs.find(arg._name)->second)).c_str()) {}
: std::runtime_error(("Required argument not found: " + arg._name +
((pairs.find(arg._name) == pairs.end())
? ""
: " or " + pairs.find(arg._name)->second))
.c_str()) {}
};

ArgumentParser(const std::string &desc) : _desc(desc), _help(false) {}
ArgumentParser(const std::string desc, int argc, char *argv[])
ArgumentParser(const std::string desc, int argc, const char *argv[])
: ArgumentParser(desc) {
parse(argc, argv);
}
Expand Down Expand Up @@ -75,7 +78,7 @@ class ArgumentParser {
}
}

void parse(int argc, char *argv[]) {
void parse(int argc, const char *argv[]) {
_bin = argv[0];
if (argc > 1) {
std::string name;
Expand Down Expand Up @@ -178,18 +181,19 @@ class ArgumentParser {
_help = true;
print_help();
}
_ltrim(name, [](int c) { return c != (int)'-'; });
_ltrim(name, [](int c) { return c != static_cast<int>('-'); });
name = _delimit(name);
if (_pairs.find(name) != _pairs.end()) name = _pairs[name];
_variables[name] = arg_parts;
}
static std::string _delimit(const std::string &name) {
return std::string(std::min(name.size(), (size_t)2), '-').append(name);
return std::string(std::min(name.size(), static_cast<size_t>(2)), '-')
.append(name);
}
static std::string _strip(const std::string &name) {
size_t begin = 0;
begin += name.size() > 0 ? name[0] == '-' : 0;
begin += name.size() > 3 ? name[1] == '-' : 0;
begin += name.size() > 0 ? name[0] == '-' : 0u;
begin += name.size() > 3 ? name[1] == '-' : 0u;
return name.substr(begin);
}
static std::string _upper(const std::string &in) {
Expand Down Expand Up @@ -250,11 +254,11 @@ class ArgumentParser {
}

std::string _desc;
std::string _bin;
bool _help;
std::vector<Argument> _arguments;
std::unordered_map<std::string, std::vector<std::string>> _variables;
std::unordered_map<std::string, std::string> _pairs;
std::string _bin{};
bool _help{false};
std::vector<Argument> _arguments{};
std::unordered_map<std::string, std::vector<std::string>> _variables{};
std::unordered_map<std::string, std::string> _pairs{};
};
template <>
inline std::string ArgumentParser::get<std::string>(const std::string &name) {
Expand Down
2 changes: 1 addition & 1 deletion example.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
#include <iostream>
#include <iterator>

int main(int argc, char* argv[]) {
int main(int argc, const char* argv[]) {
// run as: [program name] "0 -c" abc -a 1 -sdfl --flag -v 1 2.7 3 4 9 8.12 87
// [program name] -sdfv 1 -o "C:\Users\User Name\Directory - Name\file.dat"
// "C:\Users\User Name 2\Directory 2 - Name 2\file2.dat"
Expand Down
Loading

0 comments on commit 9da44e4

Please sign in to comment.