356
373
return el == &list->last_ref()->next;
375
friend class error_list_iterator;
360
template <class T> class List_iterator;
362
378
template <class T> class List :public base_list
365
typedef List_iterator<T> iterator;
367
friend class List_iterator<T>;
369
381
inline List() :base_list() {}
370
382
inline List(const List<T> &tmp) :base_list(tmp) {}
371
inline List(const List<T> &tmp, memory::Root *mem_root) :
383
inline List(const List<T> &tmp, MEM_ROOT *mem_root) :
372
384
base_list(tmp, mem_root) {}
373
385
inline bool push_back(T *a) { return base_list::push_back(a); }
374
inline bool push_back(T *a, memory::Root *mem_root)
386
inline bool push_back(T *a, MEM_ROOT *mem_root)
375
387
{ return base_list::push_back(a, mem_root); }
376
388
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()); }
389
inline T* head() {return (T*) base_list::head(); }
390
inline T** head_ref() {return (T**) base_list::head_ref(); }
391
inline T* pop() {return (T*) base_list::pop(); }
379
392
inline void concat(List<T> *list) { base_list::concat(list); }
380
393
inline void disjoin(List<T> *list) { base_list::disjoin(list); }
381
394
inline void prepand(List<T> *list) { base_list::prepand(list); }
400
408
template <class T> class List_iterator :public base_list_iterator
403
List_iterator(List<T>& a, list_node** b) : base_list_iterator(a, b) {};
411
List_iterator(List<T> &a) : base_list_iterator(a) {}
412
List_iterator() : base_list_iterator() {}
413
inline void init(List<T> &a) { base_list_iterator::init(a); }
405
414
inline T* operator++(int) { return (T*) base_list_iterator::next(); }
406
415
inline T *replace(T *a) { return (T*) base_list_iterator::replace(a); }
407
416
inline T *replace(List<T> &a) { return (T*) base_list_iterator::replace(a); }
417
inline void rewind(void) { base_list_iterator::rewind(); }
418
inline void remove() { base_list_iterator::remove(); }
419
inline void after(T *a) { base_list_iterator::after(a); }
408
420
inline T** ref(void) { return (T**) base_list_iterator::ref(); }
424
template <class T> class List_iterator_fast :public base_list_iterator
427
inline T *replace(T *) { return (T*) 0; }
428
inline T *replace(List<T> &) { return (T*) 0; }
429
inline void remove(void) { }
430
inline void after(T *a) { }
431
inline T** ref(void) { return (T**) 0; }
434
inline List_iterator_fast(List<T> &a) : base_list_iterator(a) {}
435
inline List_iterator_fast() : base_list_iterator() {}
436
inline void init(List<T> &a) { base_list_iterator::init(a); }
437
inline T* operator++(int) { return (T*) base_list_iterator::next_fast(); }
438
inline void rewind(void) { base_list_iterator::rewind(); }
439
void sublist(List<T> &list_arg, uint32_t el_arg)
441
base_list_iterator::sublist(list_arg, el_arg);
447
A simple intrusive list which automaticly removes element from list
448
on delete (for Session element)
453
struct ilink **prev,*next;
454
static void *operator new(size_t size)
456
return (void*)malloc((uint32_t)size);
458
static void operator delete(void* ptr_arg, size_t)
460
free((unsigned char*)ptr_arg);
469
/* Extra tests because element doesn't have to be linked */
470
if (prev) *prev= next;
471
if (next) next->prev=prev;
474
virtual ~ilink() { unlink(); } /*lint -e1740 */
478
/* Needed to be able to have an I_List of char* strings in mysqld.cc. */
480
class i_string: public ilink
484
i_string():ptr(0) { }
485
i_string(const char* s) : ptr(s) {}
488
/* needed for linked list of two strings for replicate-rewrite-db */
489
class i_string_pair: public ilink
494
i_string_pair():key(0),val(0) { }
495
i_string_pair(const char* key_arg, const char* val_arg) :
496
key(key_arg),val(val_arg) {}
500
template <class T> class I_List_iterator;
503
WARNING: copy constructor of this class does not create a usable
504
copy, as its members may point at each other.
510
struct ilink *first,last;
511
inline void empty() { first= &last; last.prev= &first; }
512
base_ilist() { empty(); }
513
inline bool is_empty() { return first == &last; }
514
inline void append(ilink *a)
516
first->prev= &a->next;
517
a->next=first; a->prev= &first; first=a;
519
inline void push_back(ilink *a)
526
inline struct ilink *get()
528
struct ilink *first_link=first;
529
if (first_link == &last)
531
first_link->unlink(); // Unlink from list
534
inline struct ilink *head()
536
return (first != &last) ? first : 0;
538
friend class base_list_iterator;
542
class base_ilist_iterator
545
struct ilink **el,*current;
547
base_ilist_iterator(base_ilist &list_par) :list(&list_par),
548
el(&list_par.first),current(0) {}
551
/* This is coded to allow push_back() while iterating */
553
if (current == &list->last) return 0;
561
class I_List :private base_ilist
564
I_List() :base_ilist() {}
565
inline void empty() { base_ilist::empty(); }
566
inline bool is_empty() { return base_ilist::is_empty(); }
567
inline void append(T* a) { base_ilist::append(a); }
568
inline void push_back(T* a) { base_ilist::push_back(a); }
569
inline T* get() { return (T*) base_ilist::get(); }
570
inline T* head() { return (T*) base_ilist::head(); }
572
friend class I_List_iterator<T>;
577
template <class T> class I_List_iterator :public base_ilist_iterator
580
I_List_iterator(I_List<T> &a) : base_ilist_iterator(a) {}
581
inline T* operator++(int) { return (T*) base_ilist_iterator::next(); }
412
585
Make a deep copy of each list element.