Ternary Search Trees
    bearophile 
    bearophileHUGS at lycos.com
       
    Fri Apr 17 03:16:50 PDT 2009
    
    
  
To shorten the code further I have replaced the Block struct with a typedefined fixed-size array:
struct TST(T) {
    // *** TST instance attributes here ***
    const int BLOCKSIZE = ((1 << 16) / TST.sizeof) > 1 ? ((1 << 16) / TST.sizeof) : 1;
    // usedLastBlock keeps the number of nodes used from the last block of blocks
    // there's no need to keep the whole number of blocks, because its usage is
    // slower and all the blocks but the last one are full anyway.
    static int usedLastBlock;
    typedef TST[BLOCKSIZE] Block;
    static Block*[] blocks;
    static TST* newNode() {
        if (!TST.blocks.length || TST.usedLastBlock >= Block.length) {
            // add new block
            TST.blocks.length = blocks.length + 1;
            // this whole new block gets scanned by the GC even if you need only 1 node
            TST.blocks[$-1] = new Block; // this doesn't work, you can't new a static array
            TST.usedLastBlock = 0;
        }
        return &(*(TST.blocks[$-1])[TST.usedLastBlock++]);
    }
    /// deallocate blocks of nodes
    static void free() {
        foreach (block_ptr; TST.blocks)
            delete block_ptr;
        TST.blocks.length = 0;
    }
But beside the same bug as before:
struct test.TST!(char).TST no size yet for forward reference
it's even more buggy, because now you can't even new a Block. Oh, well.
Bye,
bearophile
    
    
More information about the Digitalmars-d
mailing list