Change Gee.TreeSet.Range to class
authorMaciej Piechotka <uzytkownik2@gmail.com>
Thu, 28 Apr 2011 23:45:46 +0000 (01:45 +0200)
committerMaciej Piechotka <uzytkownik2@gmail.com>
Fri, 29 Apr 2011 00:04:03 +0000 (02:04 +0200)
It fixes problem that may occured when key used as boundary is freed

gee/treeset.vala

index bcae419..6e2af21 100644 (file)
@@ -747,7 +747,7 @@ public class Gee.TreeSet<G> : AbstractSet<G>, SortedSet<G> {
                return compare_func (a, b) > 0 ? a : b;
        }
 
-       private struct Range<G> {
+       private class Range<G> {
                public Range (TreeSet<G> set, G after, G before) {
                        this.set = set;
                        if (set.compare_func (after, before) < 0) {
@@ -781,14 +781,14 @@ public class Gee.TreeSet<G> : AbstractSet<G>, SortedSet<G> {
                public Range<G> cut_head (G after) {
                        switch (type) {
                        case RangeType.HEAD:
-                               return Range<G> (set, after, before);
+                               return new Range<G> (set, after, before);
                        case RangeType.TAIL:
-                               return Range<G>.tail (set, set.max (after, this.after));
+                               return new Range<G>.tail (set, set.max (after, this.after));
                        case RangeType.EMPTY:
                                return this;
                        case RangeType.BOUNDED:
                                var _after = set.max (after, this.after);
-                               return Range<G> (set, _after, before);
+                               return new Range<G> (set, _after, before);
                        default:
                                assert_not_reached ();
                        }
@@ -797,14 +797,14 @@ public class Gee.TreeSet<G> : AbstractSet<G>, SortedSet<G> {
                public Range<G> cut_tail (G before) {
                        switch (type) {
                        case RangeType.HEAD:
-                               return Range<G>.head (set, set.min (before, this.before));
+                               return new Range<G>.head (set, set.min (before, this.before));
                        case RangeType.TAIL:
-                               return Range<G> (set, after, before);
+                               return new Range<G> (set, after, before);
                        case RangeType.EMPTY:
                                return this;
                        case RangeType.BOUNDED:
                                var _before = set.min (before, this.before);
-                               return Range<G> (set, after, _before);
+                               return new Range<G> (set, after, _before);
                        default:
                                assert_not_reached ();
                        }
@@ -815,7 +815,7 @@ public class Gee.TreeSet<G> : AbstractSet<G>, SortedSet<G> {
                                return this;
                        var _before = type != RangeType.TAIL ? set.min (before, this.before) : before;
                        var _after = type != RangeType.HEAD ? set.max (after, this.after) : after;
-                       return Range<G> (set, _after, _before);
+                       return new Range<G> (set, _after, _before);
                }
 
                public bool in_range (G item) {
@@ -891,17 +891,17 @@ public class Gee.TreeSet<G> : AbstractSet<G>, SortedSet<G> {
        private class SubSet<G> : AbstractSet<G>, SortedSet<G> {
                public SubSet (TreeSet<G> set, G after, G before) {
                        this.set = set;
-                       this.range = Range<G> (set, after, before);
+                       this.range = new Range<G> (set, after, before);
                }
 
                public SubSet.head (TreeSet<G> set, G before) {
                        this.set = set;
-                       this.range = Range<G>.head (set, before);
+                       this.range = new Range<G>.head (set, before);
                }
 
                public SubSet.tail (TreeSet<G> set, G after) {
                        this.set = set;
-                       this.range = Range<G>.tail (set, after);
+                       this.range = new Range<G>.tail (set, after);
                }
 
                public SubSet.from_range (TreeSet<G> set, Range<G> range) {