| 
									
										
										
										
											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
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-03 14:11:34 +00:00
										 |  |  | #include <boost/core/lightweight_test.hpp>
 | 
					
						
							| 
									
										
										
										
											2009-04-14 17:51:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-20 15:24:20 +00:00
										 |  |  | namespace test { | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |   struct object_count | 
					
						
							|  |  |  |   { | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |     int instances; | 
					
						
							|  |  |  |     int constructions; | 
					
						
							| 
									
										
										
										
											2008-05-20 15:24:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |     object_count() : instances(0), constructions(0) {} | 
					
						
							|  |  |  |     void reset() { *this = object_count(); } | 
					
						
							| 
									
										
										
										
											2008-05-20 15:24:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |     void construct() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       ++instances; | 
					
						
							|  |  |  |       ++constructions; | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-05-20 15:24:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |     void destruct() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       if (instances == 0) { | 
					
						
							|  |  |  |         BOOST_ERROR("Unbalanced constructions."); | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  |         --instances; | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-05-20 15:24:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |     bool operator==(object_count const& x) const | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       return instances == x.instances && constructions == x.constructions; | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-05-20 15:24:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |     bool operator!=(object_count const& x) const { return !(*this == x); } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     friend std::ostream& operator<<(std::ostream& out, object_count const& c) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       out << "[instances: " << c.instances | 
					
						
							|  |  |  |           << ", constructions: " << c.constructions << "]"; | 
					
						
							|  |  |  |       return out; | 
					
						
							| 
									
										
										
										
											2008-05-20 15:24:20 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01: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
 | 
					
						
							|  |  |  |   namespace { | 
					
						
							|  |  |  |     object_count global_object_count; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   struct counted_object | 
					
						
							|  |  |  |   { | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |     counted_object() { global_object_count.construct(); } | 
					
						
							|  |  |  |     counted_object(counted_object const&) { global_object_count.construct(); } | 
					
						
							|  |  |  |     ~counted_object() { global_object_count.destruct(); } | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |   }; | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |   struct check_instances | 
					
						
							|  |  |  |   { | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |     int instances_; | 
					
						
							|  |  |  |     int constructions_; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     check_instances() | 
					
						
							|  |  |  |         : instances_(global_object_count.instances), | 
					
						
							|  |  |  |           constructions_(global_object_count.constructions) | 
					
						
							| 
									
										
										
										
											2012-07-08 11:54:47 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |     ~check_instances() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       BOOST_TEST(global_object_count.instances == instances_); | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int instances() const { return global_object_count.instances - instances_; } | 
					
						
							|  |  |  |     int constructions() const | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       return global_object_count.constructions - constructions_; | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |   }; | 
					
						
							| 
									
										
										
										
											2008-05-20 15:24:20 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 |