rbtree: add RB_DECLARE_CALLBACKS() macro
[firefly-linux-kernel-4.4.55.git] / include / linux / rbtree.h
index 4ace31b33380e5672f59d16c07592392bf9511bd..8d1e83b1c87b6a6c45f3f1aeae2ceb807a8e7b61 100644 (file)
@@ -79,6 +79,36 @@ rb_insert_augmented(struct rb_node *node, struct rb_root *root,
        __rb_insert_augmented(node, root, augment->rotate);
 }
 
+#define RB_DECLARE_CALLBACKS(rbstatic, rbname, rbstruct, rbfield,            \
+                            rbtype, rbaugmented, rbcompute)                  \
+static void rbname ## _propagate(struct rb_node *rb, struct rb_node *stop)    \
+{                                                                            \
+       while (rb != stop) {                                                  \
+               rbstruct *node = rb_entry(rb, rbstruct, rbfield);             \
+               rbtype augmented = rbcompute(node);                           \
+               if (node->rbaugmented == augmented)                           \
+                       break;                                                \
+               node->rbaugmented = augmented;                                \
+               rb = rb_parent(&node->rbfield);                               \
+       }                                                                     \
+}                                                                            \
+static void rbname ## _copy(struct rb_node *rb_old, struct rb_node *rb_new)   \
+{                                                                            \
+       rbstruct *old = rb_entry(rb_old, rbstruct, rbfield);                  \
+       rbstruct *new = rb_entry(rb_new, rbstruct, rbfield);                  \
+       new->rbaugmented = old->rbaugmented;                                  \
+}                                                                            \
+static void rbname ## _rotate(struct rb_node *rb_old, struct rb_node *rb_new) \
+{                                                                            \
+       rbstruct *old = rb_entry(rb_old, rbstruct, rbfield);                  \
+       rbstruct *new = rb_entry(rb_new, rbstruct, rbfield);                  \
+       new->rbaugmented = old->rbaugmented;                                  \
+       old->rbaugmented = rbcompute(old);                                    \
+}                                                                            \
+rbstatic const struct rb_augment_callbacks rbname = {                        \
+       rbname ## _propagate, rbname ## _copy, rbname ## _rotate              \
+};
+
 
 /* Find logical next and previous nodes in a tree */
 extern struct rb_node *rb_next(const struct rb_node *);