summaryrefslogtreecommitdiff
path: root/cpp/src/slice2cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/slice2cpp')
-rw-r--r--cpp/src/slice2cpp/Gen.cpp92
1 files changed, 66 insertions, 26 deletions
diff --git a/cpp/src/slice2cpp/Gen.cpp b/cpp/src/slice2cpp/Gen.cpp
index c9dd04cbe6d..5c34a76005d 100644
--- a/cpp/src/slice2cpp/Gen.cpp
+++ b/cpp/src/slice2cpp/Gen.cpp
@@ -1048,42 +1048,82 @@ Slice::Gen::ObjectVisitor::visitClassDefStart(const ClassDef_ptr& p)
ClassList bases = p -> bases();
H << sp;
- H << nl << "class" << dllExport_ << ' ' << name << " : ";
- if(p -> isLocal())
+ H << nl << "class" << dllExport_ << ' ' << name << "_ptrE : ";
+ H.useCurrentPosAsIndent();
+ if(bases.empty())
{
- if(bases.empty())
- H << "virtual public ::Ice::LocalObject";
+ if(p -> isLocal())
+ H << "virtual public ::Ice::LocalObject_ptrE";
else
+ H << "virtual public ::Ice::Object_ptrE";
+ }
+ else
+ {
+ ClassList::iterator q = bases.begin();
+ while(q != bases.end())
{
- H.useCurrentPosAsIndent();
- ClassList::iterator q = bases.begin();
- while(q != bases.end())
- {
- H << "virtual public " << (*q) -> scoped();
- if(++q != bases.end())
- H << ',' << nl;
- }
- H.restoreIndent();
+ H << "virtual public " << (*q) -> scoped() << "_ptrE";
+ if(++q != bases.end())
+ H << ',' << nl;
}
}
- else
+ H.restoreIndent();
+ H << sb;
+ H.dec();
+ H << nl << "public: ";
+ H.inc();
+ H << sp;
+ H << nl << name << "_ptrE() { }";
+ H << nl << name << "_ptrE(const " << name << "_ptrE&);";
+ H << nl << "explicit " << name << "_ptrE(const " << name << "_ptr&);";
+ H << nl << "operator " << name << "_ptr() const;";
+ H << nl << name << "* operator->() const;";
+ H << eb << ';';
+ C << sp << nl << scoped.substr(2) << "_ptrE::" << name << "_ptrE(const "
+ << name << "_ptrE& p)";
+ C << sb;
+ C << nl << "ptr_ = p.ptr_;";
+ C << eb;
+ C << sp << nl << scoped.substr(2) << "_ptrE::" << name << "_ptrE(const "
+ << scoped << "_ptr& p)";
+ C << sb;
+ C << nl << "ptr_ = p;";
+ C << eb;
+ C << sp << nl << scoped.substr(2) << "_ptrE::operator " << scoped
+ << "_ptr() const";
+ C << sb;
+ C << nl << "return " << scoped << "_ptr(dynamic_cast< " << scoped
+ << "*>(ptr_.get()));";
+ C << eb;
+ C << sp << nl << scoped << '*' << nl << scoped.substr(2)
+ << "_ptrE::operator->() const";
+ C << sb;
+ C << nl << "return dynamic_cast< " << scoped << "*>(ptr_.get());";
+ C << eb;
+
+ H << sp;
+ H << nl << "class" << dllExport_ << ' ' << name << " : ";
+ H.useCurrentPosAsIndent();
+ if(bases.empty())
{
- H.useCurrentPosAsIndent();
- H << "virtual public ::__IceDelegate" << scoped << ',';
- if(bases.empty())
- H << nl << "virtual public ::Ice::Object";
+ if(p -> isLocal())
+ H << "virtual public ::Ice::LocalObject";
else
+ H << "virtual public ::Ice::Object";
+ }
+ else
+ {
+ ClassList::iterator q = bases.begin();
+ while(q != bases.end())
{
- ClassList::iterator q = bases.begin();
- while(q != bases.end())
- {
- H << nl << "virtual public " << (*q) -> scoped();
- if(++q != bases.end())
- H << ',';
- }
+ H << "virtual public " << (*q) -> scoped();
+ if(++q != bases.end())
+ H << ',' << nl;
}
- H.restoreIndent();
}
+ if(!p -> isLocal())
+ H << ',' << nl << "virtual public ::__IceDelegate" << scoped;
+ H.restoreIndent();
H << sb;
H.dec();
H << nl << "public: ";