сложносоставной список
От: Аноним  
Дата: 21.02.09 03:15
Оценка:
началось все с этого
Автор:
Дата: 20.02.09
... после бдений и обработки напильником получилось нижеописанное. почему-то стойкое ощущение того, что изобрел велосипед...
//////////////////////////////////////////////////////////////////////////////////////////
template <typename Item>
class compound_list
{
    typedef Item                                    item;
    //typedef std::list<item*>                        item_list;
    // кому что нравится, но вариант с std::list будет жрать прорву памяти
    // при сомнительной выгоде вставки/удаления
    typedef std::vector<item*>                        item_list;
    typedef typename item_list::iterator            item_it;

    item_list                m_listItems;
public:
    inline                    compound_list(void)        { }
    inline                    ~compound_list(void)    { DeleteAllItems(); }
public:
    inline void                AddItem(item* pItem)
    { m_listItems.push_back(pItem); }
    inline void                AddSubItem(item* pParentItem, item* pItem)
    { pParentItem->AddItem(pItem); }

    inline void                DeleteAllItems(void)
    {
        int                        iSize                    = m_listItems.size();
        if(iSize)
        {
            item_it                    pCursor                    = m_listItems.begin();
            do { delete *pCursor; ++pCursor; } while(--iSize);
        }
    }
};
//////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////
struct item                { virtual ~item(void) { } };
template <typename Ctrl>
struct item_impl : public item, public Ctrl        { };

template <typename Ctrl>
item*                    CreateItem(void)        { return new item_impl<Ctrl>; }
//////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////
class hierarchy_item
{
    typedef compound_list<hierarchy_item>            item_list;

    item_list                m_listItems;
public:
    virtual                    ~hierarchy_item(void)    { }
    inline void                AddItem(hierarchy_item* pItem)
    { m_listItems.AddItem(pItem); }
};
template <typename Ctrl>
struct hierarhy_item_impl : public hierarchy_item, public Ctrl            { };

template <typename Ctrl>
hierarchy_item*            CreateHierarchyItem(void)
{ return new hierarhy_item_impl<Ctrl>; }
//////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////
class static_ctrl        { };
class edit_ctrl            { };
//////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////
void                    TestCompoundList(void)
{
    {
    // плоский однородный список
    typedef compound_list<static_ctrl>                compound_list;
    compound_list            listHomogeneous;
    listHomogeneous.AddItem(new static_ctrl());
    listHomogeneous.AddItem(new static_ctrl());
    listHomogeneous.AddItem(new static_ctrl());
    listHomogeneous.AddItem(new static_ctrl());
    }
    {
    // плоский разнородный список
    typedef compound_list<item>                        compound_list;
    compound_list            listHeterogeneous;
    listHeterogeneous.AddItem(CreateItem<static_ctrl>());
    listHeterogeneous.AddItem(CreateItem<edit_ctrl>());
    listHeterogeneous.AddItem(CreateItem<static_ctrl>());
    listHeterogeneous.AddItem(CreateItem<edit_ctrl>());
    }

    {
    // иерархический разнородный список
    typedef compound_list<hierarchy_item>            compound_list;
    hierarchy_item*            pItem                    = NULL;
    hierarchy_item*            pSubItem                = NULL;
    compound_list            listHeterogeneous;

    pItem                    = CreateHierarchyItem<static_ctrl>();
    listHeterogeneous.AddItem(pItem);
    pSubItem                = CreateHierarchyItem<edit_ctrl>();
    listHeterogeneous.AddSubItem(pItem, pSubItem);
    listHeterogeneous.AddSubItem(pSubItem, CreateHierarchyItem<static_ctrl>());

    pItem                    = CreateHierarchyItem<edit_ctrl>();
    listHeterogeneous.AddItem(pItem);
    listHeterogeneous.AddSubItem(pItem, CreateHierarchyItem<static_ctrl>());
    }
}
//////////////////////////////////////////////////////////////////////////////////////////
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.