summaryrefslogtreecommitdiff
path: root/modules/CIAO/CIDLC/Collectors.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'modules/CIAO/CIDLC/Collectors.hpp')
-rw-r--r--modules/CIAO/CIDLC/Collectors.hpp280
1 files changed, 280 insertions, 0 deletions
diff --git a/modules/CIAO/CIDLC/Collectors.hpp b/modules/CIAO/CIDLC/Collectors.hpp
new file mode 100644
index 00000000000..e87667579b5
--- /dev/null
+++ b/modules/CIAO/CIDLC/Collectors.hpp
@@ -0,0 +1,280 @@
+// file : CIDLC/Collectors.hpp
+// author : Boris Kolpackov <boris@dre.vanderbilt.edu>
+// cvs-id : $Id$
+
+#ifndef COLLECTORS_HPP
+#define COLLECTORS_HPP
+
+#include <map>
+
+#include "CCF/CIDL/SemanticGraph.hpp"
+#include "CCF/CIDL/Traversal.hpp"
+
+class Declarations
+{
+public:
+ bool
+ add (CCF::IDL3::SyntaxTree::HomeDefPtr const& h)
+ {
+ return homes_.insert (h).second;
+ }
+
+ bool
+ add (CCF::IDL3::SyntaxTree::ComponentDefPtr const& c)
+ {
+ return components_.insert (c).second;
+ }
+
+ bool
+ add (CCF::CIDL::SyntaxTree::CompositionPtr const& cs,
+ CCF::IDL3::SyntaxTree::ComponentDefPtr const& cn)
+ {
+ return compositions_.insert (make_pair(cs, cn)).second;
+ }
+
+ bool
+ add (CCF::IDL3::SyntaxTree::UnconstrainedInterfaceDeclPtr const& i)
+ {
+ return interfaces_.insert (i).second
+ && interface_names_.insert (i->name ()).second;
+ }
+
+public:
+ bool
+ find (CCF::IDL3::SyntaxTree::HomeDefPtr const& h) const
+ {
+ return homes_.find (h) != homes_.end ();
+ }
+
+ bool
+ find (CCF::IDL3::SyntaxTree::ComponentDefPtr const& c) const
+ {
+ return components_.find (c) != components_.end ();
+ }
+
+ bool
+ find (CCF::CIDL::SyntaxTree::CompositionPtr const& c) const
+ {
+ return compositions_.find (c) != compositions_.end ();
+ }
+
+ bool
+ find (CCF::IDL2::SyntaxTree::UnconstrainedInterfaceDefPtr const& i) const
+ {
+ return interface_names_.find (i->name ()) != interface_names_.end ();
+ }
+
+public:
+ CCF::IDL3::SyntaxTree::ComponentDefPtr
+ resolve (CCF::CIDL::SyntaxTree::CompositionPtr const& c) const
+ {
+ CompositionMap::const_iterator i = compositions_.find (c);
+ if (i != compositions_.end ())
+ {
+ return i->second;
+ }
+ else
+ {
+ return CCF::IDL3::SyntaxTree::ComponentDefPtr (0);
+ }
+ }
+
+public:
+ bool
+ contains_suborder (CCF::CIDL::SyntaxTree::Order const& o) const
+ {
+ for (CCF::IDL2::SyntaxTree::UnconstrainedInterfaceDeclSet::const_iterator i =
+ interfaces_.begin ();
+ i != interfaces_.end ();
+ i++)
+ {
+ if (o.suborder ((*i)->order ())) return true;
+ }
+
+ for (CCF::IDL3::SyntaxTree::ComponentDefSet::const_iterator i = components_.begin ();
+ i != components_.end ();
+ i++)
+ {
+ if (o.suborder ((*i)->order ())) return true;
+ }
+
+ for (CCF::IDL3::SyntaxTree::HomeDefSet::const_iterator i = homes_.begin ();
+ i != homes_.end ();
+ i++)
+ {
+ if (o.suborder ((*i)->order ())) return true;
+ }
+
+ for (CompositionMap::const_iterator i = compositions_.begin ();
+ i != compositions_.end ();
+ i++)
+ {
+ if (o.suborder (i->first->order ())) return true;
+ }
+
+ return false;
+ }
+
+private:
+ typedef
+ std::map <CCF::CIDL::SyntaxTree::CompositionPtr,
+ CCF::IDL3::SyntaxTree::ComponentDefPtr,
+ CCF::CIDL::SyntaxTree::CompositionOrderComparator> CompositionMap;
+
+ CCF::IDL3::SyntaxTree::HomeDefSet homes_;
+ CCF::IDL3::SyntaxTree::ComponentDefSet components_;
+ CompositionMap compositions_;
+ CCF::IDL2::SyntaxTree::UnconstrainedInterfaceDeclSet interfaces_;
+ CCF::IDL2::SyntaxTree::ScopedNameSet interface_names_;
+};
+
+
+//
+//
+//
+class HomeCollector : public CCF::IDL3::Traversal::HomeDef
+{
+public:
+ HomeCollector (Declarations& declarations)
+ : declarations_ (declarations)
+ {
+ }
+
+ virtual void
+ traverse (CCF::CIDL::SyntaxTree::HomeDefPtr const& h)
+ {
+ CCF::CIDL::SyntaxTree::ScopedName n (h->name ());
+
+ CCF::CIDL::SyntaxTree::ScopedName main (n.scope (), "CCM_" + n.simple ());
+ CCF::CIDL::SyntaxTree::ScopedName expl (n.scope (), "CCM_" + n.simple () + "Explicit");
+ CCF::CIDL::SyntaxTree::ScopedName impl (n.scope (), "CCM_" + n.simple () + "Implicit");
+
+ // Check if mapping has already been provided.
+ if (h->table ().exist (main) ||
+ h->table ().exist (expl) ||
+ h->table ().exist (impl)) return;
+
+ if (declarations_.add (h))
+ {
+ // Note that I don't go after components that inherited home manages
+ // because it will be handled by component inheritance tree.
+ //
+ if (h->inherits ()) traverse (h->inherits ().resolve ());
+ }
+ }
+
+private:
+ Declarations& declarations_;
+};
+
+//
+//
+//
+class ComponentCollector : public CCF::IDL3::Traversal::ComponentDef
+{
+public:
+ ComponentCollector (Declarations& declarations)
+ : declarations_ (declarations)
+ {
+ }
+
+ virtual void
+ pre (CCF::IDL3::SyntaxTree::ComponentDefPtr const& c)
+ {
+ CCF::CIDL::SyntaxTree::ScopedName n (c->name ());
+
+ CCF::CIDL::SyntaxTree::ScopedName monolith (n.scope (), "CCM_" + n.simple ());
+ CCF::CIDL::SyntaxTree::ScopedName context (n.scope (), "CCM_" + n.simple () + "_Context");
+
+ // Check if mapping has already been provided.
+ if (c->table ().exist (context) ||
+ c->table ().exist (monolith)) return;
+
+ if(declarations_.add (c))
+ {
+ if (c->inherits ())
+ {
+ traverse (c->inherits ().resolve ());
+ }
+ }
+ }
+
+private:
+ Declarations& declarations_;
+};
+
+//
+//
+//
+class ProvidedInterfaceCollector : public CCF::IDL3::Traversal::ProvidesDecl
+{
+public:
+ ProvidedInterfaceCollector (Declarations& declarations)
+ : declarations_ (declarations)
+ {
+ }
+
+ virtual void
+ traverse (CCF::IDL3::SyntaxTree::ProvidesDeclPtr const& i)
+ {
+ //@@ CCM issue: interface should be defined at this point
+ CCF::IDL2::SyntaxTree::UnconstrainedInterfaceDeclPtr def
+ (i->type ()
+ ->dynamic_type<CCF::CIDL::SyntaxTree::UnconstrainedInterfaceDecl> ());
+
+ if (def != 0)
+ {
+ // Add to the list if it's not already there.
+ declarations_.add (def);
+ }
+ }
+
+private:
+ Declarations& declarations_;
+};
+
+
+//
+//
+//
+class HomeExecutorCollector : public CCF::CIDL::Traversal::HomeExecutor
+{
+public:
+ HomeExecutorCollector (Declarations& declarations,
+ CCF::CIDL::Traversal::Dispatcher* home_collector,
+ CCF::CIDL::Traversal::Dispatcher* component_collector)
+ : declarations_ (declarations),
+ home_collector_ (home_collector),
+ component_collector_ (component_collector)
+ {
+ }
+
+ virtual void
+ traverse (CCF::CIDL::SyntaxTree::HomeExecutorPtr const& he)
+ {
+ CCF::CIDL::SyntaxTree::HomeDefPtr home (he->implements ());
+ home_collector_->dispatch (home);
+
+ CCF::CIDL::SyntaxTree::ComponentDefPtr component (home->manages ());
+ component_collector_->dispatch (component);
+
+ CCF::CIDL::SyntaxTree::CompositionPtr
+ composition (he->scope ()->dynamic_type<CCF::CIDL::SyntaxTree::Composition> ());
+ declarations_.add (composition, component);
+ }
+
+private:
+ Declarations& declarations_;
+
+ CCF::CIDL::Traversal::Dispatcher* home_collector_;
+ CCF::CIDL::Traversal::Dispatcher* component_collector_;
+};
+
+#endif // COLLECTORS_HPP
+
+/*
+ * Local Variables:
+ * mode: C++
+ * c-basic-offset: 2
+ * End:
+ */