http://damody.googlecode.com/files/tree_node.7z
就是非常簡單,想說用來放自己的壓縮檔的檔案庫管理。
最近對STL跟template愈來愈熟之後,回去寫VB.NET跟C#有種不順手的感覺qq
5/29修正RemoveAllByName的bug

TreeNode.hpp

#pragma once
#include <cstring>
#include <vector>
#include <string>
#include <ostream>
#include <cassert>

template<typename T>
class TreeNode
{
public:
    typedef TreeNode<T>* TNodePtr;
    typedef TreeNode<T> TNode;
    typedef std::vector<TNode> Container;
    typedef typename std::vector<TNodePtr>::iterator pre_iterator;
    typedef typename Container::iterator iterator;
    T m_data;
    TNodePtr parent;
    std::wstring m_name;
protected:
    Container m_subnode;
    std::vector<TNodePtr> m_PtrSave;
public:
    TreeNode<T>(T data, std::wstring in_name):m_name(in_name),m_data(data)
    {}
    TreeNode<T>(TreeNode<T>* tn_ptr):m_name(tn_ptr->m_name),m_data(tn_ptr->m_data)
    {}
    const Container& GetContainer()
    {
        return m_subnode;
    }
    TreeNode<T>& operator[](size_t index)
    {
        assert(index>=0 && index<m_subnode.size());
        return m_subnode[index];
    }
    void ClearMyself()
    {
        for (iterator it = m_subnode.begin();it!=m_subnode.end();it++)
        {
            it->ClearMyself();
        }
        m_subnode.clear();
    }
    void RemoveOneByName(const std::wstring in_name)
    {
        for (iterator it = m_subnode.begin();it!=m_subnode.end();it++)
        {
            if (in_name == it->m_name)
            {
                it->ClearMyself();
                m_subnode.erase(it);
                break;
            }
        }
    }
    void RemoveAllByName(const std::wstring in_name)
    {
        for (iterator it = m_subnode.begin();it!=m_subnode.end();it++)
        {
            if (in_name == it->m_name)
            {
                it->ClearMyself();
                it = m_subnode.erase(it);
            }
        }
    }
    void RemoveByPtr(TreeNode<T>* in_ptr)
    {
        for (iterator it = m_subnode.begin();it!=m_subnode.end();it++)
        {
            if (in_ptr == &(*it))
            {
                it->ClearMyself();
                m_subnode.erase(it);
                break;
            }
        }
    }
    void RemoveByRef(TreeNode<T>& in_ptr)
    {
        for (iterator it = m_subnode.begin();it!=m_subnode.end();it++)
        {
            if (&in_ptr == &*it)
            {
                it->ClearMyself();
                m_subnode.erase(it);
                break;
            }
        }
    }
    bool empty()
    {
        return m_subnode.empty();
    }
    void AddData(T in_data, const std::wstring& name)
    {
        m_subnode.push_back(TreeNode(in_data, name));
    }
    void AddNode(TreeNode<T>* in_node)
    {
        m_subnode.push_back(TreeNode(in_node));
    }
    iterator begin()
    {
        return m_subnode.begin();
    }
    iterator end()
    {
        return m_subnode.end();
    }
    pre_iterator pre_begin()
    {
        m_PtrSave.clear();
        for (iterator it = m_subnode.begin();it!=m_subnode.end();it++)
        {
            m_PtrSave.push_back(&(*it));
            traverse(it);
        }
        return m_PtrSave.begin();
    }
    void traverse(iterator in_it)
    {
        for (iterator it = in_it->m_subnode.begin();it!=in_it->m_subnode.end();it++)
        {
            m_PtrSave.push_back(&(*it));
            traverse(it);
        }
    }
    pre_iterator pre_end()
    {
        return m_PtrSave.end();
    }
    iterator find(const std::wstring& in_name)
    {
        for (iterator it = m_subnode.begin();it!=m_subnode.end();it++)
        {
            if (in_name == it->m_name)
                return it;
        }
        return it;
    }
    friend std::wostream& operator<< (std::wostream& os, TreeNode<T>& tn)
    {
        os << tn.m_name.c_str();
        return os;
    }
};



arrow
arrow
    全站熱搜

    讓地獄深紅的天亮 發表在 痞客邦 留言(1) 人氣()