/***************************************************************************/ // "Меркурий"-"Правда" - open source переводчик // распространяется в соответсвии с лицензией GNU v 2.0 // // Массив, которому можно дописывать в конец // Анисимов Д.В. сегодня /***************************************************************************/ # ifndef LIST_HPP # define LIST_HPP # include <malloc.h> void list_error( void ); # define DECLARE_LIST_TYPE( t,t1 ) \ \ class t1 \ { \ public: \ long j,n ; \ t *list ; \ \ t1( void ); \ ~t1( void ); \ long size( void ); \ void operator = ( t1 &a ); \ t & operator []( long i ); \ long add( t &v ); \ void resize( void ); \ void init( void ); \ void del( void ); \ } ; # define COMMON_FUNKTION( t,t1 ) \ \ t1 :: t1( void ) \ { init(); } \ \ void t1 :: init( void ) \ { \ j=n=0 ; \ list=NULL ; \ } \ \ t1 :: ~t1( void ) \ { \ del(); \ } \ \ long t1 :: size ( void ) \ { \ return n*sizeof(t1); \ } \ \ void t1 :: operator = ( t1 &a ) \ { \ if( a.j>a.n || a.n>0 && a.list==NULL ) \ { printf("\n Incorrect data in operator =" ); \ throw( a ) ; \ } \ if( this==&a ) return ; \ del(); \ /* if( list!=NULL ) free( list ); */ \ j=a.j ; \ n=a.n ; \ if( a.list==NULL ){ list=NULL ; return ; } \ list=(t *)calloc(n,sizeof(t)); \ if( list==NULL ) throw( (char )-1 ); \ for( long i=0 ; i<j ; i++ ) \ list[i]=a.list[i] ; \ } \ \ t& t1 :: operator [] (long i) \ { if( i<0 || j<=i ) \ { printf("\n Error index in t_List %ld %ld",i,j);\ list_error(); \ } \ return list[i]; \ } \ \ void t1 :: resize( void ) \ { \ n=j ; \ list=(t *)realloc( list,n*sizeof(t) ); \ if( list==NULL ) throw( (char )-1 ); \ } \ # define DEFINE_LIST_TYPE( t,t1 ) \ \ COMMON_FUNKTION( t,t1 ) \ \ void t1 :: del( void ) \ { long i ; \ for( i=0 ; i<j ; i++ ) \ list[i].del() ; \ j=n=0 ; \ if( list!=NULL ) { free(list) ; list=NULL ; } \ } \ \ long t1 :: add( t &v ) \ { \ long i ; \ t* list1 ; \ \ if( n<=0 ) \ { n=4 ; \ list=(t *)calloc( n,sizeof(t) ); \ if( list==NULL ) throw( (char )-1 ); \ for( i=j ; i<n ; i++ ) \ list[i].init( ) ; \ } \ \ if( j>=n ) \ { n=n+n/4 ; \ list1=(t *)realloc( list,n*sizeof(t) ); \ if( list1==NULL ) throw( (char )-1 ); \ list=list1 ; \ for( i=j ; i<n ; i++ ) \ list[i].init( ) ; \ } \ list[j++]=v ; \ return j-1 ; \ } \ # define DEFINE_LIST_BTYPE( t,t1 ) \ \ COMMON_FUNKTION( t,t1 ) \ \ void t1 :: del( void ) \ { \ j=n=0 ; \ if( list!=NULL ) { free(list) ; list=NULL ; } \ } \ \ long t1 :: add( t &v ) \ { \ t* list1 ; \ \ if( n<=0 ) \ { n=4 ; \ list=(t *)calloc( n,sizeof(t) ); \ if( list==NULL ) throw( (char )-1 ); \ } \ \ if( j>=n ) \ { n=n+n/4 ; \ list1=(t *)realloc( list,n*sizeof(t) ); \ if( list1==NULL ) throw( (char )-1 ); \ list=list1 ; \ } \ list[j++]=v ; \ return j-1 ; \ } \ # endif