www.pudn.com > dstile-0.2.rar > Overviews.h


class TileTree {
public:
    class Node {
    public:
	Node() { for (int i = 0; i < 4; ++i) m_child[i] = 0; }
	Node* m_child[4];
    };

protected:
    void ClearR(Node *n) {
	for (int i = 0; i < 4; ++i) if (n->m_child[i]) ClearR(n->m_child[i]);
	delete n;
    }

public:
    TileTree() :
	m_root(0),
	m_count(0)
    {
	m_root = new Node();
    }
    
    ~TileTree() {
	if (m_root) ClearR(m_root);
    }

public:
    void Insert(int l, int x, int y) {
	int i;
	int c;
	Node *p, *q;
	
	p = m_root;
	for (i = l - 1; i >= 0; --i) {
	    c = ((x >> i) & 1) | (((y >> i) & 1) << 1);
	    if (!p->m_child[c]) {
		p->m_child[c] = new Node();
		++m_count;
	    }
	    p = p->m_child[c];
	}
    }
    
public:
    Node *m_root;
    unsigned int m_count;
};

class Overviews {
public:
    Overviews();
    ~Overviews();

public:
    void Insert(int l, int x, int y);
    void BuildOverviews();
    
protected:
    void BuildOverviewsR(TileTree::Node *p, int l, int x, int y);

public:
    void SetTileAccessor(TileAccessor* tileAccessor) { m_tileAccessor = tileAccessor; }
    void SetTileProcessor(TileProcessor* tileProcessor) { m_tileProcessor = tileProcessor; }
        
protected:
    GDALDriver *m_memDrv;
    map m_trees;
    TileAccessor *m_tileAccessor;
    TileProcessor *m_tileProcessor;
    unsigned int m_count;
    unsigned int m_curCount;
};