ekiga r7305 - trunk/lib/engine/framework



Author: jpuydt
Date: Thu Oct 30 15:18:17 2008
New Revision: 7305
URL: http://svn.gnome.org/viewvc/ekiga?rev=7305&view=rev

Log:
Completed Ekiga::RefLister to have iterators (no const yet)

Added:
   trunk/lib/engine/framework/map-key-iterator.h
Modified:
   trunk/lib/engine/framework/reflister.h

Added: trunk/lib/engine/framework/map-key-iterator.h
==============================================================================
--- (empty file)
+++ trunk/lib/engine/framework/map-key-iterator.h	Thu Oct 30 15:18:17 2008
@@ -0,0 +1,126 @@
+
+/*
+ * Ekiga -- A VoIP and Video-Conferencing application
+ * Copyright (C) 2000-2008 Damien Sandras
+
+ * This program is free software; you can  redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version. This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Ekiga is licensed under the GPL license and as a special exception, you
+ * have permission to link or otherwise combine this program with the
+ * programs OPAL, OpenH323 and PWLIB, and distribute the combination, without
+ * applying the requirements of the GNU GPL to the OPAL, OpenH323 and PWLIB
+ * programs, as long as you do follow the requirements of the GNU GPL for all
+ * the rest of the software thus combined.
+ */
+
+
+/*
+ *                         map-key-iterator.h  -  description
+ *                         ------------------------------------------
+ *   begin                : written in 2008 by Julien Puydt
+ *   copyright            : (c) 2008 by Julien Puydt
+ *   description          : iterator on the keys of a std::map
+ *
+ */
+
+#ifndef __MAP_KEY_ITERATOR_H__
+#define __MAP_KEY_ITERATOR_H__
+
+#include <map>
+
+namespace Ekiga
+{
+  template<typename map_type>
+  class map_key_iterator: public std::forward_iterator_tag
+  {
+  public:
+
+    map_key_iterator (typename map_type::iterator it_);
+
+    map_key_iterator& operator= (const map_key_iterator& other);
+
+    bool operator== (const map_key_iterator& other);
+    bool operator!= (const map_key_iterator& other);
+
+    map_key_iterator& operator++ ();
+    map_key_iterator operator++ (int);
+
+    typename map_type::key_type operator* ();
+
+    typename map_type::key_type* operator-> ();
+
+  private:
+    typename map_type::iterator it;
+  };
+
+};
+
+template<typename map_type>
+Ekiga::map_key_iterator<map_type>::map_key_iterator (typename map_type::iterator it_): it(it_)
+{
+}
+
+template<typename map_type>
+Ekiga::map_key_iterator<map_type>&
+Ekiga::map_key_iterator<map_type>::operator= (const map_key_iterator<map_type>& other)
+{
+  it = other.it;
+  return *this;
+}
+
+template<typename map_type>
+bool
+Ekiga::map_key_iterator<map_type>::operator== (const map_key_iterator<map_type>& other)
+{
+  return it == other.it;
+}
+
+template<typename map_type>
+bool
+Ekiga::map_key_iterator<map_type>::operator!= (const map_key_iterator<map_type>& other)
+{
+  return it != other.it;
+}
+
+template<typename map_type>
+Ekiga::map_key_iterator<map_type>&
+Ekiga::map_key_iterator<map_type>::operator++ ()
+{
+  it++;
+  return *this;
+}
+
+template<typename map_type>
+Ekiga::map_key_iterator<map_type>
+Ekiga::map_key_iterator<map_type>::operator++ (int)
+{
+  map_key_iterator<map_type> tmp = *this;
+  ++it;
+  return tmp;
+}
+
+template<typename map_type>
+typename map_type::key_type
+Ekiga::map_key_iterator<map_type>::operator* ()
+{
+  return it->first;
+}
+
+template<typename map_type>
+typename map_type::key_type*
+Ekiga::map_key_iterator<map_type>::operator-> ()
+{
+  return it->first;
+}
+
+#endif

Modified: trunk/lib/engine/framework/reflister.h
==============================================================================
--- trunk/lib/engine/framework/reflister.h	(original)
+++ trunk/lib/engine/framework/reflister.h	Thu Oct 30 15:18:17 2008
@@ -37,10 +37,11 @@
 #ifndef __REFLISTER_H__
 #define __REFLISTER_H__
 
-#include "gmref.h"
 #include <sigc++/sigc++.h>
 #include <list>
-#include <map>
+
+#include "gmref.h"
+#include "map-key-iterator.h"
 
 namespace Ekiga
 {
@@ -50,6 +51,7 @@
   protected:
 
     typedef std::map<gmref_ptr<ObjectType>,std::list<sigc::connection> > container_type;
+    typedef Ekiga::map_key_iterator<container_type> iterator;
 
     void visit_objects (sigc::slot<bool, gmref_ptr<ObjectType> > visitor);
 
@@ -60,6 +62,11 @@
 
     void remove_object (gmref_ptr<ObjectType> obj);
 
+    void remove_all_objects ();
+
+    iterator begin ();
+    iterator end ();
+
     sigc::signal<void, gmref_ptr<ObjectType> > object_added;
     sigc::signal<void, gmref_ptr<ObjectType> > object_removed;
     sigc::signal<void, gmref_ptr<ObjectType> > object_updated;
@@ -115,4 +122,27 @@
   object_removed.emit (obj);
 }
 
+template<typename ObjectType>
+void
+Ekiga::RefLister<ObjectType>::remove_all_objects ()
+{
+  /* iterators get invalidated as we go, hence the strange loop */
+  while (objects.begin () != objects.end ())
+    remove_object (objects.begin ()->first);
+}
+
+template<typename ObjectType>
+typename Ekiga::RefLister<ObjectType>::iterator
+Ekiga::RefLister<ObjectType>::begin ()
+{
+  return iterator (objects.begin ());
+}
+
+template<typename ObjectType>
+typename Ekiga::RefLister<ObjectType>::iterator
+Ekiga::RefLister<ObjectType>::end ()
+{
+  return iterator (objects.end ());
+}
+
 #endif



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]