diff options
author | Mark Spruiell <mes@zeroc.com> | 2004-01-16 22:22:44 +0000 |
---|---|---|
committer | Mark Spruiell <mes@zeroc.com> | 2004-01-16 22:22:44 +0000 |
commit | 00081d77200a08baac2e62cc2797c7530caacea3 (patch) | |
tree | 69a638dc86939389e9c810946a7d0fef20a31cd4 /cpp/src/FreezeScript/Print.cpp | |
parent | adding ClassDef::isA (diff) | |
download | ice-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.cpp | 240 |
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); + } +} |