override Connect from ArrayTraceResolver
authorMathieu Lacage <mathieu.lacage@sophia.inria.fr>
Fri, 10 Aug 2007 14:25:58 +0200
changeset 1328 03f1081c21a7
parent 1327 798c425d3b1f
child 1329 fc842b2faece
override Connect from ArrayTraceResolver
src/common/array-trace-resolver.h
src/common/composite-trace-resolver.cc
src/common/trace-resolver.cc
src/common/trace-resolver.h
--- a/src/common/array-trace-resolver.h	Fri Aug 10 14:14:29 2007 +0200
+++ b/src/common/array-trace-resolver.h	Fri Aug 10 14:25:58 2007 +0200
@@ -52,8 +52,10 @@
    */
   ArrayTraceResolver (Callback<uint32_t> getSize, 
                       Callback<T, uint32_t> get);
+
+  virtual void Connect (std::string path, CallbackBase const &cb, const TraceContext &context);
+  virtual void Disconnect (std::string path, CallbackBase const &cb);
 private:
-  virtual TraceResolverList DoLookup (std::string id) const;
   Callback<uint32_t> m_getSize;
   Callback<T, uint32_t> m_get;
 };
@@ -67,22 +69,41 @@
   : m_getSize (getSize),
     m_get (get)
 {}
+
 template <typename T, typename INDEX>
-TraceResolver::TraceResolverList 
-ArrayTraceResolver<T,INDEX>::DoLookup (std::string id) const
+void 
+ArrayTraceResolver<T,INDEX>::Connect (std::string path, CallbackBase const &cb, const TraceContext &context)
 {
-  TraceResolverList list;
+  std::string id = GetElement (path);
+  std::string subpath = GetSubpath (path);
   if (id == "*")
   {
     for (uint32_t i = 0; i < m_getSize (); i++)
     {
-      TraceContext context;
+      TraceContext tmp = context;
       INDEX index = i;
-      context.Add (index);
-      list.push_back (std::make_pair (m_get (i)->CreateTraceResolver (), context));
+      tmp.Add (index);
+      TraceResolver *resolver = m_get (i)->CreateTraceResolver ();
+      resolver->Connect (subpath, cb, tmp);
+      delete resolver;
     }
   }
-  return list;
+}
+template <typename T, typename INDEX>
+void 
+ArrayTraceResolver<T,INDEX>::Disconnect (std::string path, CallbackBase const &cb)
+{
+  std::string id = GetElement (path);
+  std::string subpath = GetSubpath (path);
+  if (id == "*")
+  {
+    for (uint32_t i = 0; i < m_getSize (); i++)
+    {
+      TraceResolver *resolver = m_get (i)->CreateTraceResolver ();
+      resolver->Disconnect (subpath, cb);
+      delete resolver;
+    }
+  }
 }
 
 
--- a/src/common/composite-trace-resolver.cc	Fri Aug 10 14:14:29 2007 +0200
+++ b/src/common/composite-trace-resolver.cc	Fri Aug 10 14:25:58 2007 +0200
@@ -61,19 +61,8 @@
                                               const TraceContext &context,
                                               enum Operation op)
 {
-  std::string::size_type cur = 1;
-  // check that first char is "/"
-  std::string::size_type next = path.find ("/", cur);
-  std::string id = std::string (path, cur, next-1);
-  std::string subpath;
-  if (next != std::string::npos)
-    {
-      subpath = std::string (path, next, std::string::npos);
-    }
-  else
-    {
-      subpath = "";
-    }
+  std::string id = GetElement (path);
+  std::string subpath = GetSubpath (path);
 
   if (id == "*")
     {
@@ -150,7 +139,8 @@
     resolver->Disconnect (subpath, cb);
     break;
   }
-  }
+  delete resolver;
+}
 
 void 
 CompositeTraceResolver::Disconnect (std::string path, CallbackBase const &cb)
--- a/src/common/trace-resolver.cc	Fri Aug 10 14:14:29 2007 +0200
+++ b/src/common/trace-resolver.cc	Fri Aug 10 14:25:58 2007 +0200
@@ -80,6 +80,34 @@
   resolverList.erase (resolverList.begin (), resolverList.end ());
 }
 
+std::string 
+TraceResolver::GetElement (std::string path)
+{
+  std::string::size_type cur = 1;
+  // check that first char is "/"
+  std::string::size_type next = path.find ("/", cur);
+  std::string id = std::string (path, cur, next-1);
+  return id;
+}
+std::string 
+TraceResolver::GetSubpath (std::string path)
+{
+  std::string::size_type cur = 1;
+  // check that first char is "/"
+  std::string::size_type next = path.find ("/", cur);
+  std::string subpath;
+  if (next != std::string::npos)
+    {
+      subpath = std::string (path, next, std::string::npos);
+    }
+  else
+    {
+      subpath = "";
+    }
+  return subpath;
+}
+
+
 TraceResolver::TraceResolverList 
 TraceResolver::DoLookup (std::string id) const
 {
--- a/src/common/trace-resolver.h	Fri Aug 10 14:14:29 2007 +0200
+++ b/src/common/trace-resolver.h	Fri Aug 10 14:25:58 2007 +0200
@@ -71,6 +71,8 @@
   virtual void Disconnect (std::string path, CallbackBase const &cb);
 protected:
   typedef std::list<std::pair<TraceResolver *, TraceContext> > TraceResolverList;
+  std::string GetElement (std::string path);
+  std::string GetSubpath (std::string path);
 private:
   /**
    * \param id the id to resolve. This is supposed to be