summaryrefslogtreecommitdiff
path: root/cpp/src/FreezeScript/Print.cpp
diff options
context:
space:
mode:
authorMark Spruiell <mes@zeroc.com>2004-01-16 22:22:44 +0000
committerMark Spruiell <mes@zeroc.com>2004-01-16 22:22:44 +0000
commit00081d77200a08baac2e62cc2797c7530caacea3 (patch)
tree69a638dc86939389e9c810946a7d0fef20a31cd4 /cpp/src/FreezeScript/Print.cpp
parentadding ClassDef::isA (diff)
downloadice-00081d77200a08baac2e62cc2797c7530caacea3.tar.bz2
ice-00081d77200a08baac2e62cc2797c7530caacea3.tar.xz
ice-00081d77200a08baac2e62cc2797c7530caacea3.zip
initial check-in
Diffstat (limited to 'cpp/src/FreezeScript/Print.cpp')
-rw-r--r--cpp/src/FreezeScript/Print.cpp240
1 files changed, 240 insertions, 0 deletions
diff --git a/cpp/src/FreezeScript/Print.cpp b/cpp/src/FreezeScript/Print.cpp
new file mode 100644
index 00000000000..e35be8f762a
--- /dev/null
+++ b/cpp/src/FreezeScript/Print.cpp
@@ -0,0 +1,240 @@
+// **********************************************************************
+//
+// Copyright (c) 2004
+// ZeroC, Inc.
+// Billerica, MA, USA
+//
+// All Rights Reserved.
+//
+// Ice is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License version 2 as published by
+// the Free Software Foundation.
+//
+// **********************************************************************
+
+#include <FreezeScript/Print.h>
+#include <FreezeScript/Util.h>
+#include <IceUtil/OutputUtil.h>
+
+using namespace std;
+using namespace IceUtil;
+
+namespace FreezeScript
+{
+
+class PrintVisitor : public DataVisitor
+{
+public:
+
+ PrintVisitor(ostream&);
+ ~PrintVisitor();
+
+ virtual void visitBoolean(const BooleanDataPtr&);
+ virtual void visitInteger(const IntegerDataPtr&);
+ virtual void visitDouble(const DoubleDataPtr&);
+ virtual void visitString(const StringDataPtr&);
+ virtual void visitProxy(const ProxyDataPtr&);
+ virtual void visitStruct(const StructDataPtr&);
+ virtual void visitSequence(const SequenceDataPtr&);
+ virtual void visitEnum(const EnumDataPtr&);
+ virtual void visitDictionary(const DictionaryDataPtr&);
+ virtual void visitObject(const ObjectRefPtr&);
+
+private:
+
+ void printObjectMembers(const Slice::ClassDefPtr&, const DataMemberMap&);
+
+ IceUtil::Output _out;
+ typedef map<const ObjectData*, int> ObjectHistoryMap;
+ ObjectHistoryMap _objectHistory;
+ int _objectCount;
+};
+
+} // End of namespace FreezeScript
+
+//
+// printData
+//
+void
+FreezeScript::printData(const DataPtr& data, ostream& os)
+{
+ PrintVisitor visitor(os);
+ data->visit(visitor);
+}
+
+//
+// PrintVisitor
+//
+FreezeScript::PrintVisitor::PrintVisitor(ostream& os) :
+ _out(os), _objectCount(0)
+{
+}
+
+FreezeScript::PrintVisitor::~PrintVisitor()
+{
+}
+
+void
+FreezeScript::PrintVisitor::visitBoolean(const BooleanDataPtr& data)
+{
+ _out << "bool(" << data->toString() << ")";
+}
+
+void
+FreezeScript::PrintVisitor::visitInteger(const IntegerDataPtr& data)
+{
+ _out << typeToString(data->getType()) << "(" << data->toString() << ")";
+}
+
+void
+FreezeScript::PrintVisitor::visitDouble(const DoubleDataPtr& data)
+{
+ _out << typeToString(data->getType()) << "(" << data->toString() << ")";
+}
+
+void
+FreezeScript::PrintVisitor::visitString(const StringDataPtr& data)
+{
+ _out << "'" << data->toString() << "'";
+}
+
+void
+FreezeScript::PrintVisitor::visitProxy(const ProxyDataPtr& data)
+{
+ string str = data->toString();
+ _out << typeToString(data->getType()) << '(' << (str.empty() ? "nil" : str) << ')';
+}
+
+void
+FreezeScript::PrintVisitor::visitStruct(const StructDataPtr& data)
+{
+ Slice::StructPtr type = Slice::StructPtr::dynamicCast(data->getType());
+ assert(type);
+ _out << "struct " << typeToString(type);
+ _out << sb;
+ //
+ // Print members in order of declaration.
+ //
+ Slice::DataMemberList l = type->dataMembers();
+ DataMemberMap members = data->getMembers();
+ for(Slice::DataMemberList::const_iterator p = l.begin(); p != l.end(); ++p)
+ {
+ DataMemberMap::const_iterator q = members.find((*p)->name());
+ assert(q != members.end());
+ _out << nl;
+ _out << q->first << " = ";
+ q->second->visit(*this);
+ }
+ _out << eb;
+}
+
+void
+FreezeScript::PrintVisitor::visitSequence(const SequenceDataPtr& data)
+{
+ DataList& elements = data->getElements();
+ _out << "sequence " << typeToString(data->getType()) << " (size = " << elements.size() << ")";
+ _out << sb;
+ Ice::Int i = 0;
+ for(DataList::const_iterator p = elements.begin(); p != elements.end(); ++p, ++i)
+ {
+ _out << nl << "[" << i << "] = ";
+ (*p)->visit(*this);
+ }
+ _out << eb;
+}
+
+void
+FreezeScript::PrintVisitor::visitEnum(const EnumDataPtr& data)
+{
+ _out << typeToString(data->getType()) << "(" << data->toString() << ")";
+}
+
+void
+FreezeScript::PrintVisitor::visitDictionary(const DictionaryDataPtr& data)
+{
+ DataMap& map = data->getElements();
+ _out << "dictionary " << typeToString(data->getType()) << " (size = " << map.size() << ")";
+ _out << sb;
+ for(DataMap::const_iterator p = map.begin(); p != map.end(); ++p)
+ {
+ _out << nl;
+ p->first->visit(*this);
+ _out << " => ";
+ p->second->visit(*this);
+ }
+ _out << eb;
+}
+
+void
+FreezeScript::PrintVisitor::visitObject(const ObjectRefPtr& data)
+{
+ ObjectDataPtr value = data->getValue();
+ if(!value)
+ {
+ _out << typeToString(data->getType()) << "(nil)";
+ }
+ else
+ {
+ Slice::TypePtr type = value->getType();
+ Slice::ClassDeclPtr decl = Slice::ClassDeclPtr::dynamicCast(type); // May be nil for Ice::Object
+
+ _out << "class " << typeToString(type);
+ ObjectHistoryMap::iterator p = _objectHistory.find(value.get());
+ if(p != _objectHistory.end())
+ {
+ ostringstream ostr;
+ ostr << " (object #" << p->second << ")";
+ _out << ostr.str();
+ }
+ else
+ {
+ _objectHistory.insert(ObjectHistoryMap::value_type(value.get(), _objectCount));
+ ostringstream ostr;
+ ostr << " (object #" << _objectCount << ")";
+ _out << ostr.str();
+ _objectCount++;
+ _out << sb;
+
+ //
+ // Print Ice::Object members.
+ //
+ DataMemberMap members = value->getMembers();
+ DataMemberMap::const_iterator q = members.find("ice_facets");
+ assert(q != members.end());
+ _out << nl << q->first << " = ";
+ q->second->visit(*this);
+
+ if(decl)
+ {
+ Slice::ClassDefPtr def = decl->definition();
+ assert(def);
+ printObjectMembers(def, members);
+ }
+
+ _out << eb;
+ }
+ }
+}
+
+void
+FreezeScript::PrintVisitor::printObjectMembers(const Slice::ClassDefPtr& type, const DataMemberMap& members)
+{
+ Slice::ClassList bases = type->bases();
+ if(!bases.empty() && !bases.front()->isAbstract())
+ {
+ printObjectMembers(bases.front(), members);
+ }
+
+ //
+ // Print members in order of declaration.
+ //
+ Slice::DataMemberList l = type->dataMembers();
+ for(Slice::DataMemberList::const_iterator p = l.begin(); p != l.end(); ++p)
+ {
+ DataMemberMap::const_iterator q = members.find((*p)->name());
+ assert(q != members.end());
+ _out << nl;
+ _out << q->first << " = ";
+ q->second->visit(*this);
+ }
+}