From 346cdbfb18ba07d928bb1ae066fc24dcf3823a81 Mon Sep 17 00:00:00 2001 From: Mathieu Lacage Date: Fri, 10 Aug 2007 14:25:58 +0200 Subject: [PATCH] override Connect from ArrayTraceResolver --- src/common/array-trace-resolver.h | 37 ++++++++++++++++++++------ src/common/composite-trace-resolver.cc | 18 +++---------- src/common/trace-resolver.cc | 28 +++++++++++++++++++ src/common/trace-resolver.h | 2 ++ 4 files changed, 63 insertions(+), 22 deletions(-) diff --git a/src/common/array-trace-resolver.h b/src/common/array-trace-resolver.h index ffcc6cc89..65fe2b546 100644 --- a/src/common/array-trace-resolver.h +++ b/src/common/array-trace-resolver.h @@ -52,8 +52,10 @@ public: */ ArrayTraceResolver (Callback getSize, Callback 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 m_getSize; Callback m_get; }; @@ -67,22 +69,41 @@ ArrayTraceResolver::ArrayTraceResolver (Callback getSize, : m_getSize (getSize), m_get (get) {} + template -TraceResolver::TraceResolverList -ArrayTraceResolver::DoLookup (std::string id) const +void +ArrayTraceResolver::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; + } + } +} +template +void +ArrayTraceResolver::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; } } - return list; } diff --git a/src/common/composite-trace-resolver.cc b/src/common/composite-trace-resolver.cc index a789a9b51..ed0da7c8e 100644 --- a/src/common/composite-trace-resolver.cc +++ b/src/common/composite-trace-resolver.cc @@ -61,19 +61,8 @@ CompositeTraceResolver::DoRecursiveOperation (std::string path, CallbackBase con 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 @@ CompositeTraceResolver::OperationOne (std::string subpath, resolver->Disconnect (subpath, cb); break; } - } + delete resolver; +} void CompositeTraceResolver::Disconnect (std::string path, CallbackBase const &cb) diff --git a/src/common/trace-resolver.cc b/src/common/trace-resolver.cc index 75c7a576d..0b2d5124e 100644 --- a/src/common/trace-resolver.cc +++ b/src/common/trace-resolver.cc @@ -80,6 +80,34 @@ TraceResolver::Disconnect (std::string path, CallbackBase const &cb) 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 { diff --git a/src/common/trace-resolver.h b/src/common/trace-resolver.h index abb5cf1da..04f6b2751 100644 --- a/src/common/trace-resolver.h +++ b/src/common/trace-resolver.h @@ -71,6 +71,8 @@ public: virtual void Disconnect (std::string path, CallbackBase const &cb); protected: typedef std::list > 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