You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
245 lines
5.6 KiB
245 lines
5.6 KiB
/*--------------------------------------------------------------------------
|
|
Copyright (c) 2010-2011, 2013, The Linux Foundation. All rights reserved.
|
|
|
|
Redistribution and use in source and binary forms, with or without
|
|
modification, are permitted provided that the following conditions are met:
|
|
* Redistributions of source code must retain the above copyright
|
|
notice, this list of conditions and the following disclaimer.
|
|
* Redistributions in binary form must reproduce the above copyright
|
|
notice, this list of conditions and the following disclaimer in the
|
|
documentation and/or other materials provided with the distribution.
|
|
* Neither the name of The Linux Foundation nor
|
|
the names of its contributors may be used to endorse or promote
|
|
products derived from this software without specific prior written
|
|
permission.
|
|
|
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
|
OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
|
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
--------------------------------------------------------------------------*/
|
|
#ifndef _MAP_H_
|
|
#define _MAP_H_
|
|
|
|
#include <stdio.h>
|
|
|
|
template <typename T,typename T2>
|
|
class Map
|
|
{
|
|
struct node {
|
|
T data;
|
|
T2 data2;
|
|
node* prev;
|
|
node* next;
|
|
node(T t, T2 t2,node* p, node* n) :
|
|
data(t), data2(t2), prev(p), next(n) {}
|
|
};
|
|
node* head;
|
|
node* tail;
|
|
node* tmp;
|
|
unsigned size_of_list;
|
|
static Map<T,T2> *m_self;
|
|
public:
|
|
Map() : head( NULL ), tail ( NULL ),tmp(head),size_of_list(0) {}
|
|
bool empty() const {
|
|
return ( !head || !tail );
|
|
}
|
|
operator bool() const {
|
|
return !empty();
|
|
}
|
|
void insert(T,T2);
|
|
void show();
|
|
int size();
|
|
T2 find(T); // Return VALUE
|
|
T find_ele(T);// Check if the KEY is present or not
|
|
T2 begin(); //give the first ele
|
|
bool erase(T);
|
|
bool eraseall();
|
|
bool isempty();
|
|
~Map() {
|
|
while (head) {
|
|
node* temp(head);
|
|
head=head->next;
|
|
size_of_list--;
|
|
delete temp;
|
|
}
|
|
}
|
|
};
|
|
|
|
template <typename T,typename T2>
|
|
T2 Map<T,T2>::find(T d1)
|
|
{
|
|
tmp = head;
|
|
|
|
while (tmp) {
|
|
if (tmp->data == d1) {
|
|
return tmp->data2;
|
|
}
|
|
|
|
tmp = tmp->next;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
template <typename T,typename T2>
|
|
T Map<T,T2>::find_ele(T d1)
|
|
{
|
|
tmp = head;
|
|
|
|
while (tmp) {
|
|
if (tmp->data == d1) {
|
|
return tmp->data;
|
|
}
|
|
|
|
tmp = tmp->next;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
template <typename T,typename T2>
|
|
T2 Map<T,T2>::begin()
|
|
{
|
|
tmp = head;
|
|
|
|
if (tmp) {
|
|
return (tmp->data2);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
template <typename T,typename T2>
|
|
void Map<T,T2>::show()
|
|
{
|
|
tmp = head;
|
|
|
|
while (tmp) {
|
|
printf("%d-->%d\n",tmp->data,tmp->data2);
|
|
tmp = tmp->next;
|
|
}
|
|
}
|
|
|
|
template <typename T,typename T2>
|
|
int Map<T,T2>::size()
|
|
{
|
|
int count =0;
|
|
tmp = head;
|
|
|
|
while (tmp) {
|
|
tmp = tmp->next;
|
|
count++;
|
|
}
|
|
|
|
return count;
|
|
}
|
|
|
|
template <typename T,typename T2>
|
|
void Map<T,T2>::insert(T data, T2 data2)
|
|
{
|
|
tail = new node(data, data2,tail, NULL);
|
|
|
|
if ( tail->prev )
|
|
tail->prev->next = tail;
|
|
|
|
if ( empty() ) {
|
|
head = tail;
|
|
tmp=head;
|
|
}
|
|
|
|
tmp = head;
|
|
size_of_list++;
|
|
}
|
|
|
|
template <typename T,typename T2>
|
|
bool Map<T,T2>::erase(T d)
|
|
{
|
|
bool found = false;
|
|
tmp = head;
|
|
node* prevnode = tmp;
|
|
node *tempnode;
|
|
|
|
while (tmp) {
|
|
if ((head == tail) && (head->data == d)) {
|
|
found = true;
|
|
tempnode = head;
|
|
head = tail = NULL;
|
|
delete tempnode;
|
|
break;
|
|
}
|
|
|
|
if ((tmp ==head) && (tmp->data ==d)) {
|
|
found = true;
|
|
tempnode = tmp;
|
|
tmp = tmp->next;
|
|
tmp->prev = NULL;
|
|
head = tmp;
|
|
tempnode->next = NULL;
|
|
delete tempnode;
|
|
break;
|
|
}
|
|
|
|
if ((tmp == tail) && (tmp->data ==d)) {
|
|
found = true;
|
|
tempnode = tmp;
|
|
prevnode->next = NULL;
|
|
tmp->prev = NULL;
|
|
tail = prevnode;
|
|
delete tempnode;
|
|
break;
|
|
}
|
|
|
|
if (tmp->data == d) {
|
|
found = true;
|
|
prevnode->next = tmp->next;
|
|
tmp->next->prev = prevnode->next;
|
|
tempnode = tmp;
|
|
//tmp = tmp->next;
|
|
delete tempnode;
|
|
break;
|
|
}
|
|
|
|
prevnode = tmp;
|
|
tmp = tmp->next;
|
|
}
|
|
|
|
if (found)size_of_list--;
|
|
|
|
return found;
|
|
}
|
|
|
|
template <typename T,typename T2>
|
|
bool Map<T,T2>::eraseall()
|
|
{
|
|
node *tempnode;
|
|
tmp = head;
|
|
|
|
while (head) {
|
|
tempnode = head;
|
|
tempnode->next = NULL;
|
|
head = head->next;
|
|
delete tempnode;
|
|
}
|
|
|
|
tail = head = NULL;
|
|
return true;
|
|
}
|
|
|
|
|
|
template <typename T,typename T2>
|
|
bool Map<T,T2>::isempty()
|
|
{
|
|
if (!size_of_list) return true;
|
|
else return false;
|
|
}
|
|
|
|
#endif // _MAP_H_
|