/* GNU Mailutils -- a suite of utilities for electronic mail
Copyright (C) 2004-2021 Free Software Foundation, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 3 of the License, or (at your option) any later version.
This library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General
Public License along with this library. If not, see
. */
#include
using namespace mailutils;
std::list
mailutils :: mulist_to_stl (mu_list_t mu_list)
{
size_t list_count;
std::list list;
if (!mu_list)
return list;
int status = mu_list_count (mu_list, &list_count);
if (status)
return list;
for (int i = 0; i < list_count; i++)
{
void *item = NULL;
status = mu_list_get (mu_list, i, &item);
if (!status && item)
list.push_back (item);
}
return list;
}
//
// List
//
List :: List ()
{
int status = mu_list_create (&mu_list);
if (status)
throw Exception ("List::List", status);
}
List :: List (const mu_list_t lst)
{
if (lst == 0)
throw Exception ("List::List", EINVAL);
this->mu_list = lst;
}
List :: ~List ()
{
mu_list_destroy (&mu_list);
}
void
List :: append (void* item)
{
int status = mu_list_append (mu_list, item);
if (status)
throw Exception ("List::append", status);
}
void
List :: prepend (void* item)
{
int status = mu_list_prepend (mu_list, item);
if (status)
throw Exception ("List::prepend", status);
}
void
List :: insert (void* item, void* new_item, int insert_before)
{
int status = mu_list_insert (mu_list, item, new_item, insert_before);
if (status)
throw Exception ("List::insert", status);
}
void
List :: remove (void* item)
{
int status = mu_list_remove (mu_list, item);
if (status)
throw Exception ("List::remove", status);
}
void
List :: replace (void* old_item, void* new_item)
{
int status = mu_list_replace (mu_list, old_item, new_item);
if (status)
throw Exception ("List::replace", status);
}
void
List :: get (size_t index, void** pitem)
{
int status = mu_list_get (mu_list, index, pitem);
if (status)
throw Exception ("List::get", status);
}
void*
List :: get (size_t index)
{
void* pitem;
int status = mu_list_get (mu_list, index, &pitem);
if (status)
throw Exception ("List::get", status);
return pitem;
}
inline void*
List :: front ()
{
return this->get (0);
}
void*
List :: back ()
{
size_t count = this->count ();
if (count)
return this->get (count - 1);
else
return NULL;
}
Iterator
List :: begin ()
{
mu_iterator_t mu_iter;
int status = mu_list_get_iterator (this->mu_list, &mu_iter);
if (status)
throw Exception ("Iterator::begin", status);
Iterator itr = Iterator (mu_iter);
this->iter = &itr;
this->iter->first ();
return itr;
}
void
List :: to_array (void** array, size_t count, size_t* pcount)
{
int status = mu_list_to_array (mu_list, array, count, pcount);
if (status)
throw Exception ("List::to_array", status);
}
void
List :: locate (void* item, void** ret_item)
{
int status = mu_list_locate (mu_list, item, ret_item);
if (status)
throw Exception ("List::locate", status);
}
bool
List :: is_empty ()
{
return (bool) mu_list_is_empty (mu_list);
}
size_t
List :: count ()
{
size_t count = 0;
int status = mu_list_count (mu_list, &count);
if (status)
throw Exception ("List::count", status);
return count;
}
inline size_t
List :: size ()
{
return this->count ();
}
void
List :: apply (mu_list_action_t action, void* cbdata)
{
int status = mu_list_foreach (mu_list, action, cbdata);
if (status)
throw Exception ("List::apply", status);
}
mu_list_comparator_t
List :: set_comparator (mu_list_comparator_t comp)
{
return mu_list_set_comparator (mu_list, comp);
}
mu_list_destroy_item_t
List :: set_destroy_item (mu_list_destroy_item_t mu_destroy_item)
{
return mu_list_set_destroy_item (mu_list, mu_destroy_item);
}
std::list
List :: to_stl ()
{
return mulist_to_stl (mu_list);
}