summaryrefslogtreecommitdiff
path: root/CIAO/CIDLC/SizeTypeCalculator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'CIAO/CIDLC/SizeTypeCalculator.cpp')
-rw-r--r--CIAO/CIDLC/SizeTypeCalculator.cpp217
1 files changed, 217 insertions, 0 deletions
diff --git a/CIAO/CIDLC/SizeTypeCalculator.cpp b/CIAO/CIDLC/SizeTypeCalculator.cpp
new file mode 100644
index 00000000000..b8f44e879ed
--- /dev/null
+++ b/CIAO/CIDLC/SizeTypeCalculator.cpp
@@ -0,0 +1,217 @@
+// file : CIDLC/SizeTypeCalculator.cpp
+// author : Boris Kolpackov <boris@dre.vanderbilt.edu>
+// cvs-id : $Id$
+
+#include "SizeTypeCalculator.hpp"
+#include "Literals.hpp"
+
+#include "CCF/CIDL/SemanticGraph.hpp"
+#include "CCF/CIDL/Traversal.hpp"
+
+#include <stack>
+
+using namespace CCF::CIDL;
+using namespace CCF::CIDL::SemanticGraph;
+using namespace StringLiterals;
+
+namespace
+{
+ class Calculator : public Traversal::String,
+ public Traversal::Struct,
+ public Traversal::Union,
+ public Traversal::Wstring,
+ public Traversal::UnboundedSequence,
+ public Traversal::Interface,
+ public Traversal::ValueType
+ {
+ public:
+ Calculator ()
+ {
+ push (false);
+ }
+
+ public:
+ virtual void
+ traverse (SemanticGraph::String&)
+ {
+ top () = true;
+ }
+
+ virtual void
+ traverse (SemanticGraph::Wstring&)
+ {
+ top () = true;
+ }
+
+ virtual void
+ traverse (SemanticGraph::UnboundedSequence&)
+ {
+ top () = true;
+ }
+
+ virtual void
+ traverse (SemanticGraph::Interface&)
+ {
+ top () = true;
+ }
+
+ virtual void
+ traverse (SemanticGraph::ValueType&)
+ {
+ top () = true;
+ }
+
+ virtual void
+ pre (SemanticGraph::Struct&)
+ {
+ push (false);
+ }
+
+ virtual void
+ traverse (SemanticGraph::Struct& s)
+ {
+ std::string n (s.scoped_name ().str ());
+ if (s.context ().count (STRS[VAR_SIZE]))
+ {
+ // Never set 'top' to false (except in pre() above),
+ // so a 'true' value will propagate up the scopes.
+ bool r = s.context ().get<bool> (STRS[VAR_SIZE]);
+ if (r) top () = r;
+ }
+ else
+ {
+ Traversal::Struct::traverse (s);
+ }
+ }
+
+ virtual void
+ post (SemanticGraph::Struct& s)
+ {
+ // Set our context to the result of nested scope traversal.
+ s.context ().set (STRS[VAR_SIZE], top ());
+ }
+
+ virtual void
+ pre (SemanticGraph::Union&)
+ {
+ push (false);
+ }
+
+ virtual void
+ traverse (SemanticGraph::Union& u)
+ {
+ if (u.context ().count (STRS[VAR_SIZE]))
+ {
+ // Never set 'top' to false (except in pre() above),
+ // so a 'true' value will propagate up the scopes.
+ bool r = u.context ().get<bool> (STRS[VAR_SIZE]);
+ if (r) top () = r;
+ }
+ else
+ {
+ Traversal::Union::traverse (u);
+ }
+ }
+
+ virtual void
+ post (SemanticGraph::Union& u)
+ {
+ // Set our context to the result of nested scope traversal.
+ u.context ().set (STRS[VAR_SIZE], top ());
+ }
+
+ private:
+ void
+ push (bool v)
+ {
+ stack_.push (v);
+ }
+
+ bool&
+ top ()
+ {
+ return stack_.top ();
+ }
+
+ void
+ pop ()
+ {
+ stack_.pop ();
+ }
+
+ private:
+ std::stack<bool> stack_;
+ };
+}
+
+
+void SizeTypeCalculator::
+calculate (SemanticGraph::TranslationUnit& u)
+{
+ Traversal::TranslationUnit unit;
+
+ // Layer 1
+ //
+ Traversal::ContainsPrincipal contains_principal;
+ unit.edge_traverser (contains_principal);
+
+ //--
+ Traversal::TranslationRegion region;
+ contains_principal.node_traverser (region);
+
+ // Layer 2
+ //
+ Traversal::ContainsRoot contains_root;
+ Traversal::Includes includes;
+
+ region.edge_traverser (includes);
+ region.edge_traverser (contains_root);
+
+ //--
+ Traversal::Root root;
+ includes.node_traverser (region);
+ contains_root.node_traverser (root);
+
+ // Layer 3
+ //
+ Traversal::Defines defines;
+ root.edge_traverser (defines);
+
+ //--
+ // Everything that can contain a struct or union.
+ Traversal::Module module;
+ Traversal::UnconstrainedInterface uinterface;
+ Traversal::ValueType vtype;
+ Traversal::Home component_home;
+
+ Calculator calculator;
+
+ defines.node_traverser (module);
+ defines.node_traverser (uinterface);
+ defines.node_traverser (vtype);
+ defines.node_traverser (component_home);
+ defines.node_traverser (calculator);
+
+ // Layer 4
+ //
+ Traversal::Defines struct_defines;
+ module.edge_traverser (defines);
+ uinterface.edge_traverser (defines);
+ vtype.edge_traverser (defines);
+ component_home.edge_traverser (defines);
+ calculator.edge_traverser (struct_defines);
+
+ //--
+ Traversal::Member member;
+ struct_defines.node_traverser (member);
+
+ // Layer 5
+ //
+ Traversal::Belongs belongs;
+ member.edge_traverser (belongs);
+
+ //--
+ belongs.node_traverser (calculator);
+
+ unit.traverse (u);
+}