| 
									
										
										
										
											2008-05-20 15:24:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-09 20:56:23 +00:00
										 |  |  | // Copyright 2008-2009 Daniel James.
 | 
					
						
							| 
									
										
										
										
											2008-05-20 15:24:20 +00:00
										 |  |  | // 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
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-14 17:51:34 +00:00
										 |  |  | #include <iostream>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-20 15:24:20 +00:00
										 |  |  | 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); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-04-14 17:51:34 +00:00
										 |  |  |          | 
					
						
							|  |  |  |         friend std::ostream& operator<<(std::ostream& out, object_count const& c) { | 
					
						
							|  |  |  |             out<<"[instances: "<<c.instances<<", constructions: "<<c.constructions<<"]"; | 
					
						
							|  |  |  |             return out; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2008-05-20 15:24:20 +00:00
										 |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T> | 
					
						
							|  |  |  |     struct counted_object | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         static object_count count_; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         counted_object() { count_.construct(); } | 
					
						
							|  |  |  |         counted_object(counted_object const&) { count_.construct(); } | 
					
						
							|  |  |  |         ~counted_object() { count_.destruct(); } | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T> object_count counted_object<T>::count_; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     struct globally_counted_object | 
					
						
							|  |  |  |         : counted_object<globally_counted_object> {}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-21 22:02:15 +00:00
										 |  |  |     // 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
 | 
					
						
							| 
									
										
										
										
											2008-05-20 15:24:20 +00:00
										 |  |  |     namespace { | 
					
						
							|  |  |  |         object_count& global_object_count = globally_counted_object::count_; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 |