mirror of
https://github.com/catchorg/Catch2.git
synced 2024-11-09 15:49:53 +01:00
b213202ad7
Added MockReporter for tracking test runs. Added intrusive smart pointer. Config holds reporter by smart pointer, so we can route the mock reporter through multiple test runs
101 lines
2.2 KiB
C++
101 lines
2.2 KiB
C++
/*
|
|
* catch_ptr.hpp
|
|
* Catch
|
|
*
|
|
* Created by Phil on 02/05/2012.
|
|
* Copyright 2012 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)
|
|
*
|
|
*/
|
|
#ifndef TWOBLUECUBES_CATCH_PTR_HPP_INCLUDED
|
|
#define TWOBLUECUBES_CATCH_PTR_HPP_INCLUDED
|
|
|
|
#include "catch_common.h"
|
|
|
|
namespace Catch
|
|
{
|
|
// An intrusive reference counting smart pointer.
|
|
// T must implement addRef() and release() methods
|
|
// typically implementing the IShared interface
|
|
template<typename T>
|
|
class Ptr
|
|
{
|
|
public:
|
|
Ptr() : m_p( NULL ){}
|
|
Ptr( T* p ) : m_p( p ){
|
|
m_p->addRef();
|
|
}
|
|
Ptr( const Ptr& other ) : m_p( other.m_p ){
|
|
m_p->addRef();
|
|
}
|
|
~Ptr(){
|
|
if( m_p )
|
|
m_p->release();
|
|
}
|
|
Ptr& operator = ( T* p ){
|
|
Ptr temp( p );
|
|
swap( temp );
|
|
return *this;
|
|
}
|
|
Ptr& operator = ( Ptr& other ){
|
|
Ptr temp( other );
|
|
swap( temp );
|
|
return *this;
|
|
}
|
|
void swap( Ptr& other ){
|
|
std::swap( m_p, other.m_p );
|
|
}
|
|
|
|
T* get(){
|
|
return m_p;
|
|
}
|
|
const T* get() const{
|
|
return m_p;
|
|
}
|
|
|
|
T& operator*(){
|
|
return *m_p;
|
|
}
|
|
const T& operator*() const{
|
|
return *m_p;
|
|
}
|
|
|
|
T* operator->(){
|
|
return m_p;
|
|
}
|
|
const T* operator->() const{
|
|
return m_p;
|
|
}
|
|
|
|
private:
|
|
T* m_p;
|
|
};
|
|
|
|
struct IShared : NonCopyable {
|
|
virtual ~IShared(){}
|
|
virtual void addRef() = 0;
|
|
virtual void release() = 0;
|
|
};
|
|
|
|
template<typename T>
|
|
struct SharedImpl : T {
|
|
|
|
SharedImpl() : m_rc( 0 ){}
|
|
|
|
virtual void addRef(){
|
|
++m_rc;
|
|
}
|
|
virtual void release(){
|
|
if( --m_rc == 0 )
|
|
delete this;
|
|
}
|
|
|
|
int m_rc;
|
|
};
|
|
|
|
} // end namespace Catch
|
|
|
|
#endif // TWOBLUECUBES_CATCH_PTR_HPP_INCLUDED
|