Use std::make_unique instead of our polyfill or naked new

The use we previously used the polyfill or naked new is that we
supported C++11, which did not yet have `std::make_unique`. However,
with the move to C++14 as the minimum, `std::make_unique` can be
expected to be always available.
This commit is contained in:
Martin Hořeňovský 2020-02-01 21:43:00 +01:00
parent a7b3e087a0
commit ea6db67063
No known key found for this signature in database
GPG Key ID: DE48307B8B0D381A
8 changed files with 22 additions and 30 deletions

View File

@ -40,7 +40,9 @@ int const& RandomIntGenerator::get() const {
// Notice that it returns an instance of GeneratorWrapper<int>, which // Notice that it returns an instance of GeneratorWrapper<int>, which
// is a value-wrapper around std::unique_ptr<IGenerator<int>>. // is a value-wrapper around std::unique_ptr<IGenerator<int>>.
Catch::Generators::GeneratorWrapper<int> random(int low, int high) { Catch::Generators::GeneratorWrapper<int> random(int low, int high) {
return Catch::Generators::GeneratorWrapper<int>(std::unique_ptr<Catch::Generators::IGenerator<int>>(new RandomIntGenerator(low, high))); return Catch::Generators::GeneratorWrapper<int>(
std::make_unique<RandomIntGenerator>(low, high)
);
} }
// The two sections in this test case are equivalent, but the first one // The two sections in this test case are equivalent, but the first one

View File

@ -38,9 +38,7 @@ std::string const& LineGenerator::get() const {
// is a value-wrapper around std::unique_ptr<IGenerator<std::string>>. // is a value-wrapper around std::unique_ptr<IGenerator<std::string>>.
Catch::Generators::GeneratorWrapper<std::string> lines(std::string /* ignored for example */) { Catch::Generators::GeneratorWrapper<std::string> lines(std::string /* ignored for example */) {
return Catch::Generators::GeneratorWrapper<std::string>( return Catch::Generators::GeneratorWrapper<std::string>(
std::unique_ptr<Catch::Generators::IGenerator<std::string>>( std::make_unique<LineGenerator>()
new LineGenerator()
)
); );
} }

View File

@ -52,7 +52,7 @@ namespace Catch {
} }
std::unique_ptr<EnumInfo> makeEnumInfo( StringRef enumName, StringRef allValueNames, std::vector<int> const& values ) { std::unique_ptr<EnumInfo> makeEnumInfo( StringRef enumName, StringRef allValueNames, std::vector<int> const& values ) {
std::unique_ptr<EnumInfo> enumInfo( new EnumInfo ); auto enumInfo = std::make_unique<EnumInfo>();
enumInfo->m_name = enumName; enumInfo->m_name = enumName;
enumInfo->m_values.reserve( values.size() ); enumInfo->m_values.reserve( values.size() );

View File

@ -33,14 +33,6 @@ public:
namespace Generators { namespace Generators {
// !TBD move this into its own location?
namespace pf{
template<typename T, typename... Args>
std::unique_ptr<T> make_unique( Args&&... args ) {
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}
}
template<typename T> template<typename T>
struct IGenerator : GeneratorUntypedBase { struct IGenerator : GeneratorUntypedBase {
virtual ~IGenerator() = default; virtual ~IGenerator() = default;
@ -104,11 +96,11 @@ namespace Generators {
template <typename T> template <typename T>
GeneratorWrapper<T> value(T&& value) { GeneratorWrapper<T> value(T&& value) {
return GeneratorWrapper<T>(pf::make_unique<SingleValueGenerator<T>>(std::forward<T>(value))); return GeneratorWrapper<T>(std::make_unique<SingleValueGenerator<T>>(std::forward<T>(value)));
} }
template <typename T> template <typename T>
GeneratorWrapper<T> values(std::initializer_list<T> values) { GeneratorWrapper<T> values(std::initializer_list<T> values) {
return GeneratorWrapper<T>(pf::make_unique<FixedValuesGenerator<T>>(values)); return GeneratorWrapper<T>(std::make_unique<FixedValuesGenerator<T>>(values));
} }
template<typename T> template<typename T>
@ -193,7 +185,7 @@ namespace Generators {
IGeneratorTracker& tracker = acquireGeneratorTracker( lineInfo ); IGeneratorTracker& tracker = acquireGeneratorTracker( lineInfo );
if (!tracker.hasGenerator()) { if (!tracker.hasGenerator()) {
tracker.setGenerator(pf::make_unique<Generators<UnderlyingType>>(generatorExpression())); tracker.setGenerator(std::make_unique<Generators<UnderlyingType>>(generatorExpression()));
} }
auto const& generator = static_cast<IGenerator<UnderlyingType> const&>( *tracker.getGenerator() ); auto const& generator = static_cast<IGenerator<UnderlyingType> const&>( *tracker.getGenerator() );

View File

@ -46,7 +46,7 @@ namespace Generators {
template <typename T> template <typename T>
GeneratorWrapper<T> take(size_t target, GeneratorWrapper<T>&& generator) { GeneratorWrapper<T> take(size_t target, GeneratorWrapper<T>&& generator) {
return GeneratorWrapper<T>(pf::make_unique<TakeGenerator<T>>(target, std::move(generator))); return GeneratorWrapper<T>(std::make_unique<TakeGenerator<T>>(target, std::move(generator)));
} }
@ -87,7 +87,7 @@ namespace Generators {
template <typename T, typename Predicate> template <typename T, typename Predicate>
GeneratorWrapper<T> filter(Predicate&& pred, GeneratorWrapper<T>&& generator) { GeneratorWrapper<T> filter(Predicate&& pred, GeneratorWrapper<T>&& generator) {
return GeneratorWrapper<T>(std::unique_ptr<IGenerator<T>>(pf::make_unique<FilterGenerator<T, Predicate>>(std::forward<Predicate>(pred), std::move(generator)))); return GeneratorWrapper<T>(std::unique_ptr<IGenerator<T>>(std::make_unique<FilterGenerator<T, Predicate>>(std::forward<Predicate>(pred), std::move(generator))));
} }
template <typename T> template <typename T>
@ -143,7 +143,7 @@ namespace Generators {
template <typename T> template <typename T>
GeneratorWrapper<T> repeat(size_t repeats, GeneratorWrapper<T>&& generator) { GeneratorWrapper<T> repeat(size_t repeats, GeneratorWrapper<T>&& generator) {
return GeneratorWrapper<T>(pf::make_unique<RepeatGenerator<T>>(repeats, std::move(generator))); return GeneratorWrapper<T>(std::make_unique<RepeatGenerator<T>>(repeats, std::move(generator)));
} }
template <typename T, typename U, typename Func> template <typename T, typename U, typename Func>
@ -176,14 +176,14 @@ namespace Generators {
template <typename Func, typename U, typename T = FunctionReturnType<Func, U>> template <typename Func, typename U, typename T = FunctionReturnType<Func, U>>
GeneratorWrapper<T> map(Func&& function, GeneratorWrapper<U>&& generator) { GeneratorWrapper<T> map(Func&& function, GeneratorWrapper<U>&& generator) {
return GeneratorWrapper<T>( return GeneratorWrapper<T>(
pf::make_unique<MapGenerator<T, U, Func>>(std::forward<Func>(function), std::move(generator)) std::make_unique<MapGenerator<T, U, Func>>(std::forward<Func>(function), std::move(generator))
); );
} }
template <typename T, typename U, typename Func> template <typename T, typename U, typename Func>
GeneratorWrapper<T> map(Func&& function, GeneratorWrapper<U>&& generator) { GeneratorWrapper<T> map(Func&& function, GeneratorWrapper<U>&& generator) {
return GeneratorWrapper<T>( return GeneratorWrapper<T>(
pf::make_unique<MapGenerator<T, U, Func>>(std::forward<Func>(function), std::move(generator)) std::make_unique<MapGenerator<T, U, Func>>(std::forward<Func>(function), std::move(generator))
); );
} }
@ -226,7 +226,7 @@ namespace Generators {
template <typename T> template <typename T>
GeneratorWrapper<std::vector<T>> chunk(size_t size, GeneratorWrapper<T>&& generator) { GeneratorWrapper<std::vector<T>> chunk(size_t size, GeneratorWrapper<T>&& generator) {
return GeneratorWrapper<std::vector<T>>( return GeneratorWrapper<std::vector<T>>(
pf::make_unique<ChunkGenerator<T>>(size, std::move(generator)) std::make_unique<ChunkGenerator<T>>(size, std::move(generator))
); );
} }

View File

@ -68,7 +68,7 @@ typename std::enable_if<std::is_integral<T>::value && !std::is_same<T, bool>::va
GeneratorWrapper<T>>::type GeneratorWrapper<T>>::type
random(T a, T b) { random(T a, T b) {
return GeneratorWrapper<T>( return GeneratorWrapper<T>(
pf::make_unique<RandomIntegerGenerator<T>>(a, b) std::make_unique<RandomIntegerGenerator<T>>(a, b)
); );
} }
@ -77,7 +77,7 @@ typename std::enable_if<std::is_floating_point<T>::value,
GeneratorWrapper<T>>::type GeneratorWrapper<T>>::type
random(T a, T b) { random(T a, T b) {
return GeneratorWrapper<T>( return GeneratorWrapper<T>(
pf::make_unique<RandomFloatingGenerator<T>>(a, b) std::make_unique<RandomFloatingGenerator<T>>(a, b)
); );
} }
@ -118,13 +118,13 @@ public:
template <typename T> template <typename T>
GeneratorWrapper<T> range(T const& start, T const& end, T const& step) { GeneratorWrapper<T> range(T const& start, T const& end, T const& step) {
static_assert(std::is_arithmetic<T>::value && !std::is_same<T, bool>::value, "Type must be numeric"); static_assert(std::is_arithmetic<T>::value && !std::is_same<T, bool>::value, "Type must be numeric");
return GeneratorWrapper<T>(pf::make_unique<RangeGenerator<T>>(start, end, step)); return GeneratorWrapper<T>(std::make_unique<RangeGenerator<T>>(start, end, step));
} }
template <typename T> template <typename T>
GeneratorWrapper<T> range(T const& start, T const& end) { GeneratorWrapper<T> range(T const& start, T const& end) {
static_assert(std::is_integral<T>::value && !std::is_same<T, bool>::value, "Type must be an integer"); static_assert(std::is_integral<T>::value && !std::is_same<T, bool>::value, "Type must be an integer");
return GeneratorWrapper<T>(pf::make_unique<RangeGenerator<T>>(start, end)); return GeneratorWrapper<T>(std::make_unique<RangeGenerator<T>>(start, end));
} }
@ -158,13 +158,13 @@ template <typename InputIterator,
typename InputSentinel, typename InputSentinel,
typename ResultType = typename std::iterator_traits<InputIterator>::value_type> typename ResultType = typename std::iterator_traits<InputIterator>::value_type>
GeneratorWrapper<ResultType> from_range(InputIterator from, InputSentinel to) { GeneratorWrapper<ResultType> from_range(InputIterator from, InputSentinel to) {
return GeneratorWrapper<ResultType>(pf::make_unique<IteratorGenerator<ResultType>>(from, to)); return GeneratorWrapper<ResultType>(std::make_unique<IteratorGenerator<ResultType>>(from, to));
} }
template <typename Container, template <typename Container,
typename ResultType = typename Container::value_type> typename ResultType = typename Container::value_type>
GeneratorWrapper<ResultType> from_range(Container const& cnt) { GeneratorWrapper<ResultType> from_range(Container const& cnt) {
return GeneratorWrapper<ResultType>(pf::make_unique<IteratorGenerator<ResultType>>(cnt.begin(), cnt.end())); return GeneratorWrapper<ResultType>(std::make_unique<IteratorGenerator<ResultType>>(cnt.begin(), cnt.end()));
} }

View File

@ -40,7 +40,7 @@ namespace Catch {
class ListenerFactory : public IReporterFactory { class ListenerFactory : public IReporterFactory {
IStreamingReporterPtr create( ReporterConfig const& config ) const override { IStreamingReporterPtr create( ReporterConfig const& config ) const override {
return std::unique_ptr<T>( new T( config ) ); return std::make_unique<T>(config);
} }
std::string getDescription() const override { std::string getDescription() const override {
return std::string(); return std::string();

View File

@ -108,7 +108,7 @@ namespace Catch {
mutable std::ostream m_os; mutable std::ostream m_os;
public: public:
DebugOutStream() DebugOutStream()
: m_streamBuf( new StreamBufImpl<OutputDebugWriter>() ), : m_streamBuf( std::make_unique<StreamBufImpl<OutputDebugWriter>>() ),
m_os( m_streamBuf.get() ) m_os( m_streamBuf.get() )
{} {}