Read-only mirrors. Development, issues and pull requests are on GitHub.

summaryrefslogtreecommitdiffhomepage
path: root/extras/catch_amalgamated.hpp
diff options
context:
space:
mode:
authorMartin Hořeňovský2023-12-31 15:15:04 +0100
committerMartin Hořeňovský2023-12-31 15:15:04 +0100
commitf981c9cbcac07a2690e5a86767eba490b5465463 (patch)
tree3805b1a44240b2f1db71f73c54feed32ca11fc6c /extras/catch_amalgamated.hpp
parentb7b71ffd3a2a659412357964e91ee7db954e28df (diff)
downloadcatch3-3.5.1.tar.gz
v3.5.1v3.5.1
Diffstat (limited to 'extras/catch_amalgamated.hpp')
-rw-r--r--extras/catch_amalgamated.hpp476
1 files changed, 270 insertions, 206 deletions
diff --git a/extras/catch_amalgamated.hpp b/extras/catch_amalgamated.hpp
index bec588d4..4f075857 100644
--- a/extras/catch_amalgamated.hpp
+++ b/extras/catch_amalgamated.hpp
@@ -6,8 +6,8 @@
// SPDX-License-Identifier: BSL-1.0
-// Catch v3.5.0
-// Generated: 2023-12-11 00:51:06.770598
+// Catch v3.5.1
+// Generated: 2023-12-31 15:10:53.044176
// ----------------------------------------------------------
// This file is an amalgamation of multiple different files.
// You probably shouldn't edit it directly.
@@ -690,6 +690,8 @@ namespace Catch {
using size_type = std::size_t;
using const_iterator = const char*;
+ static constexpr size_type npos{ static_cast<size_type>( -1 ) };
+
private:
static constexpr char const* const s_empty = "";
@@ -740,7 +742,7 @@ namespace Catch {
}
// Returns a substring of [start, start + length).
- // If start + length > size(), then the substring is [start, start + size()).
+ // If start + length > size(), then the substring is [start, size()).
// If start > size(), then the substring is empty.
constexpr StringRef substr(size_type start, size_type length) const noexcept {
if (start < m_size) {
@@ -1969,12 +1971,12 @@ namespace Catch {
template <typename Clock>
int warmup() {
- return run_for_at_least<Clock>(std::chrono::duration_cast<IDuration>(warmup_time), warmup_seed, &resolution<Clock>)
+ return run_for_at_least<Clock>(warmup_time, warmup_seed, &resolution<Clock>)
.iterations;
}
template <typename Clock>
EnvironmentEstimate estimate_clock_resolution(int iterations) {
- auto r = run_for_at_least<Clock>(std::chrono::duration_cast<IDuration>(clock_resolution_estimation_time), iterations, &resolution<Clock>)
+ auto r = run_for_at_least<Clock>(clock_resolution_estimation_time, iterations, &resolution<Clock>)
.result;
return {
FDuration(mean(r.data(), r.data() + r.size())),
@@ -1996,7 +1998,7 @@ namespace Catch {
};
time_clock(1);
int iters = clock_cost_estimation_iterations;
- auto&& r = run_for_at_least<Clock>(std::chrono::duration_cast<IDuration>(clock_cost_estimation_time), iters, time_clock);
+ auto&& r = run_for_at_least<Clock>(clock_cost_estimation_time, iters, time_clock);
std::vector<double> times;
int nsamples = static_cast<int>(std::ceil(time_limit / r.elapsed));
times.reserve(static_cast<size_t>(nsamples));
@@ -3639,141 +3641,6 @@ namespace Catch {
#define CATCH_REPORTER_SPEC_PARSER_HPP_INCLUDED
-
-#ifndef CATCH_CONSOLE_COLOUR_HPP_INCLUDED
-#define CATCH_CONSOLE_COLOUR_HPP_INCLUDED
-
-
-#include <iosfwd>
-#include <cstdint>
-
-namespace Catch {
-
- enum class ColourMode : std::uint8_t;
- class IStream;
-
- struct Colour {
- enum Code {
- None = 0,
-
- White,
- Red,
- Green,
- Blue,
- Cyan,
- Yellow,
- Grey,
-
- Bright = 0x10,
-
- BrightRed = Bright | Red,
- BrightGreen = Bright | Green,
- LightGrey = Bright | Grey,
- BrightWhite = Bright | White,
- BrightYellow = Bright | Yellow,
-
- // By intention
- FileName = LightGrey,
- Warning = BrightYellow,
- ResultError = BrightRed,
- ResultSuccess = BrightGreen,
- ResultExpectedFailure = Warning,
-
- Error = BrightRed,
- Success = Green,
- Skip = LightGrey,
-
- OriginalExpression = Cyan,
- ReconstructedExpression = BrightYellow,
-
- SecondaryText = LightGrey,
- Headers = White
- };
- };
-
- class ColourImpl {
- protected:
- //! The associated stream of this ColourImpl instance
- IStream* m_stream;
- public:
- ColourImpl( IStream* stream ): m_stream( stream ) {}
-
- //! RAII wrapper around writing specific colour of text using specific
- //! colour impl into a stream.
- class ColourGuard {
- ColourImpl const* m_colourImpl;
- Colour::Code m_code;
- bool m_engaged = false;
-
- public:
- //! Does **not** engage the guard/start the colour
- ColourGuard( Colour::Code code,
- ColourImpl const* colour );
-
- ColourGuard( ColourGuard const& rhs ) = delete;
- ColourGuard& operator=( ColourGuard const& rhs ) = delete;
-
- ColourGuard( ColourGuard&& rhs ) noexcept;
- ColourGuard& operator=( ColourGuard&& rhs ) noexcept;
-
- //! Removes colour _if_ the guard was engaged
- ~ColourGuard();
-
- /**
- * Explicitly engages colour for given stream.
- *
- * The API based on operator<< should be preferred.
- */
- ColourGuard& engage( std::ostream& stream ) &;
- /**
- * Explicitly engages colour for given stream.
- *
- * The API based on operator<< should be preferred.
- */
- ColourGuard&& engage( std::ostream& stream ) &&;
-
- private:
- //! Engages the guard and starts using colour
- friend std::ostream& operator<<( std::ostream& lhs,
- ColourGuard& guard ) {
- guard.engageImpl( lhs );
- return lhs;
- }
- //! Engages the guard and starts using colour
- friend std::ostream& operator<<( std::ostream& lhs,
- ColourGuard&& guard) {
- guard.engageImpl( lhs );
- return lhs;
- }
-
- void engageImpl( std::ostream& stream );
-
- };
-
- virtual ~ColourImpl(); // = default
- /**
- * Creates a guard object for given colour and this colour impl
- *
- * **Important:**
- * the guard starts disengaged, and has to be engaged explicitly.
- */
- ColourGuard guardColour( Colour::Code colourCode );
-
- private:
- virtual void use( Colour::Code colourCode ) const = 0;
- };
-
- //! Provides ColourImpl based on global config and target compilation platform
- Detail::unique_ptr<ColourImpl> makeColourImpl( ColourMode colourSelection,
- IStream* stream );
-
- //! Checks if specific colour impl has been compiled into the binary
- bool isColourImplAvailable( ColourMode colourSelection );
-
-} // end namespace Catch
-
-#endif // CATCH_CONSOLE_COLOUR_HPP_INCLUDED
-
#include <map>
#include <string>
#include <vector>
@@ -4387,17 +4254,16 @@ namespace Catch {
enum class TokenType { Option, Argument };
struct Token {
TokenType type;
- std::string token;
+ StringRef token;
};
// Abstracts iterators into args as a stream of tokens, with option
// arguments uniformly handled
class TokenStream {
- using Iterator = std::vector<std::string>::const_iterator;
+ using Iterator = std::vector<StringRef>::const_iterator;
Iterator it;
Iterator itEnd;
std::vector<Token> m_tokenBuffer;
-
void loadBuffer();
public:
@@ -4449,12 +4315,17 @@ namespace Catch {
ResultType m_type;
};
- template <typename T> class ResultValueBase : public ResultBase {
+ template <typename T>
+ class ResultValueBase : public ResultBase {
public:
- auto value() const -> T const& {
+ T const& value() const& {
enforceOk();
return m_value;
}
+ T&& value() && {
+ enforceOk();
+ return CATCH_MOVE( m_value );
+ }
protected:
ResultValueBase( ResultType type ): ResultBase( type ) {}
@@ -4464,13 +4335,23 @@ namespace Catch {
if ( m_type == ResultType::Ok )
new ( &m_value ) T( other.m_value );
}
+ ResultValueBase( ResultValueBase&& other ):
+ ResultBase( other ) {
+ if ( m_type == ResultType::Ok )
+ new ( &m_value ) T( CATCH_MOVE(other.m_value) );
+ }
+
- ResultValueBase( ResultType, T const& value ): ResultBase( ResultType::Ok ) {
+ ResultValueBase( ResultType, T const& value ):
+ ResultBase( ResultType::Ok ) {
new ( &m_value ) T( value );
}
+ ResultValueBase( ResultType, T&& value ):
+ ResultBase( ResultType::Ok ) {
+ new ( &m_value ) T( CATCH_MOVE(value) );
+ }
- auto operator=( ResultValueBase const& other )
- -> ResultValueBase& {
+ ResultValueBase& operator=( ResultValueBase const& other ) {
if ( m_type == ResultType::Ok )
m_value.~T();
ResultBase::operator=( other );
@@ -4478,6 +4359,14 @@ namespace Catch {
new ( &m_value ) T( other.m_value );
return *this;
}
+ ResultValueBase& operator=( ResultValueBase&& other ) {
+ if ( m_type == ResultType::Ok ) m_value.~T();
+ ResultBase::operator=( other );
+ if ( m_type == ResultType::Ok )
+ new ( &m_value ) T( CATCH_MOVE(other.m_value) );
+ return *this;
+ }
+
~ResultValueBase() override {
if ( m_type == ResultType::Ok )
@@ -4505,8 +4394,8 @@ namespace Catch {
}
template <typename U>
- static auto ok( U const& value ) -> BasicResult {
- return { ResultType::Ok, value };
+ static auto ok( U&& value ) -> BasicResult {
+ return { ResultType::Ok, CATCH_FORWARD(value) };
}
static auto ok() -> BasicResult { return { ResultType::Ok }; }
static auto logicError( std::string&& message )
@@ -4553,12 +4442,15 @@ namespace Catch {
class ParseState {
public:
ParseState( ParseResultType type,
- TokenStream const& remainingTokens );
+ TokenStream remainingTokens );
ParseResultType type() const { return m_type; }
- TokenStream const& remainingTokens() const {
+ TokenStream const& remainingTokens() const& {
return m_remainingTokens;
}
+ TokenStream&& remainingTokens() && {
+ return CATCH_MOVE( m_remainingTokens );
+ }
private:
ParseResultType m_type;
@@ -4571,7 +4463,7 @@ namespace Catch {
struct HelpColumns {
std::string left;
- std::string right;
+ StringRef descriptions;
};
template <typename T>
@@ -4731,7 +4623,7 @@ namespace Catch {
virtual ~ParserBase() = default;
virtual auto validate() const -> Result { return Result::ok(); }
virtual auto parse( std::string const& exeName,
- TokenStream const& tokens ) const
+ TokenStream tokens ) const
-> InternalParseResult = 0;
virtual size_t cardinality() const;
@@ -4751,8 +4643,8 @@ namespace Catch {
protected:
Optionality m_optionality = Optionality::Optional;
std::shared_ptr<BoundRef> m_ref;
- std::string m_hint;
- std::string m_description;
+ StringRef m_hint;
+ StringRef m_description;
explicit ParserRefImpl( std::shared_ptr<BoundRef> const& ref ):
m_ref( ref ) {}
@@ -4761,28 +4653,32 @@ namespace Catch {
template <typename LambdaT>
ParserRefImpl( accept_many_t,
LambdaT const& ref,
- std::string const& hint ):
+ StringRef hint ):
m_ref( std::make_shared<BoundManyLambda<LambdaT>>( ref ) ),
m_hint( hint ) {}
template <typename T,
typename = typename std::enable_if_t<
!Detail::is_unary_function<T>::value>>
- ParserRefImpl( T& ref, std::string const& hint ):
+ ParserRefImpl( T& ref, StringRef hint ):
m_ref( std::make_shared<BoundValueRef<T>>( ref ) ),
m_hint( hint ) {}
template <typename LambdaT,
typename = typename std::enable_if_t<
Detail::is_unary_function<LambdaT>::value>>
- ParserRefImpl( LambdaT const& ref, std::string const& hint ):
+ ParserRefImpl( LambdaT const& ref, StringRef hint ):
m_ref( std::make_shared<BoundLambda<LambdaT>>( ref ) ),
m_hint( hint ) {}
- auto operator()( std::string const& description ) -> DerivedT& {
+ DerivedT& operator()( StringRef description ) & {
m_description = description;
return static_cast<DerivedT&>( *this );
}
+ DerivedT&& operator()( StringRef description ) && {
+ m_description = description;
+ return static_cast<DerivedT&&>( *this );
+ }
auto optional() -> DerivedT& {
m_optionality = Optionality::Optional;
@@ -4805,7 +4701,7 @@ namespace Catch {
return 1;
}
- std::string const& hint() const { return m_hint; }
+ StringRef hint() const { return m_hint; }
};
} // namespace detail
@@ -4819,13 +4715,13 @@ namespace Catch {
Detail::InternalParseResult
parse(std::string const&,
- Detail::TokenStream const& tokens) const override;
+ Detail::TokenStream tokens) const override;
};
// A parser for options
class Opt : public Detail::ParserRefImpl<Opt> {
protected:
- std::vector<std::string> m_optNames;
+ std::vector<StringRef> m_optNames;
public:
template <typename LambdaT>
@@ -4838,33 +4734,37 @@ namespace Catch {
template <typename LambdaT,
typename = typename std::enable_if_t<
Detail::is_unary_function<LambdaT>::value>>
- Opt( LambdaT const& ref, std::string const& hint ):
+ Opt( LambdaT const& ref, StringRef hint ):
ParserRefImpl( ref, hint ) {}
template <typename LambdaT>
- Opt( accept_many_t, LambdaT const& ref, std::string const& hint ):
+ Opt( accept_many_t, LambdaT const& ref, StringRef hint ):
ParserRefImpl( accept_many, ref, hint ) {}
template <typename T,
typename = typename std::enable_if_t<
!Detail::is_unary_function<T>::value>>
- Opt( T& ref, std::string const& hint ):
+ Opt( T& ref, StringRef hint ):
ParserRefImpl( ref, hint ) {}
- auto operator[](std::string const& optName) -> Opt& {
+ Opt& operator[]( StringRef optName ) & {
m_optNames.push_back(optName);
return *this;
}
+ Opt&& operator[]( StringRef optName ) && {
+ m_optNames.push_back( optName );
+ return CATCH_MOVE(*this);
+ }
- std::vector<Detail::HelpColumns> getHelpColumns() const;
+ Detail::HelpColumns getHelpColumns() const;
- bool isMatch(std::string const& optToken) const;
+ bool isMatch(StringRef optToken) const;
using ParserBase::parse;
Detail::InternalParseResult
parse(std::string const&,
- Detail::TokenStream const& tokens) const override;
+ Detail::TokenStream tokens) const override;
Detail::Result validate() const override;
};
@@ -4887,7 +4787,7 @@ namespace Catch {
// handled specially
Detail::InternalParseResult
parse(std::string const&,
- Detail::TokenStream const& tokens) const override;
+ Detail::TokenStream tokens) const override;
std::string const& name() const { return *m_name; }
Detail::ParserResult set(std::string const& newName);
@@ -4912,16 +4812,26 @@ namespace Catch {
return *this;
}
- auto operator|=(Opt const& opt) -> Parser& {
- m_options.push_back(opt);
- return *this;
+ friend Parser& operator|=( Parser& p, Opt const& opt ) {
+ p.m_options.push_back( opt );
+ return p;
+ }
+ friend Parser& operator|=( Parser& p, Opt&& opt ) {
+ p.m_options.push_back( CATCH_MOVE(opt) );
+ return p;
}
Parser& operator|=(Parser const& other);
template <typename T>
- auto operator|(T const& other) const -> Parser {
- return Parser(*this) |= other;
+ friend Parser operator|( Parser const& p, T&& rhs ) {
+ return Parser( p ) |= CATCH_FORWARD(rhs);
+ }
+
+ template <typename T>
+ friend Parser operator|( Parser&& p, T&& rhs ) {
+ p |= CATCH_FORWARD(rhs);
+ return CATCH_MOVE(p);
}
std::vector<Detail::HelpColumns> getHelpColumns() const;
@@ -4939,21 +4849,23 @@ namespace Catch {
using ParserBase::parse;
Detail::InternalParseResult
parse(std::string const& exeName,
- Detail::TokenStream const& tokens) const override;
+ Detail::TokenStream tokens) const override;
};
- // Transport for raw args (copied from main args, or supplied via
- // init list for testing)
+ /**
+ * Wrapper over argc + argv, assumes that the inputs outlive it
+ */
class Args {
friend Detail::TokenStream;
- std::string m_exeName;
- std::vector<std::string> m_args;
+ StringRef m_exeName;
+ std::vector<StringRef> m_args;
public:
Args(int argc, char const* const* argv);
- Args(std::initializer_list<std::string> args);
+ // Helper constructor for testing
+ Args(std::initializer_list<StringRef> args);
- std::string const& exeName() const { return m_exeName; }
+ StringRef exeName() const { return m_exeName; }
};
@@ -6997,6 +6909,7 @@ namespace Catch {
};
class ITestInvoker;
+ struct NameAndTags;
enum class TestCaseProperties : uint8_t {
None = 0,
@@ -7233,7 +7146,7 @@ namespace Catch {
#define CATCH_VERSION_MAJOR 3
#define CATCH_VERSION_MINOR 5
-#define CATCH_VERSION_PATCH 0
+#define CATCH_VERSION_PATCH 1
#endif // CATCH_VERSION_MACROS_HPP_INCLUDED
@@ -8133,12 +8046,12 @@ class uniform_integer_distribution {
using UnsignedIntegerType = Detail::make_unsigned_t<IntegerType>;
- // We store the left range bound converted to internal representation,
- // because it will be used in computation in the () operator.
+ // Only the left bound is stored, and we store it converted to its
+ // unsigned image. This avoids having to do the conversions inside
+ // the operator(), at the cost of having to do the conversion in
+ // the a() getter. The right bound is only needed in the b() getter,
+ // so we recompute it there from other stored data.
UnsignedIntegerType m_a;
- // After initialization, right bound is only used for the b() getter,
- // so we keep it in the original type.
- IntegerType m_b;
// How many different values are there in [a, b]. a == b => 1, can be 0 for distribution over all values in the type.
UnsignedIntegerType m_ab_distance;
@@ -8151,11 +8064,10 @@ class uniform_integer_distribution {
// distribution will be reused many times and this is an optimization.
UnsignedIntegerType m_rejection_threshold = 0;
- // Assumes m_b and m_a are already filled
- UnsignedIntegerType computeDistance() const {
- // This overflows and returns 0 if ua == 0 and ub == TYPE_MAX.
+ UnsignedIntegerType computeDistance(IntegerType a, IntegerType b) const {
+ // This overflows and returns 0 if a == 0 and b == TYPE_MAX.
// We handle that later when generating the number.
- return transposeTo(m_b) - m_a + 1;
+ return transposeTo(b) - transposeTo(a) + 1;
}
static UnsignedIntegerType computeRejectionThreshold(UnsignedIntegerType ab_distance) {
@@ -8179,8 +8091,7 @@ public:
uniform_integer_distribution( IntegerType a, IntegerType b ):
m_a( transposeTo(a) ),
- m_b( b ),
- m_ab_distance( computeDistance() ),
+ m_ab_distance( computeDistance(a, b) ),
m_rejection_threshold( computeRejectionThreshold(m_ab_distance) ) {
assert( a <= b );
}
@@ -8205,7 +8116,7 @@ public:
}
result_type a() const { return transposeBack(m_a); }
- result_type b() const { return m_b; }
+ result_type b() const { return transposeBack(m_ab_distance + m_a - 1); }
};
} // end namespace Catch
@@ -9065,6 +8976,141 @@ namespace Catch {
#endif // CATCH_CONFIG_UNCAUGHT_EXCEPTIONS_HPP_INCLUDED
+#ifndef CATCH_CONSOLE_COLOUR_HPP_INCLUDED
+#define CATCH_CONSOLE_COLOUR_HPP_INCLUDED
+
+
+#include <iosfwd>
+#include <cstdint>
+
+namespace Catch {
+
+ enum class ColourMode : std::uint8_t;
+ class IStream;
+
+ struct Colour {
+ enum Code {
+ None = 0,
+
+ White,
+ Red,
+ Green,
+ Blue,
+ Cyan,
+ Yellow,
+ Grey,
+
+ Bright = 0x10,
+
+ BrightRed = Bright | Red,
+ BrightGreen = Bright | Green,
+ LightGrey = Bright | Grey,
+ BrightWhite = Bright | White,
+ BrightYellow = Bright | Yellow,
+
+ // By intention
+ FileName = LightGrey,
+ Warning = BrightYellow,
+ ResultError = BrightRed,
+ ResultSuccess = BrightGreen,
+ ResultExpectedFailure = Warning,
+
+ Error = BrightRed,
+ Success = Green,
+ Skip = LightGrey,
+
+ OriginalExpression = Cyan,
+ ReconstructedExpression = BrightYellow,
+
+ SecondaryText = LightGrey,
+ Headers = White
+ };
+ };
+
+ class ColourImpl {
+ protected:
+ //! The associated stream of this ColourImpl instance
+ IStream* m_stream;
+ public:
+ ColourImpl( IStream* stream ): m_stream( stream ) {}
+
+ //! RAII wrapper around writing specific colour of text using specific
+ //! colour impl into a stream.
+ class ColourGuard {
+ ColourImpl const* m_colourImpl;
+ Colour::Code m_code;
+ bool m_engaged = false;
+
+ public:
+ //! Does **not** engage the guard/start the colour
+ ColourGuard( Colour::Code code,
+ ColourImpl const* colour );
+
+ ColourGuard( ColourGuard const& rhs ) = delete;
+ ColourGuard& operator=( ColourGuard const& rhs ) = delete;
+
+ ColourGuard( ColourGuard&& rhs ) noexcept;
+ ColourGuard& operator=( ColourGuard&& rhs ) noexcept;
+
+ //! Removes colour _if_ the guard was engaged
+ ~ColourGuard();
+
+ /**
+ * Explicitly engages colour for given stream.
+ *
+ * The API based on operator<< should be preferred.
+ */
+ ColourGuard& engage( std::ostream& stream ) &;
+ /**
+ * Explicitly engages colour for given stream.
+ *
+ * The API based on operator<< should be preferred.
+ */
+ ColourGuard&& engage( std::ostream& stream ) &&;
+
+ private:
+ //! Engages the guard and starts using colour
+ friend std::ostream& operator<<( std::ostream& lhs,
+ ColourGuard& guard ) {
+ guard.engageImpl( lhs );
+ return lhs;
+ }
+ //! Engages the guard and starts using colour
+ friend std::ostream& operator<<( std::ostream& lhs,
+ ColourGuard&& guard) {
+ guard.engageImpl( lhs );
+ return lhs;
+ }
+
+ void engageImpl( std::ostream& stream );
+
+ };
+
+ virtual ~ColourImpl(); // = default
+ /**
+ * Creates a guard object for given colour and this colour impl
+ *
+ * **Important:**
+ * the guard starts disengaged, and has to be engaged explicitly.
+ */
+ ColourGuard guardColour( Colour::Code colourCode );
+
+ private:
+ virtual void use( Colour::Code colourCode ) const = 0;
+ };
+
+ //! Provides ColourImpl based on global config and target compilation platform
+ Detail::unique_ptr<ColourImpl> makeColourImpl( ColourMode colourSelection,
+ IStream* stream );
+
+ //! Checks if specific colour impl has been compiled into the binary
+ bool isColourImplAvailable( ColourMode colourSelection );
+
+} // end namespace Catch
+
+#endif // CATCH_CONSOLE_COLOUR_HPP_INCLUDED
+
+
#ifndef CATCH_CONSOLE_WIDTH_HPP_INCLUDED
#define CATCH_CONSOLE_WIDTH_HPP_INCLUDED
@@ -9340,7 +9386,6 @@ namespace Catch {
#ifndef CATCH_FATAL_CONDITION_HANDLER_HPP_INCLUDED
#define CATCH_FATAL_CONDITION_HANDLER_HPP_INCLUDED
-
#include <cassert>
namespace Catch {
@@ -10421,7 +10466,7 @@ namespace Catch {
#ifndef CATCH_SHARDING_HPP_INCLUDED
#define CATCH_SHARDING_HPP_INCLUDED
-
+#include <cassert>
#include <cmath>
#include <algorithm>
@@ -10769,6 +10814,7 @@ namespace Catch {
#ifndef CATCH_TEXTFLOW_HPP_INCLUDED
#define CATCH_TEXTFLOW_HPP_INCLUDED
+
#include <cassert>
#include <string>
#include <vector>
@@ -10797,7 +10843,7 @@ namespace Catch {
public:
/**
- * Iterates "lines" in `Column` and return sthem
+ * Iterates "lines" in `Column` and returns them
*/
class const_iterator {
friend Column;
@@ -10851,20 +10897,35 @@ namespace Catch {
using iterator = const_iterator;
explicit Column( std::string const& text ): m_string( text ) {}
+ explicit Column( std::string&& text ):
+ m_string( CATCH_MOVE(text)) {}
- Column& width( size_t newWidth ) {
+ Column& width( size_t newWidth ) & {
assert( newWidth > 0 );
m_width = newWidth;
return *this;
}
- Column& indent( size_t newIndent ) {
+ Column&& width( size_t newWidth ) && {
+ assert( newWidth > 0 );
+ m_width = newWidth;
+ return CATCH_MOVE( *this );
+ }
+ Column& indent( size_t newIndent ) & {
m_indent = newIndent;
return *this;
}
- Column& initialIndent( size_t newIndent ) {
+ Column&& indent( size_t newIndent ) && {
+ m_indent = newIndent;
+ return CATCH_MOVE( *this );
+ }
+ Column& initialIndent( size_t newIndent ) & {
m_initialIndent = newIndent;
return *this;
}
+ Column&& initialIndent( size_t newIndent ) && {
+ m_initialIndent = newIndent;
+ return CATCH_MOVE( *this );
+ }
size_t width() const { return m_width; }
const_iterator begin() const { return const_iterator( *this ); }
@@ -10873,7 +10934,8 @@ namespace Catch {
friend std::ostream& operator<<( std::ostream& os,
Column const& col );
- Columns operator+( Column const& other );
+ friend Columns operator+( Column const& lhs, Column const& rhs );
+ friend Columns operator+( Column&& lhs, Column&& rhs );
};
//! Creates a column that serves as an empty space of specific width
@@ -10917,8 +10979,10 @@ namespace Catch {
iterator begin() const { return iterator( *this ); }
iterator end() const { return { *this, iterator::EndTag() }; }
- Columns& operator+=( Column const& col );
- Columns operator+( Column const& col );
+ friend Columns& operator+=( Columns& lhs, Column const& rhs );
+ friend Columns& operator+=( Columns& lhs, Column&& rhs );
+ friend Columns operator+( Columns const& lhs, Column const& rhs );
+ friend Columns operator+( Columns&& lhs, Column&& rhs );
friend std::ostream& operator<<( std::ostream& os,
Columns const& cols );