about summary refs log tree commit
path: root/ext/rpatricia/rpatricia.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/rpatricia/rpatricia.c')
-rw-r--r--ext/rpatricia/rpatricia.c33
1 files changed, 17 insertions, 16 deletions
diff --git a/ext/rpatricia/rpatricia.c b/ext/rpatricia/rpatricia.c
index a71ddac..54ac3ed 100644
--- a/ext/rpatricia/rpatricia.c
+++ b/ext/rpatricia/rpatricia.c
@@ -8,7 +8,7 @@
 #include <stdlib.h>
 #include "patricia.h"
 
-static VALUE cPatricia;
+static VALUE cPatricia, cNode;
 
 static void dummy(void) {}
 
@@ -30,6 +30,13 @@ p_node_mark (void *ptr)
   rb_gc_mark((VALUE)node->data);
 }
 
+static VALUE
+wrap_node(patricia_node_t *node)
+{
+  /* node will be freed when parent is freed */
+  return Data_Wrap_Struct(cNode, p_node_mark, 0, node);
+}
+
 static prefix_t *
 my_ascii2prefix(int family, VALUE str)
 {
@@ -70,7 +77,7 @@ p_add (int argc, VALUE *argv, VALUE self)
   PATRICIA_DATA_SET(node, user_data);
 
   /* node will be freed when parent is freed */
-  return Data_Wrap_Struct(cPatricia, p_node_mark, 0, node);
+  return wrap_node(node);
 }
 
 static VALUE
@@ -105,11 +112,7 @@ p_match (VALUE self, VALUE r_key)
   node = patricia_search_best(tree, prefix);
   Deref_Prefix (prefix);
 
-  if (node)
-    return Data_Wrap_Struct(cPatricia, p_node_mark, 0, node);
-  else
-    return Qfalse;
-
+  return node ? wrap_node(node) : Qfalse;
 }
 
 static VALUE
@@ -124,10 +127,7 @@ p_match_exact (VALUE self, VALUE r_key)
   node = patricia_search_exact(tree, prefix);
   Deref_Prefix (prefix);
 
-  if (node)
-    return Data_Wrap_Struct(cPatricia, p_node_mark, 0, node);
-  else
-    return Qfalse;
+  return node ? wrap_node(node) : Qfalse;
 }
 
 static VALUE
@@ -240,6 +240,7 @@ void
 Init_rpatricia (void)
 {
   cPatricia = rb_define_class("Patricia", rb_cObject);
+  cNode = rb_define_class_under(cPatricia, "Node", rb_cObject);
 
   /* create new Patricia object */
   rb_define_singleton_method(cPatricia, "new", p_new, 0);
@@ -270,11 +271,11 @@ Init_rpatricia (void)
   rb_define_method(cPatricia, "clear", p_destroy, 0);
 
   /*---------- methods to node ----------*/
-  rb_define_method(cPatricia, "data", p_data, 0);
-  rb_define_method(cPatricia, "show_data", p_data, 0);
-  rb_define_method(cPatricia, "network", p_network, 0);
-  rb_define_method(cPatricia, "prefix", p_prefix, 0);
-  rb_define_method(cPatricia, "prefixlen", p_prefixlen, 0);
+  rb_define_method(cNode, "data", p_data, 0);
+  rb_define_method(cNode, "show_data", p_data, 0);
+  rb_define_method(cNode, "network", p_network, 0);
+  rb_define_method(cNode, "prefix", p_prefix, 0);
+  rb_define_method(cNode, "prefixlen", p_prefixlen, 0);
   //  rb_define_method(cPatricia, "family", p_family, 0);
 
 }