Blame ETL/test/smart_ptr.cpp

darco b3016b
/*! ========================================================================
darco b3016b
** Extended Template and Library Test Suite
darco b3016b
** Smart Pointer Template Class Test
dooglus 36d01e
** $Id$
darco b3016b
**
darco b3016b
** Copyright (c) 2002 Robert B. Quattlebaum Jr.
darco b3016b
**
darco b3016b
** This package is free software; you can redistribute it and/or
darco b3016b
** modify it under the terms of the GNU General Public License as
darco b3016b
** published by the Free Software Foundation; either version 2 of
darco b3016b
** the License, or (at your option) any later version.
darco b3016b
**
darco b3016b
** This package is distributed in the hope that it will be useful,
darco b3016b
** but WITHOUT ANY WARRANTY; without even the implied warranty of
darco b3016b
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
darco b3016b
** General Public License for more details.
darco b3016b
**
darco b3016b
** === N O T E S ===========================================================
darco b3016b
**
darco b3016b
** ========================================================================= */
darco b3016b
darco b3016b
//#define DEBUGPOINT()	fprintf(stderr,__FILE__":%d: DEBUGPOINT\n",__LINE__)
darco b3016b
#define DEBUGPOINT()
darco b3016b
darco b3016b
/* === H E A D E R S ======================================================= */
darco b3016b
darco b3016b
#include <etl smart_ptr=""></etl>
darco b3016b
#include <list></list>
darco b3016b
#include <stdio.h></stdio.h>
darco b3016b
#include <stdlib.h></stdlib.h>
darco b3016b
#include <string></string>
darco b3016b
#include <map></map>
darco b3016b
darco b3016b
/* === M A C R O S ========================================================= */
darco b3016b
darco b3016b
#define NUMBER_OF_OBJECTS	40000
darco b3016b
using namespace std;
darco b3016b
darco b3016b
darco b3016b
/* === C L A S S E S ======================================================= */
darco b3016b
darco b3016b
struct my_test_obj
darco b3016b
{
darco b3016b
	static int instance_count;
darco b3016b
	int my_id;
darco b3016b
	my_test_obj(int my_id=0):my_id(my_id)
darco b3016b
	{
darco b3016b
		instance_count++;
darco b3016b
	}
darco b3016b
darco b3016b
	virtual ~my_test_obj()
darco b3016b
	{
darco b3016b
		if(instance_count==0)
darco b3016b
			printf("Error, instance count is going past zero!\n");
darco b3016b
		instance_count--;
darco b3016b
	}
darco b3016b
darco b3016b
	bool operator<(const my_test_obj &rhs)const
darco b3016b
	{
darco b3016b
		return my_id
darco b3016b
	}
darco b3016b
};
darco b3016b
darco b3016b
struct my_other_test_obj : public my_test_obj
darco b3016b
{
darco b3016b
	static int instance_count;
darco b3016b
	my_other_test_obj(int my_id=0):my_test_obj(my_id)
darco b3016b
	{
darco b3016b
		instance_count++;
darco b3016b
	}
darco b3016b
	virtual ~my_other_test_obj()
darco b3016b
	{
darco b3016b
		if(instance_count==0)
darco b3016b
			printf("Error, instance count is going past zero!\n");
darco b3016b
		instance_count--;
darco b3016b
	}
darco b3016b
};
darco b3016b
darco b3016b
int my_test_obj::instance_count=0;
darco b3016b
int my_other_test_obj::instance_count=0;
darco b3016b
darco b3016b
typedef etl::smart_ptr<my_test_obj> obj_smart_ptr;</my_test_obj>
darco b3016b
typedef etl::smart_ptr<my_other_test_obj> other_obj_smart_ptr;</my_other_test_obj>
darco b3016b
typedef list< obj_smart_ptr > obj_list;
darco b3016b
typedef list< other_obj_smart_ptr > other_obj_list;
darco b3016b
darco b3016b
int smart_ptr_basic_test(void)
darco b3016b
{
darco 117425
	printf("smart_ptr: Size of a smart_ptr: %u\n",(unsigned int)sizeof(obj_smart_ptr));
darco 117425
	printf("smart_ptr: Size of a reference_counter: %u\n",(unsigned int)sizeof(etl::reference_counter));
darco b3016b
darco b3016b
darco b3016b
	printf("smart_ptr: Basic test: ");
darco b3016b
	my_test_obj::instance_count=0;
darco b3016b
darco b3016b
	{
darco b3016b
		etl::smart_ptr<my_test_obj> obj_smart_ptr(new my_test_obj(rand()));</my_test_obj>
darco b3016b
	}
darco b3016b
darco b3016b
	if(my_test_obj::instance_count!=0)
darco b3016b
	{
darco b3016b
		printf("FAILED!\n");
dooglus 4d6768
		printf(__FILE__":%d: on create/destroy, instance count=%d, should be zero.\n",__LINE__,my_test_obj::instance_count);
darco b3016b
		return 1;
darco b3016b
	}
darco b3016b
darco b3016b
	{
darco b3016b
		DEBUGPOINT();
darco b3016b
		map<string,etl::smart_ptr<my_test_obj> > my_map;</string,etl::smart_ptr<my_test_obj>
darco b3016b
		DEBUGPOINT();
darco b3016b
		//etl::smart_ptr<my_test_obj> obj_smart_ptr(new my_test_obj(rand()));</my_test_obj>
darco b3016b
		etl::smart_ptr<my_test_obj> temp;</my_test_obj>
darco b3016b
		temp.spawn();
darco b3016b
		DEBUGPOINT();
darco b3016b
		temp.reset();
darco b3016b
		DEBUGPOINT();
darco b3016b
		my_map["bleh"]=temp;
darco b3016b
		DEBUGPOINT();
darco b3016b
	}
darco b3016b
darco b3016b
	if(my_test_obj::instance_count!=0)
darco b3016b
	{
darco b3016b
		printf("FAILED!\n");
dooglus 4d6768
		printf(__FILE__":%d: on create/destroy, instance count=%d, should be zero.\n",__LINE__,my_test_obj::instance_count);
darco b3016b
		return 1;
darco b3016b
	}
darco b3016b
darco b3016b
	etl::smart_ptr<my_test_obj> obj_smart_ptr(new my_test_obj(rand()));</my_test_obj>
darco b3016b
darco b3016b
	if(obj_smart_ptr != obj_smart_ptr.constant())
darco b3016b
	{
darco b3016b
		printf("FAILED!\n");
darco b3016b
		printf(__FILE__":%d: on call to smart_ptr<>::constant().\n",__LINE__);
darco b3016b
		return 1;
darco b3016b
	}
darco b3016b
darco b3016b
	printf("PASSED\n");
darco b3016b
darco b3016b
	return 0;
darco b3016b
}
darco b3016b
darco b3016b
int smart_ptr_general_use_test(void)
darco b3016b
{
darco b3016b
	printf("smart_ptr: General-use test: ");
darco b3016b
	my_test_obj::instance_count=0;
darco b3016b
darco b3016b
	obj_list my_list, my_other_list;
darco b3016b
	int i;
darco b3016b
darco b3016b
	for(i=0;i
darco b3016b
		my_list.push_back( obj_smart_ptr(new my_test_obj(rand())) );
darco b3016b
darco b3016b
	my_other_list=my_list;
darco b3016b
	if(my_test_obj::instance_count!=NUMBER_OF_OBJECTS)
darco b3016b
	{
darco b3016b
		printf("FAILED!\n");
darco b3016b
		printf(__FILE__":%d: On copy, instance count=%d, should be %d.\n",__LINE__,my_test_obj::instance_count,NUMBER_OF_OBJECTS);
darco b3016b
		return 1;
darco b3016b
	}
darco b3016b
darco b3016b
	my_list.sort();
darco b3016b
	if(my_test_obj::instance_count!=NUMBER_OF_OBJECTS)
darco b3016b
	{
darco b3016b
		printf("FAILED!\n");
darco b3016b
		printf(__FILE__":%d: On copy, instance count=%d, should be %d.\n",__LINE__,my_test_obj::instance_count,NUMBER_OF_OBJECTS);
darco b3016b
		return 1;
darco b3016b
	}
darco b3016b
darco b3016b
	my_list.clear();
darco b3016b
	if(my_test_obj::instance_count!=NUMBER_OF_OBJECTS)
darco b3016b
	{
darco b3016b
		printf("FAILED!\n");
darco b3016b
		printf(__FILE__":%d: On copy's clear, instance count=%d, should be %d.\n",__LINE__,my_test_obj::instance_count,NUMBER_OF_OBJECTS);
darco b3016b
		return 1;
darco b3016b
	}
darco b3016b
darco b3016b
	my_other_list.clear();
darco b3016b
	if(my_test_obj::instance_count)
darco b3016b
	{
darco b3016b
		printf("FAILED!\n");
darco b3016b
		printf(__FILE__":%d: On clear, instance count=%d, should be zero.\n",__LINE__,my_test_obj::instance_count);
darco b3016b
		return 1;
darco b3016b
	}
darco b3016b
darco b3016b
	printf("PASSED\n");
darco b3016b
darco b3016b
	return 0;
darco b3016b
}
darco b3016b
darco b3016b
int smart_ptr_inheritance_test(void)
darco b3016b
{
darco b3016b
	printf("smart_ptr: Inheritance test: ");
darco b3016b
	my_test_obj::instance_count=0;
darco b3016b
	my_other_test_obj::instance_count=0;
darco b3016b
darco b3016b
	other_obj_list my_other_list;
darco b3016b
	int i;
darco b3016b
darco b3016b
	for(i=0;i
darco b3016b
		my_other_list.push_back( other_obj_smart_ptr(new my_other_test_obj(rand())) );
darco b3016b
darco b3016b
	obj_list my_list(my_other_list.begin(),my_other_list.end());
darco b3016b
	if(my_test_obj::instance_count!=NUMBER_OF_OBJECTS)
darco b3016b
	{
darco b3016b
		printf("FAILED!\n");
darco b3016b
		printf(__FILE__":%d: On copy, instance count=%d, should be %d.\n",__LINE__,my_test_obj::instance_count,NUMBER_OF_OBJECTS);
darco b3016b
		return 1;
darco b3016b
	}
darco b3016b
darco b3016b
	for(i=0;i
darco b3016b
		my_list.push_back( other_obj_smart_ptr(new my_other_test_obj(rand())) );
darco b3016b
	if(my_other_test_obj::instance_count!=NUMBER_OF_OBJECTS*2 ||
darco b3016b
	   my_test_obj::instance_count!=my_other_test_obj::instance_count)
darco b3016b
	{
darco b3016b
		printf("FAILED!\n");
darco b3016b
		printf(__FILE__":%d: On inherited copy, instance count=%d, should be %d.\n",__LINE__,my_test_obj::instance_count,NUMBER_OF_OBJECTS*2);
darco b3016b
		return 1;
darco b3016b
	}
darco b3016b
darco b3016b
	my_list.sort();
darco b3016b
	my_other_list.sort();
darco b3016b
	if(my_test_obj::instance_count!=NUMBER_OF_OBJECTS*2)
darco b3016b
	{
darco b3016b
		printf("FAILED!\n");
darco b3016b
		printf(__FILE__":%d: On sort, instance count=%d, should be %d.\n",__LINE__,my_test_obj::instance_count,NUMBER_OF_OBJECTS*2);
darco b3016b
		return 1;
darco b3016b
	}
darco b3016b
darco b3016b
	my_list.clear();
darco b3016b
	if(my_test_obj::instance_count!=NUMBER_OF_OBJECTS)
darco b3016b
	{
darco b3016b
		printf("FAILED!\n");
darco b3016b
		printf(__FILE__":%d: On clear, instance count=%d, should be %d.\n",__LINE__,my_test_obj::instance_count,NUMBER_OF_OBJECTS);
darco b3016b
		return 1;
darco b3016b
	}
darco b3016b
darco b3016b
	my_other_list.clear();
darco b3016b
	if(my_test_obj::instance_count)
darco b3016b
	{
darco b3016b
		printf("FAILED!\n");
darco b3016b
		printf(__FILE__":%d: On clear, instance count=%d, should be zero.\n",__LINE__,my_test_obj::instance_count);
darco b3016b
		return 1;
darco b3016b
	}
darco b3016b
darco b3016b
	printf("PASSED\n");
darco b3016b
darco b3016b
	return 0;
darco b3016b
}
darco b3016b
darco b3016b
/* === E N T R Y P O I N T ================================================= */
darco b3016b
darco b3016b
int main()
darco b3016b
{
darco b3016b
	int error=0;
darco b3016b
darco b3016b
	error+=smart_ptr_basic_test();
darco b3016b
	error+=smart_ptr_general_use_test();
darco b3016b
	error+=smart_ptr_inheritance_test();
dooglus cee594
darco b3016b
	return error;
darco b3016b
}