356
380
return el == &list->last_ref()->next;
382
friend class error_list_iterator;
360
template <class T> class List_iterator;
362
385
template <class T> class List :public base_list
365
typedef List_iterator<T> iterator;
367
friend class List_iterator<T>;
369
388
inline List() :base_list() {}
370
389
inline List(const List<T> &tmp) :base_list(tmp) {}
371
inline List(const List<T> &tmp, memory::Root *mem_root) :
390
inline List(const List<T> &tmp, MEM_ROOT *mem_root) :
372
391
base_list(tmp, mem_root) {}
373
392
inline bool push_back(T *a) { return base_list::push_back(a); }
374
inline bool push_back(T *a, memory::Root *mem_root)
393
inline bool push_back(T *a, MEM_ROOT *mem_root)
375
394
{ return base_list::push_back(a, mem_root); }
376
395
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()); }
396
inline T* head() {return (T*) base_list::head(); }
397
inline T** head_ref() {return (T**) base_list::head_ref(); }
398
inline T* pop() {return (T*) base_list::pop(); }
379
399
inline void concat(List<T> *list) { base_list::concat(list); }
380
400
inline void disjoin(List<T> *list) { base_list::disjoin(list); }
381
401
inline void prepand(List<T> *list) { base_list::prepand(list); }
400
415
template <class T> class List_iterator :public base_list_iterator
403
List_iterator(List<T>& a, list_node** b) : base_list_iterator(a, b) {};
418
List_iterator(List<T> &a) : base_list_iterator(a) {}
419
List_iterator() : base_list_iterator() {}
420
inline void init(List<T> &a) { base_list_iterator::init(a); }
405
421
inline T* operator++(int) { return (T*) base_list_iterator::next(); }
406
422
inline T *replace(T *a) { return (T*) base_list_iterator::replace(a); }
407
423
inline T *replace(List<T> &a) { return (T*) base_list_iterator::replace(a); }
424
inline void rewind(void) { base_list_iterator::rewind(); }
425
inline void remove() { base_list_iterator::remove(); }
426
inline void after(T *a) { base_list_iterator::after(a); }
408
427
inline T** ref(void) { return (T**) base_list_iterator::ref(); }
431
template <class T> class List_iterator_fast :public base_list_iterator
434
inline T *replace(T *) { return (T*) 0; }
435
inline T *replace(List<T> &) { return (T*) 0; }
436
inline void remove(void) { }
437
inline void after(T *a) { }
438
inline T** ref(void) { return (T**) 0; }
441
inline List_iterator_fast(List<T> &a) : base_list_iterator(a) {}
442
inline List_iterator_fast() : base_list_iterator() {}
443
inline void init(List<T> &a) { base_list_iterator::init(a); }
444
inline T* operator++(int) { return (T*) base_list_iterator::next_fast(); }
445
inline void rewind(void) { base_list_iterator::rewind(); }
446
void sublist(List<T> &list_arg, uint32_t el_arg)
448
base_list_iterator::sublist(list_arg, el_arg);
454
A simple intrusive list which automaticly removes element from list
455
on delete (for Session element)
460
struct ilink **prev,*next;
461
static void *operator new(size_t size)
463
return (void*)malloc((uint32_t)size);
465
static void operator delete(void* ptr_arg, size_t)
467
free((unsigned char*)ptr_arg);
476
/* Extra tests because element doesn't have to be linked */
477
if (prev) *prev= next;
478
if (next) next->prev=prev;
481
virtual ~ilink() { unlink(); } /*lint -e1740 */
485
/* Needed to be able to have an I_List of char* strings in mysqld.cc. */
487
class i_string: public ilink
491
i_string():ptr(0) { }
492
i_string(const char* s) : ptr(s) {}
495
/* needed for linked list of two strings for replicate-rewrite-db */
496
class i_string_pair: public ilink
501
i_string_pair():key(0),val(0) { }
502
i_string_pair(const char* key_arg, const char* val_arg) :
503
key(key_arg),val(val_arg) {}
507
template <class T> class I_List_iterator;
510
WARNING: copy constructor of this class does not create a usable
511
copy, as its members may point at each other.
517
struct ilink *first,last;
518
inline void empty() { first= &last; last.prev= &first; }
519
base_ilist() { empty(); }
520
inline bool is_empty() { return first == &last; }
521
inline void append(ilink *a)
523
first->prev= &a->next;
524
a->next=first; a->prev= &first; first=a;
526
inline void push_back(ilink *a)
533
inline struct ilink *get()
535
struct ilink *first_link=first;
536
if (first_link == &last)
538
first_link->unlink(); // Unlink from list
541
inline struct ilink *head()
543
return (first != &last) ? first : 0;
545
friend class base_list_iterator;
549
class base_ilist_iterator
552
struct ilink **el,*current;
554
base_ilist_iterator(base_ilist &list_par) :list(&list_par),
555
el(&list_par.first),current(0) {}
558
/* This is coded to allow push_back() while iterating */
560
if (current == &list->last) return 0;
568
class I_List :private base_ilist
571
I_List() :base_ilist() {}
572
inline void empty() { base_ilist::empty(); }
573
inline bool is_empty() { return base_ilist::is_empty(); }
574
inline void append(T* a) { base_ilist::append(a); }
575
inline void push_back(T* a) { base_ilist::push_back(a); }
576
inline T* get() { return (T*) base_ilist::get(); }
577
inline T* head() { return (T*) base_ilist::head(); }
579
friend class I_List_iterator<T>;
584
template <class T> class I_List_iterator :public base_ilist_iterator
587
I_List_iterator(I_List<T> &a) : base_ilist_iterator(a) {}
588
inline T* operator++(int) { return (T*) base_ilist_iterator::next(); }
412
592
Make a deep copy of each list element.