forked from boostorg/unordered
		
	
		
			
				
	
	
		
			90 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
 | 
						|
// Copyright 2008-2009 Daniel James.
 | 
						|
// Distributed under the Boost Software License, Version 1.0. (See accompanying
 | 
						|
// file LICENSE_1_0.txt or move at http://www.boost.org/LICENSE_1_0.txt)
 | 
						|
 | 
						|
#if !defined(BOOST_UNORDERED_TEST_HELPERS_COUNT_HEAD)
 | 
						|
#define BOOST_UNORDERED_TEST_HELPERS_COUNT_HEAD
 | 
						|
 | 
						|
#include <boost/detail/lightweight_test.hpp>
 | 
						|
 | 
						|
namespace test {
 | 
						|
struct object_count
 | 
						|
{
 | 
						|
    int instances;
 | 
						|
    int constructions;
 | 
						|
 | 
						|
    object_count() : instances(0), constructions(0) {}
 | 
						|
    void reset() { *this = object_count(); }
 | 
						|
 | 
						|
    void construct()
 | 
						|
    {
 | 
						|
        ++instances;
 | 
						|
        ++constructions;
 | 
						|
    }
 | 
						|
 | 
						|
    void destruct()
 | 
						|
    {
 | 
						|
        if (instances == 0) {
 | 
						|
            BOOST_ERROR("Unbalanced constructions.");
 | 
						|
        } else {
 | 
						|
            --instances;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    bool operator==(object_count const& x) const
 | 
						|
    {
 | 
						|
        return instances == x.instances && constructions == x.constructions;
 | 
						|
    }
 | 
						|
 | 
						|
    bool operator!=(object_count const& x) const { return !(*this == x); }
 | 
						|
 | 
						|
    friend std::ostream& operator<<(std::ostream& out, object_count const& c)
 | 
						|
    {
 | 
						|
        out << "[instances: " << c.instances
 | 
						|
            << ", constructions: " << c.constructions << "]";
 | 
						|
        return out;
 | 
						|
    }
 | 
						|
};
 | 
						|
 | 
						|
// This won't be a problem as I'm only using a single compile unit
 | 
						|
// in each test (this is actually require by the minimal test
 | 
						|
// framework).
 | 
						|
//
 | 
						|
// boostinspect:nounnamed
 | 
						|
namespace {
 | 
						|
object_count global_object_count;
 | 
						|
}
 | 
						|
 | 
						|
struct counted_object
 | 
						|
{
 | 
						|
    counted_object() { global_object_count.construct(); }
 | 
						|
    counted_object(counted_object const&) { global_object_count.construct(); }
 | 
						|
    ~counted_object() { global_object_count.destruct(); }
 | 
						|
};
 | 
						|
 | 
						|
struct check_instances
 | 
						|
{
 | 
						|
    int instances_;
 | 
						|
    int constructions_;
 | 
						|
 | 
						|
    check_instances()
 | 
						|
        : instances_(global_object_count.instances),
 | 
						|
          constructions_(global_object_count.constructions)
 | 
						|
    {
 | 
						|
    }
 | 
						|
    ~check_instances()
 | 
						|
    {
 | 
						|
        BOOST_TEST(global_object_count.instances == instances_);
 | 
						|
    }
 | 
						|
 | 
						|
    int instances() const { return global_object_count.instances - instances_; }
 | 
						|
    int constructions() const
 | 
						|
    {
 | 
						|
        return global_object_count.constructions - constructions_;
 | 
						|
    }
 | 
						|
};
 | 
						|
}
 | 
						|
 | 
						|
#endif
 |