--- 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