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

summaryrefslogtreecommitdiffhomepage
path: root/src/catch2/internal
diff options
context:
space:
mode:
authorMartin Hořeňovský2023-12-23 16:02:37 +0100
committerMartin Hořeňovský2023-12-26 14:40:45 +0100
commit2295d2c8ccc0dba4b35adb95ef8946a05996df87 (patch)
tree3f52cdf8fbe628f15f654dfcbb79d25c8c43bb3b /src/catch2/internal
parent2b69a3e2167a7d770bc2c16f4b8138babba3b0ca (diff)
downloadcatch3-2295d2c8ccc0dba4b35adb95ef8946a05996df87.tar.gz
Store Opt/Arg hint and description as StringRef
There is no good reason for these to be std::strings, as these are just (optional) constants for nice user output. This ends up reducing the allocations significantly. When measuring allocations when running no tests, the changes are `tests/SelfTest` 9213 -> 7705 `tests/ExtraTests/NoTests` 3723 -> 2215
Diffstat (limited to 'src/catch2/internal')
-rw-r--r--src/catch2/internal/catch_clara.cpp2
-rw-r--r--src/catch2/internal/catch_clara.hpp21
2 files changed, 12 insertions, 11 deletions
diff --git a/src/catch2/internal/catch_clara.cpp b/src/catch2/internal/catch_clara.cpp
index c9bc7695..4745eb89 100644
--- a/src/catch2/internal/catch_clara.cpp
+++ b/src/catch2/internal/catch_clara.cpp
@@ -185,7 +185,7 @@ namespace Catch {
}
if (!m_hint.empty())
oss << " <" << m_hint << '>';
- return { { oss.str(), m_description } };
+ return { { oss.str(), static_cast<std::string>(m_description) } };
}
bool Opt::isMatch(std::string const& optToken) const {
diff --git a/src/catch2/internal/catch_clara.hpp b/src/catch2/internal/catch_clara.hpp
index 9117b65e..d8c31c68 100644
--- a/src/catch2/internal/catch_clara.hpp
+++ b/src/catch2/internal/catch_clara.hpp
@@ -29,6 +29,7 @@
# endif
#endif
+#include <catch2/internal/catch_stringref.hpp>
#include <catch2/internal/catch_move_and_forward.hpp>
#include <catch2/internal/catch_noncopyable.hpp>
#include <catch2/internal/catch_void_type.hpp>
@@ -465,8 +466,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 ) {}
@@ -475,25 +476,25 @@ 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& {
+ auto operator()( StringRef description ) -> DerivedT& {
m_description = description;
return static_cast<DerivedT&>( *this );
}
@@ -519,7 +520,7 @@ namespace Catch {
return 1;
}
- std::string const& hint() const { return m_hint; }
+ StringRef hint() const { return m_hint; }
};
} // namespace detail
@@ -552,17 +553,17 @@ 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& {