Updated version of Clara (should fix Windows compile issues)

- embedded using new embed script
This commit is contained in:
Phil Nash 2017-06-20 18:03:37 +01:00
parent ee0defb939
commit da5964af78
5 changed files with 1376 additions and 42 deletions

View file

@ -4,23 +4,40 @@
#ifndef CATCH_CLARA_HPP_INCLUDED
#define CATCH_CLARA_HPP_INCLUDED
#ifndef CATCH_CLARA_CONFIG_CONSOLE_WIDTH
#define CATCH_CLARA_CONFIG_CONSOLE_WIDTH 80
#endif
// ----------- #included from clara_textflow.hpp -----------
// TextFlowCpp
//
// A single-header library for wrapping and laying out basic text, by Phil Nash
//
// This work is licensed under the BSD 2-Clause license.
// See the accompanying LICENSE file, or the one at https://opensource.org/licenses/BSD-2-Clause
//
// This project is hosted at https://github.com/philsquared/textflowcpp
#ifndef CATCH_CLARA_TEXTFLOW_HPP_INCLUDED
#define CATCH_CLARA_TEXTFLOW_HPP_INCLUDED
#include <cassert>
#include <ostream>
#include <sstream>
#include <vector>
#include <memory>
#include <set>
#include <algorithm>
#ifndef CLARA_CONFIG_CONSOLE_WIDTH
#define CLARA_CONFIG_CONSOLE_WIDTH 80
#ifndef CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH
#define CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH
#endif
namespace Catch {
namespace clara {
// Included from TextFlow.hpp
namespace TextFlow {
namespace Catch { namespace clara { namespace TextFlow
{
inline auto isWhitespace( char c ) -> bool {
static std::string chars = " \t\n\r";
@ -39,7 +56,7 @@ namespace TextFlow {
class Column {
std::vector<std::string> m_strings;
size_t m_width = CLARA_CONFIG_CONSOLE_WIDTH;
size_t m_width = CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH;
size_t m_indent = 0;
size_t m_initialIndent = std::string::npos;
@ -51,12 +68,12 @@ namespace TextFlow {
size_t m_stringIndex = 0;
size_t m_pos = 0;
size_t m_len;
size_t m_len = 0;
bool m_suffix = false;
iterator( Column const& column, size_t stringIndex )
: m_column( column ),
m_stringIndex( stringIndex )
: m_column( column ),
m_stringIndex( stringIndex )
{}
auto line() const -> std::string const& { return m_column.m_strings[m_stringIndex]; }
@ -143,9 +160,9 @@ namespace TextFlow {
auto operator ==( iterator const& other ) const -> bool {
return
m_pos == other.m_pos &&
m_stringIndex == other.m_stringIndex &&
&m_column == &other.m_column;
m_pos == other.m_pos &&
m_stringIndex == other.m_stringIndex &&
&m_column == &other.m_column;
}
auto operator !=( iterator const& other ) const -> bool {
return !operator==( other );
@ -171,7 +188,7 @@ namespace TextFlow {
auto width() const -> size_t { return m_width; }
auto begin() const -> iterator { return iterator( *this ); }
auto end() const -> iterator { return iterator( *this, m_strings.size() ); }
auto end() const -> iterator { return { *this, m_strings.size() }; }
inline friend std::ostream& operator << ( std::ostream& os, Column const& col ) {
bool first = true;
@ -197,7 +214,7 @@ namespace TextFlow {
class Spacer : public Column {
public:
Spacer( size_t spaceWidth ) : Column( "" ) {
explicit Spacer( size_t spaceWidth ) : Column( "" ) {
width( spaceWidth );
}
};
@ -216,8 +233,8 @@ namespace TextFlow {
size_t m_activeIterators;
iterator( Columns const& columns, EndTag )
: m_columns( columns.m_columns ),
m_activeIterators( 0 )
: m_columns( columns.m_columns ),
m_activeIterators( 0 )
{
m_iterators.reserve( m_columns.size() );
@ -226,9 +243,9 @@ namespace TextFlow {
}
public:
iterator( Columns const& columns )
: m_columns( columns.m_columns ),
m_activeIterators( m_columns.size() )
explicit iterator( Columns const& columns )
: m_columns( columns.m_columns ),
m_activeIterators( m_columns.size() )
{
m_iterators.reserve( m_columns.size() );
@ -277,7 +294,7 @@ namespace TextFlow {
using const_iterator = iterator;
auto begin() const -> iterator { return iterator( *this ); }
auto end() const -> iterator { return iterator( *this, iterator::EndTag() ); }
auto end() const -> iterator { return { *this, iterator::EndTag() }; }
auto operator += ( Column const& col ) -> Columns& {
m_columns.push_back( col );
@ -315,9 +332,19 @@ namespace TextFlow {
cols += other;
return cols;
}
}}} // namespace Catch::clara::TextFlow
} // namespace TextFlow
#endif // CATCH_CLARA_TEXTFLOW_HPP_INCLUDED
// ----------- end of #include from clara_textflow.hpp -----------
// ........... back in clara.hpp
#include <memory>
#include <set>
#include <algorithm>
namespace Catch { namespace clara {
namespace detail {
// Traits for extracting arg and return type of lambdas (for single argument lambdas)
@ -475,8 +502,7 @@ namespace detail {
new(&m_value) T(other.m_value);
}
ResultValueBase(Type type, T const &value)
: ResultBase(Ok) {
ResultValueBase(Type, T const &value) : ResultBase(Ok) {
new(&m_value) T(value);
}
@ -600,10 +626,9 @@ namespace detail {
target = source;
return ParserResult::ok(ParseResultType::Matched);
}
inline auto convertInto(std::string const &source, bool &target) -> ParserResult {
std::string srcLC = source;
std::transform(srcLC.begin(), srcLC.end(), srcLC.begin(), ::tolower);
std::transform(srcLC.begin(), srcLC.end(), srcLC.begin(), [](char c) { return static_cast<char>( ::tolower(c) ); } );
if (srcLC == "y" || srcLC == "1" || srcLC == "true" || srcLC == "yes" || srcLC == "on")
target = true;
else if (srcLC == "n" || srcLC == "0" || srcLC == "false" || srcLC == "no" || srcLC == "off")
@ -869,7 +894,7 @@ namespace detail {
public:
using ParserRefImpl::ParserRefImpl;
auto parse( std::string const&, TokenStream const &tokens ) const -> InternalParseResult override {
auto parse(std::string const &, TokenStream const &tokens) const -> InternalParseResult override {
auto validationResult = validate();
if (!validationResult)
return InternalParseResult(validationResult);
@ -941,10 +966,10 @@ namespace detail {
using ParserBase::parse;
auto parse( std::string const& exeName, TokenStream const &tokens ) const -> InternalParseResult override {
auto result = validate();
if (!result)
return InternalParseResult(result);
auto parse( std::string const&, TokenStream const &tokens ) const -> InternalParseResult override {
auto validationResult = validate();
if (!validationResult)
return InternalParseResult(validationResult);
auto remainingTokens = tokens;
if (remainingTokens && remainingTokens->type == TokenType::Option) {
@ -1069,6 +1094,7 @@ namespace detail {
}
auto rows = getHelpColumns();
size_t consoleWidth = CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH;
size_t optWidth = 0;
for (auto const &cols : rows)
optWidth = std::max(optWidth, cols.left.size() + 2);
@ -1077,7 +1103,7 @@ namespace detail {
auto row =
TextFlow::Column(cols.left).width(optWidth).indent(2) +
TextFlow::Spacer(4) +
TextFlow::Column(cols.right).width(73 - optWidth);
TextFlow::Column(cols.right).width(consoleWidth - 7 - optWidth);
os << row << std::endl;
}
}
@ -1131,7 +1157,7 @@ namespace detail {
auto result = InternalParseResult::ok(ParseState(ParseResultType::NoMatch, tokens));
while (result.value().remainingTokens()) {
int remainingTokenCount = result.value().remainingTokens().count();
auto remainingTokenCount = result.value().remainingTokens().count();
for (auto parser : allParsers) {
result = parser->parse( exeName, result.value().remainingTokens() );
if (!result || result.value().type() != ParseResultType::NoMatch) {
@ -1183,7 +1209,7 @@ using detail::ParseResultType;
using detail::ParserResult;
} // namespace clara
} // namespace Catch
}} // namespace Catch::clara
#endif // CATCH_CLARA_HPP_INCLUDED