124
119
relies on this behaviour. This logic is quite tricky: please do not use
125
120
it in any new code.
127
inline base_list(const base_list &tmp) :memory::SqlAlloc()
122
inline base_list(const base_list &tmp) :Sql_alloc()
129
124
elements= tmp.elements;
130
125
first= tmp.first;
131
126
last= elements ? tmp.last : &first;
133
inline base_list(bool) { }
129
Construct a deep copy of the argument in memory root mem_root.
130
The elements themselves are copied by pointer. If you also
131
need to copy elements by value, you should employ
132
list_copy_and_replace_each_value after creating a copy.
134
base_list(const base_list &rhs, MEM_ROOT *mem_root);
135
inline base_list(bool error __attribute__((unused))) { }
134
136
inline bool push_back(void *info)
136
138
if (((*last)=new list_node(info, &end_of_list)))
385
387
inline List() :base_list() {}
386
388
inline List(const List<T> &tmp) :base_list(tmp) {}
387
inline List(const List<T> &tmp, memory::Root *mem_root) :
389
inline List(const List<T> &tmp, MEM_ROOT *mem_root) :
388
390
base_list(tmp, mem_root) {}
389
391
inline bool push_back(T *a) { return base_list::push_back(a); }
390
inline bool push_back(T *a, memory::Root *mem_root)
392
inline bool push_back(T *a, MEM_ROOT *mem_root)
391
393
{ return base_list::push_back(a, mem_root); }
392
394
inline bool push_front(T *a) { return base_list::push_front(a); }
393
395
inline T* head() {return (T*) base_list::head(); }
428
430
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 T *replace(T *a __attribute__((unused))) { return (T*) 0; }
434
inline T *replace(List<T> &a __attribute__((unused))) { return (T*) 0; }
433
435
inline void remove(void) { }
434
inline void after(T *a) { }
436
inline void after(T *a __attribute__((unused))) { }
435
437
inline T** ref(void) { return (T**) 0; }
453
A simple intrusive list which automaticly removes element from list
454
on delete (for Session element)
459
struct ilink **prev,*next;
460
static void *operator new(size_t size)
462
return (void*)malloc((uint)size);
464
static void operator delete(void* ptr_arg,
465
size_t size __attribute__((unused)))
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(); }
451
592
Make a deep copy of each list element.