|
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 |
|
|
dooglus |
c06ce2 |
void test_func(etl::smart_ptr<my_test_obj> smart_ptr __attribute__ ((unused)))</my_test_obj>
|
|
darco |
b3016b |
{
|
|
darco |
b3016b |
}
|
|
darco |
b3016b |
|
|
darco |
b3016b |
int loose_smart_ptr_test(void)
|
|
darco |
b3016b |
{
|
|
darco |
b3016b |
printf("smart_ptr: loose_smart_ptr test: ");
|
|
darco |
b3016b |
my_test_obj::instance_count=0;
|
|
darco |
b3016b |
|
|
darco |
b3016b |
etl::loose_smart_ptr<my_test_obj> obj_smart_ptr_loose;</my_test_obj>
|
|
darco |
b3016b |
etl::smart_ptr<my_test_obj> obj_smart_ptr2;</my_test_obj>
|
|
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 |
if(my_test_obj::instance_count!=1)
|
|
darco |
b3016b |
{
|
|
darco |
b3016b |
printf("FAILED!\n");
|
|
darco |
b3016b |
printf(__FILE__":%d: on smart_ptr assignment from new object, instance count=%d, should be 1.\n",__LINE__,my_test_obj::instance_count);
|
|
darco |
b3016b |
return 1;
|
|
darco |
b3016b |
}
|
|
darco |
b3016b |
|
|
darco |
b3016b |
obj_smart_ptr_loose=obj_smart_ptr;
|
|
darco |
b3016b |
if(obj_smart_ptr!=obj_smart_ptr_loose)
|
|
darco |
b3016b |
{
|
|
darco |
b3016b |
printf("FAILED!\n");
|
|
darco |
b3016b |
printf(__FILE__":%d: on loose_smart_ptr assignment\n",__LINE__);
|
|
darco |
b3016b |
return 1;
|
|
darco |
b3016b |
}
|
|
darco |
b3016b |
|
|
darco |
b3016b |
obj_smart_ptr2=obj_smart_ptr_loose;
|
|
darco |
b3016b |
if(my_test_obj::instance_count!=1)
|
|
darco |
b3016b |
{
|
|
darco |
b3016b |
printf("FAILED!\n");
|
|
darco |
b3016b |
printf(__FILE__":%d: on smart_ptr assignment from loose_smart_ptr, instance count=%d, should be 1.\n",__LINE__,my_test_obj::instance_count);
|
|
darco |
b3016b |
return 1;
|
|
darco |
b3016b |
}
|
|
darco |
b3016b |
|
|
darco |
b3016b |
test_func(obj_smart_ptr_loose);
|
|
darco |
b3016b |
if(my_test_obj::instance_count!=1)
|
|
darco |
b3016b |
{
|
|
darco |
b3016b |
printf("FAILED!\n");
|
|
darco |
b3016b |
printf(__FILE__":%d: on smart_ptr assignment from loose_smart_ptr, instance count=%d, should be 1.\n",__LINE__,my_test_obj::instance_count);
|
|
darco |
b3016b |
return 1;
|
|
darco |
b3016b |
}
|
|
darco |
b3016b |
}
|
|
darco |
b3016b |
|
|
darco |
b3016b |
if(my_test_obj::instance_count!=1)
|
|
darco |
b3016b |
{
|
|
darco |
b3016b |
printf("FAILED!\n");
|
|
darco |
b3016b |
printf(__FILE__":%d: on create/destroy, instance count=%d, should be 1.\n",__LINE__,my_test_obj::instance_count);
|
|
darco |
b3016b |
return 1;
|
|
darco |
b3016b |
}
|
|
darco |
b3016b |
|
|
darco |
b3016b |
printf("PASSED\n");
|
|
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();
|
|
darco |
b3016b |
error+=loose_smart_ptr_test();
|
|
dooglus |
cee594 |
|
|
darco |
b3016b |
return error;
|
|
darco |
b3016b |
}
|