Thx a lot for the suggested changes~, I really did it the hard way!

The changes are simple and clean!  really like it,

Adopt them all,

Thanks,
Alex Wang,

On Mon, Mar 30, 2015 at 9:19 PM, Ben Pfaff <b...@nicira.com> wrote:

> On Mon, Mar 30, 2015 at 03:46:26PM -0700, Alex Wang wrote:
> > This commit adds function that allows the appending of one list
> > content to the other.  Also, it adds functions which allows list
> > to be sorted.
> >
> > Signed-off-by: Alex Wang <al...@nicira.com>
>
> I always like new basic algorithms!
>
> > +/* Appends 'src''s content to the end of 'dst'.  After 'list_join',
> 'src'
> > + * becomes an empty list. */
> > +static inline void
> > +list_join(struct ovs_list *dst, struct ovs_list *src)
> > +{
> > +    if (list_is_empty(src)) {
> > +        return;
> > +    }
> > +
> > +    list_splice(dst, list_front(src), src);
> > +}
>
> I think that list_join() can be simplified to just:
>     list_splice(dst, src->next, src);
> because if 'src' is empty then src->next == next and list_splice()
> will become a no-op because of its test for first == last.
>
> > +/* Swaps the two adjacent list elements. 'ahead' must be ahead of
> 'after'. */
> > +static inline void
> > +list_swap_adjacent(struct ovs_list *ahead, struct ovs_list *after)
> > +{
> > +    ahead->next = after->next;
> > +    ahead->next->prev = ahead;
> > +    after->prev = ahead->prev;
> > +    ahead->prev->next = after;
> > +    ahead->prev = after;
> > +    after->next = ahead;
> > +}
> > +
> > +/* Swaps the position of two list nodes, 'elem1' and 'elem2'. */
> > +static inline void
> > +list_swap(struct ovs_list *elem1, struct ovs_list *elem2)
> > +{
> > +    if (elem1 == elem2) {
> > +        return;
> > +    } else if (elem1->prev == elem2) {
> > +        /* element2 is ahead of element1. */
> > +        list_swap_adjacent(elem2, elem1);
> > +    } else if (elem2->prev == elem1) {
> > +        /* element1 is ahead of element2. */
> > +        list_swap_adjacent(elem1, elem2);
> > +    } else {
> > +        const struct ovs_list tmp = *elem1;
> > +
> > +        list_replace(elem1, elem2);
> > +        list_replace(elem2, &tmp);
> > +    }
> > +}
>
> I think that list_swap() can be simplified to the following, although I
> have not tested it:
>
>     /* Exchanges the positions of A and B, which may be in the same list
>      * or different lists. */
>     void
>     ovs_list_swap(struct ovs_list *a, struct ovs_list *b)
>     {
>       if (a != b)
>         {
>           if (a->next != b)
>             {
>               struct ovs_list *a_next = list_remove(a);
>               struct ovs_list *b_next = list_remove(b);
>               list_insert(b_next, a);
>               list_insert(a_next, b);
>             }
>           else
>             {
>               list_remove(b);
>               list_insert(a, b);
>             }
>         }
>     }
>
> >  /* Adjusts pointers around 'list' to compensate for 'list' having been
> moved
> >   * around in memory (e.g. as a consequence of realloc()), with original
> >   * location 'orig'.
> > @@ -233,6 +281,25 @@ list_back(const struct ovs_list *list_)
> >      return list->prev;
> >  }
> >
> > +/* Returns the element at position 'n', assumes the first element is
> > + * at index 0.  The 'list_' must contain at least 'n' elements. */
> > +static inline struct ovs_list *
> > +list_at_position(const struct ovs_list *list_, size_t n)
> > +{
> > +    struct ovs_list *list = CONST_CAST(struct ovs_list *, list_);
> > +    struct ovs_list *ret;
> > +    size_t cnt = 0;
> > +
> > +    for (ret = list->next; ret != list; ret = ret->next) {
> > +        if (cnt++ == n) {
> > +            return ret;
> > +        }
> > +    }
>
> I'd probably just write the following two statements as OVS_NOT_REACHED():
> > +    ovs_assert(false);
> > +
> > +    return NULL;
> > +}
>
> Thanks,
>
> Ben.
>
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to