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