#include "DATextTable.h"
#include <stdhdrs.h>
#include <strbuf.h>
#include <vararray.h>
class DATextNode
{
public:
DATextNode( const StrPtr& t )
{
left = right = 0x0;
id = 0;
text.Set( t );
};
DATextNode* getNodeFor( const StrPtr& t );
StrBuf text;
int id;
DATextNode* left;
DATextNode* right;
};
DATextTable::DATextTable(void)
{
idArray = new VarArray;
textTree = 0x0;
//Reserve id 0 to use as handy "null" value.
idArray->Put( 0x0 );
}
DATextTable::~DATextTable(void)
{
DATextNode* n;
for ( int i = 0 ; i < idArray->Count() ; i++ )
{
n = (DATextNode*)idArray->Get( i );
delete n;
}
delete idArray;
}
const StrPtr& DATextTable::getText( int id )
{
if ( id < 1 || id >= idArray->Count() ) return StrRef::Null();
DATextNode* n = (DATextNode*)idArray->Get( id );
return n->text;
}
int DATextTable::getId( const StrPtr& text )
{
DATextNode* n;
if ( !textTree )
{
n = new DATextNode( text );
indexNode( n );
textTree = n;
return n->id;
}
n = textTree->getNodeFor( text );
if ( n->id ) return n->id;
indexNode( n );
return n->id;
}
DATextNode* DATextNode::getNodeFor( const StrPtr& t )
{
int c = text.XCompare( t );
if ( c > 0 )
{
if ( left ) return left->getNodeFor( t );
left = new DATextNode( t );
return left;
}
else if ( c < 0 )
{
if ( right ) return right->getNodeFor( t );
right = new DATextNode( t );
return right;
}
else //equal
{
return this;
}
}
void DATextTable::indexNode( DATextNode* n )
{
n->id = idArray->Count();
idArray->Put( n );
}
| # | Change | User | Description | Committed | |
|---|---|---|---|---|---|
| #1 | 6297 | Sam Stafford |
Work so far on "deep annotate". Been getting a lot of questions on this lately from other people working on the same thing; might as well pool efforts. |