
J.D. Koftinoff Software, ltd.
The
For instance, on a PPC processor, the
e-mail me for more info. Here is the tree and an example c++ program using it.
#ifndef __JDK_FASTTREE_H
#define __JDK_FASTTREE_H
template <typename VALUE, int RANGE, typename KEYTYPE>
struct jdk_fasttree
{
typedef VALUE value_t;
enum
{
range_mask = RANGE-1,
range = RANGE
};
typedef KEYTYPE key_t;
typedef jdk_fasttree<VALUE,RANGE,KEYTYPE> type_t;
value_t result;
type_t * parent;
type_t * table[RANGE];
struct iterator_callback
{
virtual bool operator() ( key_t *key, int len, value_t value ) = 0;
};
inline jdk_fasttree()
: result(),
parent(0)
{
for( int i=0; i<range; ++i )
{
table[i] = 0;
}
}
inline jdk_fasttree( type_t *parent_ )
: result(),
parent( parent_ )
{
for( int i=0; i<range; ++i )
{
table[i] = 0;
}
}
inline ~jdk_fasttree()
{
for( int i=0; i<range; ++i )
{
if( table[i] )
delete table[i];
}
}
inline void add( const key_t *buf, int len, value_t v )
{
type_t * t = this;
while( len-- )
{
key_t c = (*buf)&range_mask;
if( !t->table[c] )
{
t->table[c] = new type_t(t);
}
t = t->table[c];
++buf;
}
t->result = v;
}
inline value_t find( const key_t *buf, int len )
{
type_t * t = this;
while( len-- )
{
t = t->table[ *(buf++)&(range_mask) ];
if( !t )
{
return 0;
}
}
return t->result;
}
inline const value_t find( const key_t *buf, int len ) const
{
type_t * t = this;
while( len-- )
{
t = t->table[ *(buf++)&(range_mask) ];
if( !t )
{
return 0;
}
}
return t->result;
}
inline bool remove( const key_t *buf, int len )
{
type_t * last_fork = this;
int last_fork_pos=0;
int pos=0;
type_t * t = this;
// follow the branch, but remember where the last fork in the branch is
while( len-- )
{
int entry_count=0;
for(int i=0; i<range; ++i )
{
entry_count += (int)(t->table[i]!=0);
}
if( entry_count>1 )
{
last_fork_pos = pos;
last_fork = t;
}
t = t->table[ buf[pos]&(range_mask) ];
if( !t )
{
return false;
}
++pos;
}
// ok, we found a match. Now delete the branch starting from our last fork position
type_t **kill_point = &last_fork->table[ buf[last_fork_pos]&(range_mask) ];
delete *kill_point;
*kill_point = 0;
return true;
}
inline bool iterate( key_t *buf, int max_len, iterator_callback &cb, int buf_pos=0 )
{
if( buf_pos>=max_len )
{
return false;
}
if( buf_pos>0 )
{
if( !cb( buf, buf_pos, result ) )
{
return false;
}
}
for(int i=0; i<range; ++i )
{
if( table[i] )
{
buf[buf_pos]=i;
if( !table[i]->iterate( buf, max_len, cb, buf_pos+1 ) )
{
return false;
}
}
}
return true;
}
};
#endif
#include <iostream>
#include <string>
#include "jdk_fasttree.h"
typedef jdk_fasttree<int,128,char> my_tree;
template <class TREE>
struct my_iterator : public TREE::iterator_callback
{
bool operator () ( typename TREE::key_t *key, int len, typename TREE::value_t value )
{
if( value!=0 )
{
for( int i=0; i<len; ++i )
{
std::cout << char(key[i]);
}
std::cout << std::endl;
}
return true;
}
};
my_tree::value_t find( my_tree &tree, const char *str_to_find )
{
int len_of_str=strlen(str_to_find);
return tree.find( str_to_find, len_of_str );
}
int main(int argc, char **argv )
{
my_tree tree;
tree.add( "testing1", strlen("testing1"), 1 );
tree.add( "testtree", strlen("testtree"), 2 );
tree.add( "jeffrey", strlen("jeffrey"), 3 );
tree.add( "macintosh", strlen("macintosh"), 4 );
tree.remove( "jeffrey", strlen("jeffrey") );
std::cout << "Dumping tree:" << std::endl;
my_iterator<my_tree> i;
my_tree::key_t buf[1024];
tree.iterate( buf, 1024, i );
std::cout << "Finding 'macintosh' in tree:" << std::endl;
std::cout << "Value is: " << find(tree,"macintosh") << std::endl;
return 0;
}