YoushouldhavereceivedacopyoftheGNUGeneralPublicLicense alongwiththisprogram;ifnot,writetotheFreeSoftware
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */
template <typename T> class SQL_I_List :public Sql_alloc
{ public:
uint elements; /** The first element in the list. */
T *first; /** A reference to the next element in the list. */
T **next;
List::elementsissetasfollows: -0ifsomethinggoeswrong(EOM). -1ifeverythingwentfine.
*/ inline List(const T &a, MEM_ROOT *mem_root)
{
T *pa= new (mem_root) T(a); // Copy the element to mem_root if (pa)
push_back(pa, mem_root); // Add the copy to the list
} inlinebool push_back(const T *a) { return base_list::push_back((void *)a); } inlinebool push_back(const T *a, MEM_ROOT *mem_root)
{ return base_list::push_back((void*) a, mem_root); } inlinebool push_front(const T *a) { return base_list::push_front(a); } inlinebool push_front(const T *a, MEM_ROOT *mem_root)
{ return base_list::push_front((void*) a, mem_root); } inline T* head() {return (T*) base_list::head(); } inlineconst T* head() const {return (const T*) base_list::head(); } inline T** head_ref() {return (T**) base_list::head_ref(); } inline T* pop() {return (T*) base_list::pop(); } inlinevoid append(List<T> *list) { base_list::append(list); } inlinevoid prepend(List<T> *list) { base_list::prepend(list); } inlinevoid disjoin(List<T> *list) { base_list::disjoin(list); } inlinebool add_unique(T *a, bool (*eq)(T *a, T *b))
{ return base_list::add_unique<T>(a, eq); } inlinebool copy(const List<T> *list, MEM_ROOT *root)
{ return base_list::copy(list, root); } void delete_elements(void)
{
list_node *element,*next; for (element=first; element != &end_of_list; element=next)
{
next=element->next; delete (T*) element->info;
}
empty();
}
T *elem(uint n) { return (T*) base_list::elem(n); } // Create a new list with one element static List<T> *make(MEM_ROOT *mem_root, T *first)
{
List<T> *res= new (mem_root) List<T>; return res == NULL || res->push_back(first, mem_root) ? NULL : res;
}
class Iterator; using value_type= T; using iterator= Iterator;
iterator begin() const { return iterator(first); }
iterator end() const { return iterator(); }
class Iterator
{ public: using iterator_category= std::forward_iterator_tag; using value_type= T; using difference_type= std::ptrdiff_t; using pointer= T *; using reference= T &;
template <class T> inlinevoid bubble_sort(List<T> *list_to_sort, int (*sort_func)(T *a, T *b, void *arg), void *arg)
{ bool swap;
T **ref1= 0;
T **ref2= 0;
List_iterator<T> it(*list_to_sort); do
{
T **last_ref= ref1;
T *item1= it++;
ref1= it.ref();
T *item2;
inline ilink()
{
prev=0; next=0;
} inlinevoid unlink()
{ /* Extra tests because element doesn't have to be linked */ if (prev) *prev= next; if (next) next->prev=prev;
prev=0 ; next=0;
} inlinevoid assert_linked()
{
DBUG_ASSERT(prev != 0 && next != 0);
} inlinevoid assert_not_linked()
{
DBUG_ASSERT(prev == 0 && next == 0);
} virtual ~ilink() { unlink(); } /*lint -e1740 */
};
/* Needed to be able to have an I_List of char* strings in mysqld.cc. */
class i_string: public ilink
{ public: constchar* ptr;
i_string():ptr(0) { }
i_string(constchar* s) : ptr(s) {}
};
/* needed for linked list of two strings for replicate-rewrite-db */ class i_string_pair: public ilink
{ public: constchar* key; constchar* val;
i_string_pair():key(0),val(0) { }
i_string_pair(constchar* key_arg, constchar* val_arg) :
key(key_arg),val(val_arg) {}
};
template <class T> class I_List_iterator;
class base_ilist
{ struct ilink *first; struct ilink last; public: inlinevoid empty() { first= &last; last.prev= &first; }
base_ilist() { empty(); } inlinebool is_empty() const { return first == &last; } // Returns true if p is the last "real" object in the list, // i.e. p->next points to the sentinel. inlinebool is_last(ilink *p) { return p->next == NULL || p->next == &last; } inlinevoid append(ilink *a)
{
first->prev= &a->next;
a->next=first; a->prev= &first; first=a;
} inlinevoid push_back(ilink *a)
{
*last.prev= a;
a->next= &last;
a->prev= last.prev;
last.prev= &a->next;
} inlinestruct ilink *get()
{ struct ilink *first_link=first; if (first_link == &last) return0;
first_link->unlink(); // Unlink from list return first_link;
} inlinestruct ilink *head()
{ return (first != &last) ? first : 0;
}
template <typename T> inline void
list_copy_and_replace_each_value(List<T> &list, MEM_ROOT *mem_root)
{ /* Make a deep copy of each element */
List_iterator<T> it(list);
T *el; while ((el= it++))
it.replace(el->clone(mem_root));
}
void free_list(I_List <i_string> *list);
#endif// INCLUDES_MYSQL_SQL_LIST_H
Messung V0.5 in Prozent
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.25Bemerkung:
(vorverarbeitet am 2026-10-08)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.