Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/jarro2783/cxxopts.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Hillmich <hillmich@users.noreply.github.com>2022-09-25 23:57:05 +0300
committerGitHub <noreply@github.com>2022-09-25 23:57:05 +0300
commitd046fe0ad6acab5dbe0dcbc9457cad8fada8b288 (patch)
treecb140c7096b842301ede6ba3436b77c2cf416381
parent82ac0838864fba7b65e464ade1fd53e400af1e63 (diff)
Extend CI and small fixes (#370)
* Extend CI to support Windows and MacOS. * Minor fixes to types.
-rw-r--r--.github/workflows/cmake.yml79
-rw-r--r--include/cxxopts.hpp65
2 files changed, 83 insertions, 61 deletions
diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml
index 3589fcb..a2a9063 100644
--- a/.github/workflows/cmake.yml
+++ b/.github/workflows/cmake.yml
@@ -2,43 +2,70 @@ name: CMake
on:
push:
- branches: [ master ]
+ branches: [ master, main ]
pull_request:
- branches: [ master ]
+ branches: [ master, main ]
workflow_dispatch:
env:
# Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.)
BUILD_TYPE: Release
+
+defaults:
+ run:
+ shell: bash
+
jobs:
- build:
- # The CMake configure and build commands are platform agnostic and should work equally
- # well on Windows or Mac. You can convert this to a matrix build if you need
- # cross-platform coverage.
- # See: https://docs.github.com/en/free-pro-team@latest/actions/learn-github-actions/managing-complex-workflows#using-a-build-matrix
+ build-ubuntu:
+ strategy:
+ matrix:
+ os: [ ubuntu-18.04, ubuntu-20.04, ubuntu-22.04 ]
+ compiler: [ g++-9, g++-10, clang++ ]
+ include:
+ - os: ubuntu-18.04
+ compiler: g++-7
+ name: Build and Test on Ubuntu
runs-on: ${{matrix.os}}
+ steps:
+ - uses: actions/checkout@v3
+ - name: Configure CMake
+ run: cmake -S "${{github.workspace}}" -B "${{github.workspace}}/build" -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_CXX_COMPILER=${{matrix.compiler}}
+ - name: Build
+ run: cmake --build "${{github.workspace}}/build" --config $BUILD_TYPE
+ - name: Test
+ working-directory: ${{github.workspace}}/build/test
+ run: ctest -C $BUILD_TYPE --output-on-failure
+ build-macos:
+ name: Build and Test on MacOS
strategy:
matrix:
- os: [ubuntu-18.04]
- compiler: [g++-7, g++-9, g++-10, clang++]
-
+ os: [ macos-11, macos-12 ]
+ runs-on: ${{matrix.os}}
steps:
- - uses: actions/checkout@v2
-
- - name: Configure CMake
- # Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make.
- # See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type
- run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_CXX_COMPILER=${{matrix.compiler}}
+ - uses: actions/checkout@v3
+ - name: Configure CMake
+ run: cmake -S "${{github.workspace}}" -B "${{github.workspace}}/build" -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
+ - name: Show compile commands
+ run: cat build/compile_commands.json
+ - name: Build
+ run: cmake --build "${{github.workspace}}/build" --config $BUILD_TYPE
+ - name: Test
+ working-directory: ${{github.workspace}}/build/test
+ shell: bash
+ run: ctest -C $BUILD_TYPE --output-on-failure
- - name: Build
- # Build your program with the given configuration
- run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}}
-
- - name: Test
- working-directory: ${{github.workspace}}/build
- # Execute tests defined by the CMake configuration.
- # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail
- run: ctest -C ${{env.BUILD_TYPE}}
-
+ build-windows:
+ name: Build and Test on Windows
+ runs-on: windows-latest
+ steps:
+ - uses: actions/checkout@v3
+ - uses: ilammy/msvc-dev-cmd@v1
+ - name: Configure CMake
+ run: cmake -S "${{github.workspace}}" -B "${{github.workspace}}/build" -DCMAKE_BUILD_TYPE=$BUILD_TYPE -T "ClangCl"
+ - name: Build
+ run: cmake --build "${{github.workspace}}/build" --config $BUILD_TYPE
+ - name: Test
+ working-directory: ${{github.workspace}}/build/test
+ run: cd $BUILD_TYPE && ./link_test && ./options_test
diff --git a/include/cxxopts.hpp b/include/cxxopts.hpp
index b411bcc..4ed4892 100644
--- a/include/cxxopts.hpp
+++ b/include/cxxopts.hpp
@@ -27,13 +27,10 @@ THE SOFTWARE.
#ifndef CXXOPTS_HPP_INCLUDED
#define CXXOPTS_HPP_INCLUDED
-#include <cassert>
-#include <cctype>
#include <cstring>
#include <exception>
#include <limits>
-#include <list>
-#include <locale>
+#include <initializer_list>
#include <map>
#include <memory>
#include <sstream>
@@ -196,9 +193,9 @@ stringAppend(String&s, String a)
inline
String&
-stringAppend(String& s, size_t n, UChar32 c)
+stringAppend(String& s, std::size_t n, UChar32 c)
{
- for (size_t i = 0; i != n; ++i)
+ for (std::size_t i = 0; i != n; ++i)
{
s.append(c);
}
@@ -220,7 +217,7 @@ stringAppend(String& s, Iterator begin, Iterator end)
}
inline
-size_t
+std::size_t
stringLength(const String& s)
{
return s.length();
@@ -278,7 +275,7 @@ toLocalString(T&& t)
}
inline
-size_t
+std::size_t
stringLength(const String& s)
{
return s.length();
@@ -293,7 +290,7 @@ stringAppend(String&s, const String& a)
inline
String&
-stringAppend(String& s, size_t n, char c)
+stringAppend(String& s, std::size_t n, char c)
{
return s.append(n, c);
}
@@ -682,7 +679,7 @@ inline OptionNames split_option_names(const std::string &text)
"abcdefghijklmnopqrstuvwxyz"
"0123456789"
"_-";
- if (!std::isalnum(text[token_start_pos]) ||
+ if (!std::isalnum(text[token_start_pos], std::locale::classic()) ||
text.find_first_not_of(option_name_valid_chars, token_start_pos) < next_delimiter_pos) {
throw_or_mimic<exceptions::invalid_option_format>(text);
}
@@ -701,11 +698,11 @@ inline ArguDesc ParseArgument(const char *arg, bool &matched)
if (strncmp(pdata, "--", 2) == 0)
{
pdata += 2;
- if (isalnum(*pdata))
+ if (isalnum(*pdata, std::locale::classic()))
{
argu_desc.arg_name.push_back(*pdata);
pdata += 1;
- while (isalnum(*pdata) || *pdata == '-' || *pdata == '_')
+ while (isalnum(*pdata, std::locale::classic()) || *pdata == '-' || *pdata == '_')
{
argu_desc.arg_name.push_back(*pdata);
pdata += 1;
@@ -733,7 +730,7 @@ inline ArguDesc ParseArgument(const char *arg, bool &matched)
{
pdata += 1;
argu_desc.grouping = true;
- while (isalnum(*pdata))
+ while (isalnum(*pdata, std::locale::classic()))
{
argu_desc.arg_name.push_back(*pdata);
pdata += 1;
@@ -1356,7 +1353,7 @@ class OptionDetails
return m_long;
}
- size_t
+ std::size_t
hash() const
{
return m_hash;
@@ -1369,7 +1366,7 @@ class OptionDetails
std::shared_ptr<const Value> m_value{};
int m_count;
- size_t m_hash{};
+ std::size_t m_hash{};
};
struct HelpOptionDetails
@@ -1430,7 +1427,7 @@ CXXOPTS_IGNORE_WARNING("-Wnull-dereference")
#endif
CXXOPTS_NODISCARD
- size_t
+ std::size_t
count() const noexcept
{
return m_count;
@@ -1475,7 +1472,7 @@ CXXOPTS_DIAGNOSTIC_POP
// Holding this pointer is safe, since OptionValue's only exist in key-value pairs,
// where the key has the string we point to.
std::shared_ptr<Value> m_value{};
- size_t m_count = 0;
+ std::size_t m_count = 0;
bool m_default = false;
};
@@ -1516,8 +1513,8 @@ class KeyValue
std::string m_value;
};
-using ParsedHashMap = std::unordered_map<size_t, OptionValue>;
-using NameHashMap = std::unordered_map<std::string, size_t>;
+using ParsedHashMap = std::unordered_map<std::size_t, OptionValue>;
+using NameHashMap = std::unordered_map<std::string, std::size_t>;
class ParseResult
{
@@ -1611,7 +1608,7 @@ class ParseResult
return Iterator(this, true);
}
- size_t
+ std::size_t
count(const std::string& o) const
{
auto iter = m_keys.find(o);
@@ -1821,7 +1818,7 @@ class Options
}
Options&
- set_width(size_t width)
+ set_width(std::size_t width)
{
m_width = width;
return *this;
@@ -1939,7 +1936,7 @@ class Options
std::string m_positional_help{};
bool m_show_positional;
bool m_allow_unrecognised;
- size_t m_width;
+ std::size_t m_width;
bool m_tab_expansion;
std::shared_ptr<OptionMap> m_options;
@@ -1975,8 +1972,8 @@ class OptionAdder
};
namespace {
-constexpr size_t OPTION_LONGEST = 30;
-constexpr size_t OPTION_DESC_GAP = 2;
+constexpr std::size_t OPTION_LONGEST = 30;
+constexpr std::size_t OPTION_DESC_GAP = 2;
String
format_option
@@ -2028,8 +2025,8 @@ String
format_description
(
const HelpOptionDetails& o,
- size_t start,
- size_t allowed,
+ std::size_t start,
+ std::size_t allowed,
bool tab_expansion
)
{
@@ -2052,7 +2049,7 @@ format_description
if (tab_expansion)
{
String desc2;
- auto size = size_t{ 0 };
+ auto size = std::size_t{ 0 };
for (auto c = std::begin(desc); c != std::end(desc); ++c)
{
if (*c == '\n')
@@ -2082,7 +2079,7 @@ format_description
auto startLine = current;
auto lastSpace = current;
- auto size = size_t{};
+ auto size = std::size_t{};
bool appendNewLine;
bool onlyWhiteSpace = true;
@@ -2090,13 +2087,11 @@ format_description
while (current != std::end(desc))
{
appendNewLine = false;
-
- if (std::isblank(*previous, std::locale::classic()))
+ if (*previous == ' ' || *previous == '\t')
{
lastSpace = current;
}
-
- if (!std::isblank(*current, std::locale::classic()))
+ if (*current != ' ' && *current != '\t')
{
onlyWhiteSpace = false;
}
@@ -2622,7 +2617,7 @@ Options::help_one_group(const std::string& g) const
OptionHelp format;
- size_t longest = 0;
+ std::size_t longest = 0;
String result;
@@ -2647,7 +2642,7 @@ Options::help_one_group(const std::string& g) const
longest = (std::min)(longest, OPTION_LONGEST);
//widest allowed description -- min 10 chars for helptext/line
- size_t allowed = 10;
+ std::size_t allowed = 10;
if (m_width > allowed + longest + OPTION_DESC_GAP)
{
allowed = m_width - longest - OPTION_DESC_GAP;
@@ -2694,7 +2689,7 @@ Options::generate_group_help
const std::vector<std::string>& print_groups
) const
{
- for (size_t i = 0; i != print_groups.size(); ++i)
+ for (std::size_t i = 0; i != print_groups.size(); ++i)
{
const String& group_help_text = help_one_group(print_groups[i]);
if (empty(group_help_text))