diff --git a/README.md b/README.md index a621a74c..bdfdc7f8 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![catch logo](catch-logo-small.png) -*v1.0 build 26 (master branch)* +*v1.0 build 27 (master branch)* Build status (on Travis CI) [![Build Status](https://travis-ci.org/philsquared/Catch.png)](https://travis-ci.org/philsquared/Catch) diff --git a/include/internal/catch_clara.h b/include/internal/catch_clara.h index d9ecbed1..a07bb624 100644 --- a/include/internal/catch_clara.h +++ b/include/internal/catch_clara.h @@ -13,8 +13,8 @@ // Declare Clara inside the Catch namespace -#define CLICHE_CLARA_OUTER_NAMESPACE Catch +#define STITCH_CLARA_OUTER_NAMESPACE Catch #include "clara.h" -#undef CLICHE_CLARA_OUTER_NAMESPACE +#undef STITCH_CLARA_OUTER_NAMESPACE #endif // TWOBLUECUBES_CATCH_CLARA_H_INCLUDED diff --git a/include/internal/catch_option.hpp b/include/internal/catch_option.hpp index 81178233..bf3bce3d 100644 --- a/include/internal/catch_option.hpp +++ b/include/internal/catch_option.hpp @@ -29,9 +29,11 @@ namespace Catch { } Option& operator= ( Option const& _other ) { - reset(); - if( _other ) - nullableValue = new( storage ) T( *_other ); + if( &_other != this ) { + reset(); + if( _other ) + nullableValue = new( storage ) T( *_other ); + } return *this; } Option& operator = ( T const& _value ) { diff --git a/include/internal/catch_version.hpp b/include/internal/catch_version.hpp index ae5ece83..d28d4664 100644 --- a/include/internal/catch_version.hpp +++ b/include/internal/catch_version.hpp @@ -14,7 +14,7 @@ namespace Catch { // These numbers are maintained by a script template - const T LibraryVersionInfo::value( 1, 0, 26, "master" ); + const T LibraryVersionInfo::value( 1, 0, 27, "master" ); } #endif // TWOBLUECUBES_CATCH_VERSION_HPP_INCLUDED diff --git a/include/internal/clara.h b/include/internal/clara.h index 5b79e04c..54939c6c 100644 --- a/include/internal/clara.h +++ b/include/internal/clara.h @@ -7,33 +7,178 @@ */ // Only use header guard if we are not using an outer namespace -#ifndef CLICHE_CLARA_OUTER_NAMESPACE -# ifdef TWOBLUECUBES_CLARA_H_INCLUDED -# ifndef TWOBLUECUBES_CLARA_H_ALREADY_INCLUDED -# define TWOBLUECUBES_CLARA_H_ALREADY_INCLUDED -# endif -# else -# define TWOBLUECUBES_CLARA_H_INCLUDED -# endif -#endif -#ifndef TWOBLUECUBES_CLARA_H_ALREADY_INCLUDED +#if !defined(TWOBLUECUBES_CLARA_H_INCLUDED) || defined(STITCH_CLARA_OUTER_NAMESPACE) +#ifndef STITCH_CLARA_OUTER_NAMESPACE +#define TWOBLUECUBES_CLARA_H_INCLUDED -#ifndef CLICHE_CLARA_OUTER_NAMESPACE -#define CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE Clara -#include "tbc_text_format.h" -#undef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE +#define STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE Clara + +// ----------- #included from tbc_text_format.h ----------- + +/* + * Created by Phil on 18/4/2013. + * Copyright 2013 Two Blue Cubes Ltd. All rights reserved. + * + * Distributed under the Boost Software License, Version 1.0. (See accompanying + * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + */ +// Only use header guard if we are not using an outer namespace +#if !defined(TBC_TEXT_FORMAT_H_INCLUDED) || defined(STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE) +#ifndef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE +#define TBC_TEXT_FORMAT_H_INCLUDED #endif #include #include +#include + +// Use optional outer namespace +#ifdef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE +namespace STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE { +#endif + +namespace Tbc { + +#ifdef TBC_TEXT_FORMAT_CONSOLE_WIDTH + const unsigned int consoleWidth = TBC_TEXT_FORMAT_CONSOLE_WIDTH; +#else + const unsigned int consoleWidth = 80; +#endif + + struct TextAttributes { + TextAttributes() + : initialIndent( std::string::npos ), + indent( 0 ), + width( consoleWidth-1 ), + tabChar( '\t' ) + {} + + TextAttributes& setInitialIndent( std::size_t _value ) { initialIndent = _value; return *this; } + TextAttributes& setIndent( std::size_t _value ) { indent = _value; return *this; } + TextAttributes& setWidth( std::size_t _value ) { width = _value; return *this; } + TextAttributes& setTabChar( char _value ) { tabChar = _value; return *this; } + + std::size_t initialIndent; // indent of first line, or npos + std::size_t indent; // indent of subsequent lines, or all if initialIndent is npos + std::size_t width; // maximum width of text, including indent. Longer text will wrap + char tabChar; // If this char is seen the indent is changed to current pos + }; + + class Text { + public: + Text( std::string const& _str, TextAttributes const& _attr = TextAttributes() ) + : attr( _attr ) + { + std::string wrappableChars = " [({.,/|\\-"; + std::size_t indent = _attr.initialIndent != std::string::npos + ? _attr.initialIndent + : _attr.indent; + std::string remainder = _str; + + while( !remainder.empty() ) { + if( lines.size() >= 1000 ) { + lines.push_back( "... message truncated due to excessive size" ); + return; + } + std::size_t tabPos = std::string::npos; + std::size_t width = (std::min)( remainder.size(), _attr.width - indent ); + std::size_t pos = remainder.find_first_of( '\n' ); + if( pos <= width ) { + width = pos; + } + pos = remainder.find_last_of( _attr.tabChar, width ); + if( pos != std::string::npos ) { + tabPos = pos; + if( remainder[width] == '\n' ) + width--; + remainder = remainder.substr( 0, tabPos ) + remainder.substr( tabPos+1 ); + } + + if( width == remainder.size() ) { + spliceLine( indent, remainder, width ); + } + else if( remainder[width] == '\n' ) { + spliceLine( indent, remainder, width ); + if( width <= 1 || remainder.size() != 1 ) + remainder = remainder.substr( 1 ); + indent = _attr.indent; + } + else { + pos = remainder.find_last_of( wrappableChars, width ); + if( pos != std::string::npos && pos > 0 ) { + spliceLine( indent, remainder, pos ); + if( remainder[0] == ' ' ) + remainder = remainder.substr( 1 ); + } + else { + spliceLine( indent, remainder, width-1 ); + lines.back() += "-"; + } + if( lines.size() == 1 ) + indent = _attr.indent; + if( tabPos != std::string::npos ) + indent += tabPos; + } + } + } + + void spliceLine( std::size_t _indent, std::string& _remainder, std::size_t _pos ) { + lines.push_back( std::string( _indent, ' ' ) + _remainder.substr( 0, _pos ) ); + _remainder = _remainder.substr( _pos ); + } + + typedef std::vector::const_iterator const_iterator; + + const_iterator begin() const { return lines.begin(); } + const_iterator end() const { return lines.end(); } + std::string const& last() const { return lines.back(); } + std::size_t size() const { return lines.size(); } + std::string const& operator[]( std::size_t _index ) const { return lines[_index]; } + std::string toString() const { + std::ostringstream oss; + oss << *this; + return oss.str(); + } + + inline friend std::ostream& operator << ( std::ostream& _stream, Text const& _text ) { + for( Text::const_iterator it = _text.begin(), itEnd = _text.end(); + it != itEnd; ++it ) { + if( it != _text.begin() ) + _stream << "\n"; + _stream << *it; + } + return _stream; + } + + private: + std::string str; + TextAttributes attr; + std::vector lines; + }; + +} // end namespace Tbc + +#ifdef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE +} // end outer namespace +#endif + +#endif // TBC_TEXT_FORMAT_H_INCLUDED + +// ----------- end of #include from tbc_text_format.h ----------- +// ........... back in /Users/philnash/Dev/OSS/Clara/srcs/clara.h + +#endif + +#undef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE + #include #include #include #include // Use optional outer namespace -#ifdef CLICHE_CLARA_OUTER_NAMESPACE -namespace CLICHE_CLARA_OUTER_NAMESPACE { +#ifdef STITCH_CLARA_OUTER_NAMESPACE +namespace STITCH_CLARA_OUTER_NAMESPACE { #endif namespace Clara { @@ -310,7 +455,7 @@ namespace Clara { } void validate() const { if( boundField.takesArg() && !takesArg() ) - throw std::logic_error( dbgName() + " must specify an arg name" ); + throw std::logic_error( "command line argument '" + dbgName() + "' must specify a hint" ); } std::string commands() const { std::ostringstream oss; @@ -361,8 +506,10 @@ namespace Clara { { other.m_cl = NULL; } - ~ArgBinder() { - if( m_cl ) { + // !TBD: Need to include workarounds to be able to declare this + // destructor as able to throw exceptions + ~ArgBinder() /* noexcept(false) */ { + if( m_cl && !std::uncaught_exception() ) { m_arg.validate(); if( m_arg.isFixedPositional() ) { m_cl->m_positionalArgs.insert( std::make_pair( m_arg.position, m_arg ) ); @@ -507,6 +654,12 @@ namespace Clara { return oss.str(); } + ConfigT parseInto( int argc, char const * const * argv ) const { + ConfigT config; + parseInto( argc, argv, config ); + return config; + } + std::vector parseInto( int argc, char const * const * argv, ConfigT& config ) const { std::string processName = argv[0]; std::size_t lastSlash = processName.find_last_of( "/\\" ); @@ -617,9 +770,8 @@ namespace Clara { } // end namespace Clara -#ifdef CLICHE_CLARA_OUTER_NAMESPACE +#ifdef STITCH_CLARA_OUTER_NAMESPACE } // end outer namespace #endif -#endif // TWOBLUECUBES_CLARA_H_ALREADY_INCLUDED - +#endif // TWOBLUECUBES_CLARA_H_INCLUDED diff --git a/scripts/generateSingleHeader.py b/scripts/generateSingleHeader.py index 82c85296..bce797ad 100644 --- a/scripts/generateSingleHeader.py +++ b/scripts/generateSingleHeader.py @@ -29,7 +29,7 @@ for arg in sys.argv[1:]: arg = string.lower(arg) if arg == "nobump": bumpVersion = False - print "Not bumping version number" + print( "Not bumping version number" ) elif arg == "noimpl": includeImpl = False bumpVersion = False diff --git a/single_include/catch.hpp b/single_include/catch.hpp index d828d7ae..caadadf5 100644 --- a/single_include/catch.hpp +++ b/single_include/catch.hpp @@ -1,6 +1,6 @@ /* - * CATCH v1.0 build 26 (master branch) - * Generated: 2014-02-21 12:44:35.538000 + * CATCH v1.0 build 27 (master branch) + * Generated: 2014-03-05 09:23:26.023000 * ---------------------------------------------------------- * This file has been merged from multiple headers. Please don't edit it directly * Copyright (c) 2012 Two Blue Cubes Ltd. All rights reserved. @@ -958,7 +958,7 @@ struct CollectConsoleOutput }; \ } -//#undef CATCH_CONFIG_VARIADIC_MACROS +// #undef CATCH_CONFIG_VARIADIC_MACROS #ifdef CATCH_CONFIG_VARIADIC_MACROS @@ -2832,9 +2832,11 @@ namespace Catch { } Option& operator= ( Option const& _other ) { - reset(); - if( _other ) - nullableValue = new( storage ) T( *_other ); + if( &_other != this ) { + reset(); + if( _other ) + nullableValue = new( storage ) T( *_other ); + } return *this; } Option& operator = ( T const& _value ) { @@ -3080,9 +3082,6 @@ namespace Catch } -//#include "catch_interfaces_registry_hub.h" -//#include "catch_interfaces_config.h" - #include namespace Catch { @@ -4330,42 +4329,31 @@ namespace Catch { #define CLARA_CONFIG_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH // Declare Clara inside the Catch namespace -#define CLICHE_CLARA_OUTER_NAMESPACE Catch +#define STITCH_CLARA_OUTER_NAMESPACE Catch // #included from: clara.h // Only use header guard if we are not using an outer namespace -#ifndef CLICHE_CLARA_OUTER_NAMESPACE -# ifdef TWOBLUECUBES_CLARA_H_INCLUDED -# ifndef TWOBLUECUBES_CLARA_H_ALREADY_INCLUDED -# define TWOBLUECUBES_CLARA_H_ALREADY_INCLUDED -# endif -# else -# define TWOBLUECUBES_CLARA_H_INCLUDED -# endif -#endif -#ifndef TWOBLUECUBES_CLARA_H_ALREADY_INCLUDED +#if !defined(TWOBLUECUBES_CLARA_H_INCLUDED) || defined(STITCH_CLARA_OUTER_NAMESPACE) +#ifndef STITCH_CLARA_OUTER_NAMESPACE +#define TWOBLUECUBES_CLARA_H_INCLUDED + +#define STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE Clara + +// ----------- #included from tbc_text_format.h ----------- -#ifndef CLICHE_CLARA_OUTER_NAMESPACE -#define CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE Clara -// #included from: tbc_text_format.h // Only use header guard if we are not using an outer namespace -#ifndef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE -# ifdef TWOBLUECUBES_TEXT_FORMAT_H_INCLUDED -# ifndef TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED -# define TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED -# endif -# else -# define TWOBLUECUBES_TEXT_FORMAT_H_INCLUDED -# endif +#if !defined(TBC_TEXT_FORMAT_H_INCLUDED) || defined(STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE) +#ifndef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE +#define TBC_TEXT_FORMAT_H_INCLUDED #endif -#ifndef TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED + #include #include #include // Use optional outer namespace -#ifdef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE -namespace CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE { +#ifdef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE +namespace STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE { #endif namespace Tbc { @@ -4489,24 +4477,27 @@ namespace Tbc { } // end namespace Tbc -#ifdef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE +#ifdef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE } // end outer namespace #endif -#endif // TWOBLUECUBES_TEXT_FORMAT_H_ALREADY_INCLUDED -#undef CLICHE_TBC_TEXT_FORMAT_OUTER_NAMESPACE +#endif // TBC_TEXT_FORMAT_H_INCLUDED + +// ----------- end of #include from tbc_text_format.h ----------- +// ........... back in /Users/philnash/Dev/OSS/Clara/srcs/clara.h + #endif -#include -#include +#undef STITCH_TBC_TEXT_FORMAT_OUTER_NAMESPACE + #include #include #include #include // Use optional outer namespace -#ifdef CLICHE_CLARA_OUTER_NAMESPACE -namespace CLICHE_CLARA_OUTER_NAMESPACE { +#ifdef STITCH_CLARA_OUTER_NAMESPACE +namespace STITCH_CLARA_OUTER_NAMESPACE { #endif namespace Clara { @@ -4782,7 +4773,7 @@ namespace Clara { } void validate() const { if( boundField.takesArg() && !takesArg() ) - throw std::logic_error( dbgName() + " must specify an arg name" ); + throw std::logic_error( "command line argument '" + dbgName() + "' must specify a hint" ); } std::string commands() const { std::ostringstream oss; @@ -4833,8 +4824,10 @@ namespace Clara { { other.m_cl = NULL; } - ~ArgBinder() { - if( m_cl ) { + // !TBD: Need to include workarounds to be able to declare this + // destructor as able to throw exceptions + ~ArgBinder() /* noexcept(false) */ { + if( m_cl && !std::uncaught_exception() ) { m_arg.validate(); if( m_arg.isFixedPositional() ) { m_cl->m_positionalArgs.insert( std::make_pair( m_arg.position, m_arg ) ); @@ -4979,6 +4972,12 @@ namespace Clara { return oss.str(); } + ConfigT parseInto( int argc, char const * const * argv ) const { + ConfigT config; + parseInto( argc, argv, config ); + return config; + } + std::vector parseInto( int argc, char const * const * argv, ConfigT& config ) const { std::string processName = argv[0]; std::size_t lastSlash = processName.find_last_of( "/\\" ); @@ -5089,13 +5088,12 @@ namespace Clara { } // end namespace Clara -#ifdef CLICHE_CLARA_OUTER_NAMESPACE +#ifdef STITCH_CLARA_OUTER_NAMESPACE } // end outer namespace #endif -#endif // TWOBLUECUBES_CLARA_H_ALREADY_INCLUDED - -#undef CLICHE_CLARA_OUTER_NAMESPACE +#endif // TWOBLUECUBES_CLARA_H_INCLUDED +#undef STITCH_CLARA_OUTER_NAMESPACE #include @@ -7492,7 +7490,7 @@ namespace Catch { // These numbers are maintained by a script template - const T LibraryVersionInfo::value( 1, 0, 26, "master" ); + const T LibraryVersionInfo::value( 1, 0, 27, "master" ); } // #included from: catch_message.hpp