[libgee] Add read_only_view to SortedSet
- From: Maciej Marcin Piechotka <mpiechotka src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libgee] Add read_only_view to SortedSet
- Date: Mon, 2 May 2011 10:47:48 +0000 (UTC)
commit 63c5d1c853da8817c8154cd3b2c9f9543db521ad
Author: Maciej Piechotka <uzytkownik2 gmail com>
Date: Wed Oct 7 23:59:34 2009 +0100
Add read_only_view to SortedSet
gee/Makefile.am | 2 +
gee/abstractsortedset.vala | 103 ++++++++++++++++++++++++++++++
gee/readonlysortedset.vala | 152 ++++++++++++++++++++++++++++++++++++++++++++
gee/sortedset.vala | 15 ++++
gee/treemap.vala | 16 +++++
gee/treeset.vala | 50 +++++++-------
6 files changed, 313 insertions(+), 25 deletions(-)
---
diff --git a/gee/Makefile.am b/gee/Makefile.am
index 30f6c99..bef9dc4 100644
--- a/gee/Makefile.am
+++ b/gee/Makefile.am
@@ -12,6 +12,7 @@ libgee_la_SOURCES = \
abstractmultiset.vala \
abstractqueue.vala \
abstractset.vala \
+ abstractsortedset.vala \
arraylist.vala \
bidiriterator.vala \
bidirmapiterator.vala \
@@ -39,6 +40,7 @@ libgee_la_SOURCES = \
readonlylist.vala \
readonlymap.vala \
readonlyset.vala \
+ readonlysortedset.vala \
set.vala \
sortedmap.vala \
sortedset.vala \
diff --git a/gee/abstractsortedset.vala b/gee/abstractsortedset.vala
new file mode 100644
index 0000000..7663d72
--- /dev/null
+++ b/gee/abstractsortedset.vala
@@ -0,0 +1,103 @@
+/* abstractsortedset.vala
+ *
+ * Copyright (C) 2009-2011 Maciej Piechotka
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Author:
+ * Maciej Piechotka <uzytkownik2 gmail com>
+ */
+
+/**
+ * Skeletal implementation of the { link SortedSet} interface.
+ *
+ * Contains common code shared by all set implementations.
+ *
+ * @see TreeSet
+ */
+public abstract class Gee.AbstractSortedSet<G> : Gee.AbstractSet<G>, SortedSet<G> {
+ /**
+ * { inheritDoc}
+ */
+ public abstract G first ();
+
+ /**
+ * { inheritDoc}
+ */
+ public abstract G last ();
+
+ /**
+ * { inheritDoc}
+ */
+ public abstract BidirIterator<G> bidir_iterator ();
+
+ /**
+ * { inheritDoc}
+ */
+ public abstract BidirIterator<G>? iterator_at (G element);
+
+ /**
+ * { inheritDoc}
+ */
+ public abstract G? lower (G element);
+
+ /**
+ * { inheritDoc}
+ */
+ public abstract G? higher (G element);
+
+ /**
+ * { inheritDoc}
+ */
+ public abstract G? floor (G element);
+
+ /**
+ * { inheritDoc}
+ */
+ public abstract G? ceil (G element);
+
+ /**
+ * { inheritDoc}
+ */
+ public abstract SortedSet<G> head_set (G before);
+
+ /**
+ * { inheritDoc}
+ */
+ public abstract SortedSet<G> tail_set (G after);
+
+ /**
+ * { inheritDoc}
+ */
+ public abstract SortedSet<G> sub_set (G from, G to);
+
+ private weak SortedSet<G> _read_only_view;
+
+ /**
+ * { inheritDoc}
+ */
+ public virtual new SortedSet<G> read_only_view {
+ owned get {
+ SortedSet<G> instance = _read_only_view;
+ if (_read_only_view == null) {
+ instance = new ReadOnlySortedSet<G> (this);
+ _read_only_view = instance;
+ instance.add_weak_pointer ((void**) (&_read_only_view));
+ }
+ return instance;
+ }
+ }
+}
+
diff --git a/gee/readonlysortedset.vala b/gee/readonlysortedset.vala
new file mode 100644
index 0000000..54d1786
--- /dev/null
+++ b/gee/readonlysortedset.vala
@@ -0,0 +1,152 @@
+/* readonlysortedset.vala
+ *
+ * Copyright (C) 2009 Didier Villevalois, Maciej Piechotka
+ * Copyright (C) 2011 Maciej Piechotka
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Author:
+ * Maciej Piechotka <uzytkownik2 gmail com>
+ */
+
+/**
+ * Read-only view for { link SortedSet} collections.
+ *
+ * This class decorates any class which implements the { link SortedSet} interface
+ * by making it read only. Any method which normally modify data will throw an
+ * error.
+ *
+ * @see SortedSet
+ */
+internal class Gee.ReadOnlySortedSet<G> : ReadOnlySet<G>, SortedSet<G> {
+ /**
+ * Constructs a read-only set that mirrors the content of the specified set.
+ *
+ * @param set the set to decorate.
+ */
+ public ReadOnlySortedSet (SortedSet<G> set) {
+ base (set);
+ }
+
+ /**
+ * { inheritDoc}
+ */
+ public G first () {
+ return (_collection as SortedSet<G>).first ();
+ }
+
+ /**
+ * { inheritDoc}
+ */
+ public G last () {
+ return (_collection as SortedSet<G>).last ();
+ }
+
+ /**
+ * { inheritDoc}
+ */
+ public Gee.BidirIterator<G> bidir_iterator () {
+ return new BidirIterator<G> ((_collection as SortedSet<G>).bidir_iterator ());
+ }
+
+ /**
+ * { inheritDoc}
+ */
+ public Gee.BidirIterator<G>? iterator_at (G element) {
+ var iter = (_collection as SortedSet<G>).iterator_at (element);
+ return (iter != null) ? new BidirIterator<G> (iter) : null;
+ }
+
+ /**
+ * { inheritDoc}
+ */
+ public G? lower (G element) {
+ return (_collection as SortedSet<G>).lower (element);
+ }
+
+ /**
+ * { inheritDoc}
+ */
+ public G? higher (G element) {
+ return (_collection as SortedSet<G>).higher (element);
+ }
+
+ /**
+ * { inheritDoc}
+ */
+ public G? floor (G element) {
+ return (_collection as SortedSet<G>).floor (element);
+ }
+
+ /**
+ * { inheritDoc}
+ */
+ public G? ceil (G element) {
+ return (_collection as SortedSet<G>).ceil (element);
+ }
+
+ /**
+ * { inheritDoc}
+ */
+ public SortedSet<G> head_set (G before) {
+ return (_collection as SortedSet<G>).head_set (before).read_only_view;
+ }
+
+ /**
+ * { inheritDoc}
+ */
+ public SortedSet<G> tail_set (G after) {
+ return(_collection as SortedSet<G>).tail_set (after).read_only_view;
+ }
+
+ /**
+ * { inheritDoc}
+ */
+ public SortedSet<G> sub_set (G from, G to) {
+ return (_collection as SortedSet<G>).sub_set (from, to).read_only_view;
+ }
+
+ /**
+ * { inheritDoc}
+ */
+ public new SortedSet<G> read_only_view {
+ owned get {
+ return this;
+ }
+ }
+
+ protected class BidirIterator<G> : Gee.ReadOnlyCollection.Iterator<G>, Gee.BidirIterator<G> {
+ public BidirIterator (Gee.BidirIterator<G> iterator) {
+ base (iterator);
+ }
+
+ public bool first () {
+ return (_iter as Gee.BidirIterator<G>).first ();
+ }
+
+ public bool previous () {
+ return (_iter as Gee.BidirIterator<G>).previous ();
+ }
+
+ public bool has_previous () {
+ return (_iter as Gee.BidirIterator<G>).has_previous ();
+ }
+
+ public bool last () {
+ return (_iter as Gee.BidirIterator<G>).last ();
+ }
+ }
+}
+
diff --git a/gee/sortedset.vala b/gee/sortedset.vala
index a8058c3..318c748 100644
--- a/gee/sortedset.vala
+++ b/gee/sortedset.vala
@@ -1,6 +1,7 @@
/* sortedset.vala
*
* Copyright (C) 2009 Didier Villevalois, Maciej Piechotka
+ * Copyright (C) 2011 Maciej Piechotka
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -126,4 +127,18 @@ public interface Gee.SortedSet<G> : Gee.Set<G> {
* @return the corresponding sub-set of this sorted set
*/
public abstract SortedSet<G> sub_set (G from, G to);
+
+ /**
+ * The read-only view of this set.
+ */
+ public abstract new SortedSet<G> read_only_view { owned get; }
+
+ /**
+ * Returns an immutable empty sorted set.
+ *
+ * @return an immutable empty sorted set
+ */
+ public static SortedSet<G> empty<G> () {
+ return new TreeSet<G> ().read_only_view;
+ }
}
diff --git a/gee/treemap.vala b/gee/treemap.vala
index d708202..e0828d0 100644
--- a/gee/treemap.vala
+++ b/gee/treemap.vala
@@ -961,6 +961,10 @@ public class Gee.TreeMap<K,V> : Gee.AbstractMap<K,V>, SortedMap<K,V> {
public K? ceil (K item) {
return _map.lift_null_key (_map.find_ceil (item));
}
+
+ public new SortedSet<K> read_only_view {
+ owned get { return this; }
+ }
}
private class SubKeySet<K,V> : AbstractSet<K>, SortedSet<K> {
@@ -1078,6 +1082,10 @@ public class Gee.TreeMap<K,V> : Gee.AbstractMap<K,V>, SortedMap<K,V> {
var h = map.lift_null_key (map.find_ceil (key));
return h != null && range.in_range (h) ? h : null;
}
+
+ public new SortedSet<K> read_only_view {
+ owned get { return this; }
+ }
}
private class ValueCollection<K,V> : AbstractCollection<V> {
@@ -1263,6 +1271,10 @@ public class Gee.TreeMap<K,V> : Gee.AbstractMap<K,V>, SortedMap<K,V> {
weak Node<K,V>? l = _map.find_ceil (item.key);
return l != null ? Entry.entry_for<K,V> (l) : null;
}
+
+ public new SortedSet<Map.Entry<K, V>> read_only_view {
+ owned get { return this; }
+ }
}
private class SubEntrySet<K,V> : AbstractSet<Map.Entry<K,V>>, SortedSet<Map.Entry<K,V>> {
@@ -1380,6 +1392,10 @@ public class Gee.TreeMap<K,V> : Gee.AbstractMap<K,V>, SortedMap<K,V> {
weak Node<K,V>? h = map.find_ceil (entry.key);
return h != null && range.in_range (h.key) ? Entry.entry_for<K,V> (h) : null;
}
+
+ public new SortedSet<Map.Entry<K, V>> read_only_view {
+ owned get { return this; }
+ }
}
private class NodeIterator<K, V> : Object {
diff --git a/gee/treeset.vala b/gee/treeset.vala
index 6e2af21..e9dbfef 100644
--- a/gee/treeset.vala
+++ b/gee/treeset.vala
@@ -1,6 +1,6 @@
/* treeset.vala
*
- * Copyright (C) 2009-2010 Maciej Piechotka
+ * Copyright (C) 2009-2011 Maciej Piechotka
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -32,7 +32,7 @@ using GLib;
*
* @see HashSet
*/
-public class Gee.TreeSet<G> : AbstractSet<G>, SortedSet<G> {
+public class Gee.TreeSet<G> : AbstractSortedSet<G> {
/**
* { inheritDoc}
*/
@@ -350,7 +350,7 @@ public class Gee.TreeSet<G> : AbstractSet<G>, SortedSet<G> {
/**
* { inheritDoc}
*/
- public BidirIterator<G> bidir_iterator () {
+ public override BidirIterator<G> bidir_iterator () {
return new Iterator<G> (this);
}
@@ -361,7 +361,7 @@ public class Gee.TreeSet<G> : AbstractSet<G>, SortedSet<G> {
/**
* { inheritDoc}
*/
- public G first () {
+ public override G first () {
assert (_first != null);
return _first.key;
}
@@ -369,7 +369,7 @@ public class Gee.TreeSet<G> : AbstractSet<G>, SortedSet<G> {
/**
* { inheritDoc}
*/
- public G last () {
+ public override G last () {
assert (_last != null);
return _last.key;
}
@@ -377,21 +377,21 @@ public class Gee.TreeSet<G> : AbstractSet<G>, SortedSet<G> {
/**
* { inheritDoc}
*/
- public SortedSet<G> head_set (G before) {
+ public override SortedSet<G> head_set (G before) {
return new SubSet<G>.head (this, before);
}
/**
* { inheritDoc}
*/
- public SortedSet<G> tail_set (G after) {
+ public override SortedSet<G> tail_set (G after) {
return new SubSet<G>.tail (this, after);
}
/**
* { inheritDoc}
*/
- public SortedSet<G> sub_set (G after, G before) {
+ public override SortedSet<G> sub_set (G after, G before) {
return new SubSet<G> (this, after, before);
}
@@ -413,7 +413,7 @@ public class Gee.TreeSet<G> : AbstractSet<G>, SortedSet<G> {
/**
* { inheritDoc}
*/
- public BidirIterator<G>? iterator_at (G item) {
+ public override BidirIterator<G>? iterator_at (G item) {
weak Node<G>? node = find_node (item);
return node != null ? new Iterator<G>.pointing (this, node) : null;
}
@@ -468,28 +468,28 @@ public class Gee.TreeSet<G> : AbstractSet<G>, SortedSet<G> {
/**
* { inheritDoc}
*/
- public G? lower (G item) {
+ public override G? lower (G item) {
return lift_null_get (find_lower (item));
}
/**
* { inheritDoc}
*/
- public G? higher (G item) {
+ public override G? higher (G item) {
return lift_null_get (find_higher (item));
}
/**
* { inheritDoc}
*/
- public G? floor (G item) {
+ public override G? floor (G item) {
return lift_null_get (find_floor (item));
}
/**
* { inheritDoc}
*/
- public G? ceil (G item) {
+ public override G? ceil (G item) {
return lift_null_get (find_ceil (item));
}
@@ -888,7 +888,7 @@ public class Gee.TreeSet<G> : AbstractSet<G>, SortedSet<G> {
BOUNDED
}
- private class SubSet<G> : AbstractSet<G>, SortedSet<G> {
+ private class SubSet<G> : AbstractSortedSet<G> {
public SubSet (TreeSet<G> set, G after, G before) {
this.set = set;
this.range = new Range<G> (set, after, before);
@@ -952,35 +952,35 @@ public class Gee.TreeSet<G> : AbstractSet<G>, SortedSet<G> {
return new SubIterator<G> (set, range);
}
- public BidirIterator<G> bidir_iterator () {
+ public override BidirIterator<G> bidir_iterator () {
return new SubIterator<G> (set, range);
}
- public G first () {
+ public override G first () {
weak Node<G>? _first = range.first ();
assert (_first != null);
return _first.key;
}
- public G last () {
+ public override G last () {
weak Node<G>? _last = range.last ();
assert (_last != null);
return _last.key;
}
- public SortedSet<G> head_set (G before) {
+ public override SortedSet<G> head_set (G before) {
return new SubSet<G>.from_range (set, range.cut_tail (before));
}
- public SortedSet<G> tail_set (G after) {
+ public override SortedSet<G> tail_set (G after) {
return new SubSet<G>.from_range (set, range.cut_head (after));
}
- public SortedSet<G> sub_set (G after, G before) {
+ public override SortedSet<G> sub_set (G after, G before) {
return new SubSet<G>.from_range (set, range.cut (after, before));
}
- public BidirIterator<G>? iterator_at (G item) {
+ public override BidirIterator<G>? iterator_at (G item) {
if (!range.in_range (item))
return null;
weak Node<G>? n = set.find_node (item);
@@ -989,7 +989,7 @@ public class Gee.TreeSet<G> : AbstractSet<G>, SortedSet<G> {
return new SubIterator<G>.pointing (set, range, n);
}
- public G? lower (G item) {
+ public override G? lower (G item) {
var res = range.compare_range (item);
if (res > 0)
return last ();
@@ -997,7 +997,7 @@ public class Gee.TreeSet<G> : AbstractSet<G>, SortedSet<G> {
return l != null && range.in_range (l) ? l : null;
}
- public G? higher (G item) {
+ public override G? higher (G item) {
var res = range.compare_range (item);
if (res < 0)
return first ();
@@ -1005,7 +1005,7 @@ public class Gee.TreeSet<G> : AbstractSet<G>, SortedSet<G> {
return h != null && range.in_range (h) ? h : null;
}
- public G? floor (G item) {
+ public override G? floor (G item) {
var res = range.compare_range (item);
if (res > 0)
return last ();
@@ -1013,7 +1013,7 @@ public class Gee.TreeSet<G> : AbstractSet<G>, SortedSet<G> {
return l != null && range.in_range (l) ? l : null;
}
- public G? ceil (G item) {
+ public override G? ceil (G item) {
var res = range.compare_range (item);
if (res < 0)
return first ();
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]