override Connect from ArrayTraceResolver

This commit is contained in:
Mathieu Lacage
2007-08-10 14:25:58 +02:00
parent cb9fdc66e3
commit 346cdbfb18
4 changed files with 63 additions and 22 deletions

View File

@@ -52,8 +52,10 @@ public:
*/
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 @@ ArrayTraceResolver<T,INDEX>::ArrayTraceResolver (Callback<uint32_t> getSize,
: 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;
}
}
}
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;
}
}
return list;
}

View File

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

View File

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

View File

@@ -71,6 +71,8 @@ public:
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