From dfe6e624ca92a82532212cc9262bfff9ac56696c Mon Sep 17 00:00:00 2001 From: Nikita Malyavin Date: Fri, 9 Aug 2019 00:56:44 +1000 Subject: MDEV-20297 sql_list: add begin() and end() for List --- sql/sql_list.h | 73 +++++++++++++++++++++++++++++++++++++++++++++++----------- sql/table.cc | 2 +- 2 files changed, 60 insertions(+), 15 deletions(-) diff --git a/sql/sql_list.h b/sql/sql_list.h index f5d8ed98b02..f04f2b72a12 100644 --- a/sql/sql_list.h +++ b/sql/sql_list.h @@ -374,6 +374,13 @@ public: } #endif // LIST_EXTRA_DEBUG + + void sublist(list_node *start, base_list *l, uint elems) + { + first= start; + last= l->last; + elements= elems; + } protected: void after(void *info,list_node *node) { @@ -534,6 +541,7 @@ public: List_iterator() : base_list_iterator() {} inline void init(List &a) { base_list_iterator::init(a); } inline T* operator++(int) { return (T*) base_list_iterator::next(); } + inline void operator++() { base_list_iterator::next(); } inline T* peek() { return (T*) base_list_iterator::peek(); } inline T *replace(T *a) { return (T*) base_list_iterator::replace(a); } inline T *replace(List &a) { return (T*) base_list_iterator::replace(a); } @@ -544,24 +552,49 @@ public: }; -template class List_iterator_fast :public base_list_iterator +template class List_iterator_fast { -protected: - inline T *replace(T *) { return (T*) 0; } - inline T *replace(List &) { return (T*) 0; } - inline void remove(void) {} - inline void after(T *) {} - inline T** ref(void) { return (T**) 0; } + List *list; + list_node *elem; + friend void sublist(List_iterator_fast &it, List &list, uint elements) + { + list.first= *it.elem; + list.last= it.list->last; + list.elements= elements; + } public: - inline List_iterator_fast(List &a) : base_list_iterator(a) {} - inline List_iterator_fast() : base_list_iterator() {} - inline void init(List &a) { base_list_iterator::init(a); } - inline T* operator++(int) { return (T*) base_list_iterator::next_fast(); } - inline void rewind(void) { base_list_iterator::rewind(); } - void sublist(List &list_arg, uint el_arg) + inline List_iterator_fast(): list(NULL), elem(NULL) {} + explicit inline List_iterator_fast(List &a): list(&a), + elem(a.first_node()) {} + inline void init(List &a) { *this= List_iterator_fast(a); } + inline T* operator++(int) + { + elem= elem->next; + return static_cast(elem->info); + } + inline void operator++() + { + elem= elem->next; + } + inline T** ref() { return reinterpret_cast(&elem->info); } + inline void rewind() { elem= list->first_node(); } + void sublist(List &list_arg, uint elements) { - base_list_iterator::sublist(list_arg, el_arg); + list_arg.sublist(elem, list, elements); + } + inline bool operator != (const List_iterator_fast &it) + { + return elem != it.elem; + } + + inline T& operator *() {return *static_cast(elem->info);} + + static inline List_iterator_fast end(List &l) + { + List_iterator_fast it(l); + it.elem= &end_of_list; + return it; } }; @@ -811,4 +844,16 @@ list_copy_and_replace_each_value(List &list, MEM_ROOT *mem_root) void free_list(I_List *list); void free_list(I_List *list); +template +List_iterator_fast begin(List &l) +{ + List_iterator_fast it(l); + return it; +} + +template +List_iterator_fast end(List &l) +{ + return List_iterator_fast::end(l); +} #endif // INCLUDES_MYSQL_SQL_LIST_H diff --git a/sql/table.cc b/sql/table.cc index ea333cb2ecd..9f2b6e0f11f 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -6294,7 +6294,7 @@ TABLE *TABLE_LIST::get_real_join_table() if (!tbl->nested_join) break; /* go deeper if we've found nested join */ - ti= tbl->nested_join->join_list; + ti.init(tbl->nested_join->join_list); } } } -- cgit v1.2.1