more dsn work

This commit is contained in:
dickelbeck 2007-12-23 06:10:51 +00:00
parent c5e5815481
commit 69409a505d
1 changed files with 139 additions and 4 deletions

View File

@ -24,12 +24,123 @@
*/
#include <stdarg.h>
#include <stdio.h>
#include <cstdarg>
#include <cstdio>
#include <boost/ptr_container/ptr_vector.hpp>
#include "fctsys.h"
#include "pcbstruct.h"
#include "dsn.h"
namespace DSN {
/**
* Class ELEM
* is a base class for any DSN element. It is not a parent node so it
* cannot contain other elements but it can be extended to hold fields
* for any DSN element which contains no other elements, only fields.
*/
class ELEM
{
protected:
DSN_T type;
public:
ELEM( DSN_T aType ) :
type( aType )
{
}
virtual ~ELEM()
{
printf("~ELEM(%p %d)\n", this, Type() );
}
DSN_T Type() { return type; }
virtual void Test()
{
printf("virtual Test()\n" );
}
};
/**
* Class PARENT
* is a base class holder for any DSN element. It can contain other
* elements, including elements derived from this class.
*/
class PARENT : public ELEM
{
// see http://www.boost.org/libs/ptr_container/doc/ptr_sequence_adapter.html
typedef boost::ptr_vector<ELEM> ELEM_ARRAY;
ELEM_ARRAY kids; ///< of pointers
public:
PARENT( DSN_T aType ) :
ELEM( aType )
{
}
virtual ~PARENT()
{
printf("~PARENT(%p %d)\n", this, Type() );
}
//-----< list operations >--------------------------------------------
void Append( ELEM* aElem )
{
kids.push_back( aElem );
}
ELEM* Replace( int aIndex, ELEM* aElem )
{
ELEM_ARRAY::auto_type ret = kids.replace( aIndex, aElem );
return ret.release();
}
ELEM* Remove( int aIndex )
{
ELEM_ARRAY::auto_type ret = kids.release( kids.begin()+aIndex );
return ret.release();
}
ELEM& operator[]( int aIndex )
{
return kids[aIndex];
}
const ELEM& operator[]( int aIndex ) const
{
return kids[aIndex];
}
void Insert( int aIndex, ELEM* aElem )
{
kids.insert( kids.begin()+aIndex, aElem );
}
ELEM* At( int aIndex )
{
return &kids[aIndex];
}
void Delete( int aIndex )
{
kids.erase( kids.begin()+aIndex );
}
};
@ -43,6 +154,7 @@ class SPECCTRA_DB
FILE* fp;
/**
* Function print
* formats and writes text to the output stream.
@ -83,9 +195,32 @@ void SPECCTRA_DB::print( const char* fmt, ... )
}
void SPECCTRA_DB::Export( BOARD* aBoard )
{
}
} // namespace DSN
using namespace DSN;
// a test to verify some of the list management functions.
int main( int argc, char** argv )
{
PARENT parent( T_pcb );
PARENT* child = new PARENT( T_absolute );
parent.Append( child );
parent.At(0)->Test();
child->Append( new ELEM( T_absolute ) );
}
//EOF