20
20
#ifndef DRIZZLED_SQL_LIST_H
21
21
#define DRIZZLED_SQL_LIST_H
26
27
#include <algorithm>
27
#include <drizzled/memory/sql_alloc.h>
28
#include <drizzled/visibility.h>
32
typedef struct st_sql_list
28
#include "drizzled/memory/sql_alloc.h"
33
/** Struct to handle simple linked lists. */
34
typedef struct st_sql_list {
35
36
unsigned char *first;
36
37
unsigned char **next;
39
st_sql_list() {} /* Remove gcc warning */
112
114
uint32_t elements;
114
inline void clear() { elements=0; first= &end_of_list; last=&first;}
115
inline base_list() { clear(); }
116
inline void empty() { elements=0; first= &end_of_list; last=&first;}
117
inline base_list() { empty(); }
117
119
This is a shallow copy constructor that implicitly passes the ownership
118
120
from the source list to the new instance. The old instance is not
293
297
list_node **el,**prev,*current;
295
298
void sublist(base_list &ls, uint32_t elm)
298
301
ls.last= list->last;
299
302
ls.elements= elm;
301
305
base_list_iterator()
302
306
:list(0), el(0), prev(0), current(0)
305
base_list_iterator(base_list &list_par, list_node** el0)
306
:list(&list_par), el(el0), prev(0), current(0)
309
base_list_iterator(base_list &list_par)
312
inline void init(base_list &list_par)
310
320
inline void *next(void)
356
377
return el == &list->last_ref()->next;
379
friend class error_list_iterator;
360
template <class T> class List_iterator;
362
382
template <class T> class List :public base_list
365
typedef List_iterator<T> iterator;
367
friend class List_iterator<T>;
369
385
inline List() :base_list() {}
370
386
inline List(const List<T> &tmp) :base_list(tmp) {}
371
387
inline List(const List<T> &tmp, memory::Root *mem_root) :
374
390
inline bool push_back(T *a, memory::Root *mem_root)
375
391
{ return base_list::push_back(a, mem_root); }
376
392
inline bool push_front(T *a) { return base_list::push_front(a); }
377
inline T* head() {return static_cast<T*>(base_list::head()); }
378
inline T* pop() {return static_cast<T*>(base_list::pop()); }
393
inline T* head() {return (T*) base_list::head(); }
394
inline T** head_ref() {return (T**) base_list::head_ref(); }
395
inline T* pop() {return (T*) base_list::pop(); }
379
396
inline void concat(List<T> *list) { base_list::concat(list); }
380
397
inline void disjoin(List<T> *list) { base_list::disjoin(list); }
381
398
inline void prepand(List<T> *list) { base_list::prepand(list); }
400
412
template <class T> class List_iterator :public base_list_iterator
403
List_iterator(List<T>& a, list_node** b) : base_list_iterator(a, b) {};
415
List_iterator(List<T> &a) : base_list_iterator(a) {}
416
List_iterator() : base_list_iterator() {}
417
inline void init(List<T> &a) { base_list_iterator::init(a); }
405
418
inline T* operator++(int) { return (T*) base_list_iterator::next(); }
406
419
inline T *replace(T *a) { return (T*) base_list_iterator::replace(a); }
407
420
inline T *replace(List<T> &a) { return (T*) base_list_iterator::replace(a); }
421
inline void rewind(void) { base_list_iterator::rewind(); }
422
inline void remove() { base_list_iterator::remove(); }
423
inline void after(T *a) { base_list_iterator::after(a); }
408
424
inline T** ref(void) { return (T**) base_list_iterator::ref(); }
428
template <class T> class List_iterator_fast :public base_list_iterator
431
inline T *replace(T *) { return (T*) 0; }
432
inline T *replace(List<T> &) { return (T*) 0; }
433
inline void remove(void) { }
434
inline void after(T *) { }
435
inline T** ref(void) { return (T**) 0; }
438
inline List_iterator_fast(List<T> &a) : base_list_iterator(a) {}
439
inline List_iterator_fast() : base_list_iterator() {}
440
inline void init(List<T> &a) { base_list_iterator::init(a); }
441
inline T* operator++(int) { return (T*) base_list_iterator::next_fast(); }
442
inline void rewind(void) { base_list_iterator::rewind(); }
443
void sublist(List<T> &list_arg, uint32_t el_arg)
445
base_list_iterator::sublist(list_arg, el_arg);
412
451
Make a deep copy of each list element.
426
465
template <typename T>
427
void list_copy_and_replace_each_value(List<T> &list, memory::Root *mem_root)
468
list_copy_and_replace_each_value(List<T> &list, memory::Root *mem_root)
429
470
/* Make a deep copy of each element */
430
typename List<T>::iterator it(list.begin());
471
List_iterator<T> it(list);
432
473
while ((el= it++))
433
474
it.replace(el->clone(mem_root));