/*
Facebook plugin for Miranda Instant Messenger
_____________________________________________
Copyright © 2009-11 Michal Zelinka, 2011-13 Robert Pösel
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#pragma once
namespace List
{
template< typename T > class Item
{
public:
std::string key;
T* data;
Item< T >* prev;
Item< T >* next;
Item( )
{
this->data = NULL;
this->prev = NULL;
this->next = NULL;
}
~Item( )
{
delete this->data;
}
};
template< typename T > class List
{
private:
Item< T >* first;
Item< T >* last;
unsigned int count;
public:
List( )
{
this->first = this->last = NULL;
this->count = 0;
}
~List( )
{
this->clear( );
}
Item< T >* begin( )
{
return first;
}
Item< T >* end( )
{
return last;
}
unsigned int size( )
{
return count;
}
bool empty( )
{
return ( this->first == NULL );
}
void insert( Item< T >* item )
{
if ( this->empty( ))
{
this->first = this->last = item;
this->count = 1;
} else { // TODO: key sorting/comparation
item->next = this->first;
this->first->prev = item;
this->first = item;
this->count++;
}
}
void insert( std::pair< std::string, T* > item )
{
Item* ins = new Item;
ins->key = item.first;
ins->data = item.second;
this->insert( ins );
}
void erase( std::string key )
{
Item< T >* help = this->first;
while ( help != NULL )
{
if ( help->key.compare( key ) != 0 )
help = help->next;
else
{
if ( help == this->first )
{
this->first = help->next;
if ( this->first != NULL )
this->first->prev = NULL;
else
this->last = NULL;
}
else if ( help == this->last )
{
this->last = help->prev;
if ( this->last != NULL )
this->last->next = NULL;
else
this->first = NULL;
}
else
{
help->prev->next = help->next;
help->next->prev = help->prev;
}
if (help != NULL)
{
this->count--;
delete help;
}
break;
}
}
}
void erase( Item< T >* item )
{
if (item != NULL)
erase( item->key );
}
T* find( std::string key )
{
Item< T >* help = this->begin( );
while ( help != NULL )
{
if ( help->key.compare( key ) != 0 )
help = help->next;
else
return help->data;
}
return NULL;
}
T* at( const unsigned int item )
{
if (item >= this->count)
return NULL;
Item< T >* help = this->begin( );
for ( unsigned int i = 0; i < item; i++ )
help = help->next;
return help->item;
}
T* operator[]( const unsigned int item )
{
return at( item );
}
void clear( )
{
Item< T >* help;
while ( this->first != NULL )
{
help = this->first;
this->first = this->first->next;
delete help;
}
this->last = NULL;
this->count = 0;
}
};
};