summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp')
-rw-r--r--cpp/include/Ice/Stream.h12
-rw-r--r--cpp/include/Ice/StreamTraits.h1
-rw-r--r--cpp/src/Ice/StreamI.cpp18
-rwxr-xr-xcpp/src/Slice/RubyUtil.cpp32
-rw-r--r--cpp/src/slice2cpp/Gen.cpp24
-rw-r--r--cpp/test/Ice/optional/Test.ice93
-rw-r--r--cpp/test/Ice/optional/TestI.cpp218
-rw-r--r--cpp/test/Ice/optional/TestI.h139
8 files changed, 448 insertions, 89 deletions
diff --git a/cpp/include/Ice/Stream.h b/cpp/include/Ice/Stream.h
index 9dda1497006..68213ec008b 100644
--- a/cpp/include/Ice/Stream.h
+++ b/cpp/include/Ice/Stream.h
@@ -63,8 +63,6 @@ public:
~UserExceptionReader() throw();
virtual void read(const InputStreamPtr&) const = 0;
- virtual bool usesClasses() const = 0;
- virtual void usesClasses(bool) = 0;
virtual ::std::string ice_name() const = 0;
virtual UserException* ice_clone() const = 0;
@@ -73,9 +71,6 @@ public:
virtual void __write(IceInternal::BasicStream*) const;
virtual void __read(IceInternal::BasicStream*);
- virtual bool __usesClasses() const;
- virtual void __usesClasses(bool);
-
protected:
const CommunicatorPtr _communicator;
@@ -394,7 +389,6 @@ public:
~UserExceptionWriter() throw();
virtual void write(const OutputStreamPtr&) const = 0;
- virtual bool usesClasses() const = 0;
virtual ::std::string ice_name() const = 0;
virtual UserException* ice_clone() const = 0;
@@ -403,12 +397,6 @@ public:
virtual void __write(IceInternal::BasicStream*) const;
virtual void __read(IceInternal::BasicStream*);
- virtual bool __usesClasses() const;
-
-#ifdef __SUNPRO_CC
- using UserException::__usesClasses;
-#endif
-
protected:
const CommunicatorPtr _communicator;
diff --git a/cpp/include/Ice/StreamTraits.h b/cpp/include/Ice/StreamTraits.h
index 2316964d782..8dfce94a0b1 100644
--- a/cpp/include/Ice/StreamTraits.h
+++ b/cpp/include/Ice/StreamTraits.h
@@ -116,7 +116,6 @@ struct StreamTrait
static const bool fixedLength = false;
};
-
//
// StreamTrait specialization for array / range mapped sequences
// The type can be a std::pair<T, T> or a
diff --git a/cpp/src/Ice/StreamI.cpp b/cpp/src/Ice/StreamI.cpp
index 0cb438049c7..55aa9b50fd9 100644
--- a/cpp/src/Ice/StreamI.cpp
+++ b/cpp/src/Ice/StreamI.cpp
@@ -80,18 +80,6 @@ UserExceptionReader::__read(BasicStream* is)
read(stream);
}
-bool
-UserExceptionReader::__usesClasses() const
-{
- return usesClasses();
-}
-
-void
-UserExceptionReader::__usesClasses(bool b)
-{
- usesClasses(b);
-}
-
//
// InputStreamI
//
@@ -790,9 +778,3 @@ UserExceptionWriter::__read(BasicStream*)
{
assert(false);
}
-
-bool
-UserExceptionWriter::__usesClasses() const
-{
- return usesClasses();
-}
diff --git a/cpp/src/Slice/RubyUtil.cpp b/cpp/src/Slice/RubyUtil.cpp
index d5f8f771a13..3922d6cbbf2 100755
--- a/cpp/src/Slice/RubyUtil.cpp
+++ b/cpp/src/Slice/RubyUtil.cpp
@@ -622,8 +622,6 @@ Slice::Ruby::CodeVisitor::visitClassDefStart(const ClassDefPtr& p)
//
// Interfaces
//
- // TODO: Necessary?
- //
{
int interfaceCount = 0;
for(ClassList::const_iterator q = bases.begin(); q != bases.end(); ++q)
@@ -644,7 +642,7 @@ Slice::Ruby::CodeVisitor::visitClassDefStart(const ClassDefPtr& p)
//
// Data members are represented as an array:
//
- // ['MemberName', MemberType]
+ // ['MemberName', MemberType, Optional, Tag]
//
// where MemberType is either a primitive type constant (T_INT, etc.) or the id of a constructed type.
//
@@ -663,7 +661,8 @@ Slice::Ruby::CodeVisitor::visitClassDefStart(const ClassDefPtr& p)
}
_out << "['" << fixIdent((*q)->name(), IdentNormal) << "', ";
writeType((*q)->type());
- _out << ']';
+ _out << ", " << ((*q)->optional() ? "true" : "false") << ", " << ((*q)->optional() ? (*q)->tag() : 0)
+ << ']';
}
}
if(members.size() > 1)
@@ -677,7 +676,7 @@ Slice::Ruby::CodeVisitor::visitClassDefStart(const ClassDefPtr& p)
//
// Define each operation. The arguments to __defineOperation are:
//
- // 'opName', Mode, IsAmd, FormatType, [InParams], [OutParams], ReturnType, [Exceptions]
+ // 'opName', Mode, IsAmd, FormatType, [InParams], [OutParams], ReturnParam, [Exceptions]
//
// where InParams and OutParams are arrays of type descriptions, and Exceptions
// is an array of exception types.
@@ -747,7 +746,10 @@ Slice::Ruby::CodeVisitor::visitClassDefStart(const ClassDefPtr& p)
{
_out << ", ";
}
+ _out << '[';
writeType((*t)->type());
+ _out << ", " << ((*t)->optional() ? "true" : "false") << ", "
+ << ((*t)->optional() ? (*t)->tag() : 0) << ']';
++count;
}
}
@@ -760,7 +762,10 @@ Slice::Ruby::CodeVisitor::visitClassDefStart(const ClassDefPtr& p)
{
_out << ", ";
}
+ _out << '[';
writeType((*t)->type());
+ _out << ", " << ((*t)->optional() ? "true" : "false") << ", "
+ << ((*t)->optional() ? (*t)->tag() : 0) << ']';
++count;
}
}
@@ -768,7 +773,15 @@ Slice::Ruby::CodeVisitor::visitClassDefStart(const ClassDefPtr& p)
TypePtr returnType = (*s)->returnType();
if(returnType)
{
+ //
+ // The return type has the same format as an in/out parameter:
+ //
+ // Type, Optional?, OptionalTag
+ //
+ _out << '[';
writeType(returnType);
+ _out << ", " << ((*s)->returnIsOptional() ? "true" : "false") << ", "
+ << ((*s)->returnIsOptional() ? (*s)->returnTag() : 0) << ']';
}
else
{
@@ -932,7 +945,7 @@ Slice::Ruby::CodeVisitor::visitExceptionStart(const ExceptionPtr& p)
//
// Data members are represented as an array:
//
- // ['MemberName', MemberType]
+ // ['MemberName', MemberType, Optional, Tag]
//
// where MemberType is either a primitive type constant (T_INT, etc.) or the id of a constructed type.
//
@@ -944,7 +957,8 @@ Slice::Ruby::CodeVisitor::visitExceptionStart(const ExceptionPtr& p)
}
_out << "[\"" << fixIdent((*dmli)->name(), IdentNormal) << "\", ";
writeType((*dmli)->type());
- _out << ']';
+ _out << ", " << ((*dmli)->optional() ? "true" : "false") << ", " << ((*dmli)->optional() ? (*dmli)->tag() : 0)
+ << ']';
}
if(members.size() > 1)
{
@@ -1604,6 +1618,10 @@ Slice::Ruby::CodeVisitor::writeConstructorParams(const MemberInfoList& members)
{
writeConstantValue(member->type(), member->defaultValueType(), member->defaultValue());
}
+ else if(member->optional())
+ {
+ _out << "::Ice::Unset";
+ }
else
{
_out << getInitializer(member->type());
diff --git a/cpp/src/slice2cpp/Gen.cpp b/cpp/src/slice2cpp/Gen.cpp
index e46b5aeae43..1edb081c9ad 100644
--- a/cpp/src/slice2cpp/Gen.cpp
+++ b/cpp/src/slice2cpp/Gen.cpp
@@ -4581,7 +4581,17 @@ Slice::Gen::ObjectVisitor::emitGCFunctions(const ClassDefPtr& p)
{
if((*i)->type()->usesClasses())
{
- emitGCInsertCode((*i)->type(), getDataMemberRef(*i), "", 0);
+ if((*i)->optional())
+ {
+ C << nl << "if(" << fixKwd((*i)->name()) << ')';
+ C << sb;
+ emitGCInsertCode((*i)->type(), getDataMemberRef(*i), "", 0);
+ C << eb;
+ }
+ else
+ {
+ emitGCInsertCode((*i)->type(), getDataMemberRef(*i), "", 0);
+ }
}
}
C << eb;
@@ -4617,7 +4627,17 @@ Slice::Gen::ObjectVisitor::emitGCFunctions(const ClassDefPtr& p)
{
if((*j)->type()->usesClasses())
{
- emitGCClearCode((*j)->type(), getDataMemberRef(*j), "", 0);
+ if((*j)->optional())
+ {
+ C << nl << "if(" << fixKwd((*j)->name()) << ')';
+ C << sb;
+ emitGCClearCode((*j)->type(), getDataMemberRef(*j), "", 0);
+ C << eb;
+ }
+ else
+ {
+ emitGCClearCode((*j)->type(), getDataMemberRef(*j), "", 0);
+ }
}
}
C << eb;
diff --git a/cpp/test/Ice/optional/Test.ice b/cpp/test/Ice/optional/Test.ice
index ab306459ab1..4fcf2c6e092 100644
--- a/cpp/test/Ice/optional/Test.ice
+++ b/cpp/test/Ice/optional/Test.ice
@@ -24,9 +24,14 @@ enum MyEnum
MyEnumMember
};
+struct SmallStruct
+{
+ byte m;
+};
+
struct FixedStruct
{
- int m;
+ int m;
};
struct VarStruct
@@ -42,15 +47,22 @@ struct VarStruct
sequence<byte> ByteSeq;
sequence<bool> BoolSeq;
sequence<short> ShortSeq;
+sequence<int> IntSeq;
+sequence<long> LongSeq;
+sequence<float> FloatSeq;
+sequence<double> DoubleSeq;
sequence<string> StringSeq;
sequence<MyEnum> MyEnumSeq;
+sequence<SmallStruct> SmallStructSeq;
+["cpp:type:std::list< ::Test::SmallStruct>"] sequence<SmallStruct> SmallStructList;
sequence<FixedStruct> FixedStructSeq;
+["cpp:type:std::list< ::Test::FixedStruct>"] sequence<FixedStruct> FixedStructList;
sequence<VarStruct> VarStructSeq;
sequence<OneOptional> OneOptionalSeq;
sequence<OneOptional*> OneOptionalPrxSeq;
-dictionary<int, int> IntIntDict;
-dictionary<string, int> StringIntDict;
+dictionary<int, int> IntIntDict;
+dictionary<string, int> StringIntDict;
dictionary<int, MyEnum> IntEnumDict;
dictionary<int, FixedStruct> IntFixedStructDict;
dictionary<int, VarStruct> IntVarStructDict;
@@ -127,6 +139,18 @@ exception OptionalException
optional(50) OneOptional o;
};
+exception DerivedException extends OptionalException
+{
+ optional(600) string ss = "test";
+ optional(601) OneOptional o2;
+};
+
+exception RequiredException extends OptionalException
+{
+ string ss = "test";
+ OneOptional o2;
+};
+
class OptionalWithCustom
{
["cpp:type:std::list< ::Ice::Byte>"] optional(1) ByteSeq bs;
@@ -142,35 +166,84 @@ class Initial
void opOptionalException(optional(1) int a, optional(2) string b, optional(3) OneOptional o)
throws OptionalException;
+ void opDerivedException(optional(1) int a, optional(2) string b, optional(3) OneOptional o)
+ throws OptionalException;
+
+ void opRequiredException(optional(1) int a, optional(2) string b, optional(3) OneOptional o)
+ throws OptionalException;
+
optional(1) byte opByte(optional(2) byte p1, out optional(3) byte p3);
+ optional(1) bool opBool(optional(2) bool p1, out optional(3) bool p3);
+
+ optional(1) short opShort(optional(2) short p1, out optional(3) short p3);
+
+ optional(1) int opInt(optional(2) int p1, out optional(3) int p3);
+
optional(3) long opLong(optional(1) long p1, out optional(2) long p3);
+ optional(1) float opFloat(optional(2) float p1, out optional(3) float p3);
+
+ optional(1) double opDouble(optional(2) double p1, out optional(3) double p3);
+
optional(1) string opString(optional(2) string p1, out optional(3) string p3);
+ optional(1) MyEnum opMyEnum(optional(2) MyEnum p1, out optional(3) MyEnum p3);
+
+ optional(1) SmallStruct opSmallStruct(optional(2) SmallStruct p1, out optional(3) SmallStruct p3);
+
+ optional(1) FixedStruct opFixedStruct(optional(2) FixedStruct p1, out optional(3) FixedStruct p3);
+
+ optional(1) VarStruct opVarStruct(optional(2) VarStruct p1, out optional(3) VarStruct p3);
+
optional(1) OneOptional opOneOptional(optional(2) OneOptional p1, out optional(3) OneOptional p3);
optional(1) OneOptional* opOneOptionalProxy(optional(2) OneOptional* p1, out optional(3) OneOptional* p3);
// Custom mapping operations
- ["cpp:array"] optional(1) ByteSeq opByteSeq(["cpp:array"] optional(2) ByteSeq p1,
+ ["cpp:array"] optional(1) ByteSeq opByteSeq(["cpp:array"] optional(2) ByteSeq p1,
out ["cpp:array"] optional(3) ByteSeq p3);
- ["cpp:array"] optional(1) ShortSeq opShortSeq(["cpp:array"] optional(2) ShortSeq p1,
+ ["cpp:array"] optional(1) BoolSeq opBoolSeq(["cpp:array"] optional(2) BoolSeq p1,
+ out ["cpp:array"] optional(3) BoolSeq p3);
+
+ ["cpp:array"] optional(1) ShortSeq opShortSeq(["cpp:array"] optional(2) ShortSeq p1,
out ["cpp:array"] optional(3) ShortSeq p3);
- ["cpp:range:array"] optional(1) BoolSeq opBoolSeq(["cpp:range:array"] optional(2) BoolSeq p1,
- out ["cpp:range:array"] optional(3) BoolSeq p3);
+ ["cpp:range:array"] optional(1) IntSeq opIntSeq(["cpp:range:array"] optional(2) IntSeq p1,
+ out ["cpp:range:array"] optional(3) IntSeq p3);
+
+ ["cpp:range:array"] optional(1) LongSeq opLongSeq(["cpp:range:array"] optional(2) LongSeq p1,
+ out ["cpp:range:array"] optional(3) LongSeq p3);
- ["cpp:range"] optional(1) StringSeq opStringSeq(["cpp:range"] optional(2) StringSeq p1,
+ ["cpp:range:array"] optional(1) FloatSeq opFloatSeq(["cpp:range:array"] optional(2) FloatSeq p1,
+ out ["cpp:range:array"] optional(3) FloatSeq p3);
+
+ ["cpp:range:array"] optional(1) DoubleSeq opDoubleSeq(["cpp:range:array"] optional(2) DoubleSeq p1,
+ out ["cpp:range:array"] optional(3) DoubleSeq p3);
+
+ ["cpp:range"] optional(1) StringSeq opStringSeq(["cpp:range"] optional(2) StringSeq p1,
out ["cpp:range"] optional(3) StringSeq p3);
- ["cpp:array"] optional(1) FixedStructSeq opFixedStructSeq(["cpp:array"] optional(2) FixedStructSeq p1,
+ ["cpp:array"] optional(1) SmallStructSeq opSmallStructSeq(["cpp:array"] optional(2) SmallStructSeq p1,
+ out ["cpp:array"] optional(3) SmallStructSeq p3);
+
+ ["cpp:array"] optional(1) SmallStructList opSmallStructList(["cpp:array"] optional(2) SmallStructList p1,
+ out ["cpp:array"] optional(3) SmallStructList p3);
+
+ ["cpp:array"] optional(1) FixedStructSeq opFixedStructSeq(["cpp:array"] optional(2) FixedStructSeq p1,
out ["cpp:array"] optional(3) FixedStructSeq p3);
- ["cpp:range"] optional(1) VarStructSeq opVarStructSeq(["cpp:range"] optional(2) VarStructSeq p1,
+ ["cpp:array"] optional(1) FixedStructList opFixedStructList(["cpp:array"] optional(2) FixedStructList p1,
+ out ["cpp:array"] optional(3) FixedStructList p3);
+
+ ["cpp:range"] optional(1) VarStructSeq opVarStructSeq(["cpp:range"] optional(2) VarStructSeq p1,
out ["cpp:range"] optional(3) VarStructSeq p3);
+ optional(1) IntIntDict opIntIntDict(optional(2) IntIntDict p1, out optional(3) IntIntDict p3);
+
+ optional(1) StringIntDict opStringIntDict(optional(2) StringIntDict p1, out optional(3) StringIntDict p3);
+
void opClassAndUnknownOptional(A p);
};
diff --git a/cpp/test/Ice/optional/TestI.cpp b/cpp/test/Ice/optional/TestI.cpp
index 22de9e2cb6e..826d0e9178c 100644
--- a/cpp/test/Ice/optional/TestI.cpp
+++ b/cpp/test/Ice/optional/TestI.cpp
@@ -44,6 +44,42 @@ InitialI::opOptionalException(const Optional<Int>& a,
throw ex;
}
+void
+InitialI::opDerivedException(const Optional<Int>& a,
+ const Optional<string>& b,
+ const Optional<OneOptionalPtr>& o,
+ const Ice::Current&)
+{
+ DerivedException ex;
+ ex.a = a;
+ ex.b = b;
+ ex.o = o;
+ ex.ss = b;
+ ex.o2 = o;
+ throw ex;
+}
+
+void
+InitialI::opRequiredException(const Optional<Int>& a,
+ const Optional<string>& b,
+ const Optional<OneOptionalPtr>& o,
+ const Ice::Current&)
+{
+ RequiredException ex;
+ ex.a = a;
+ ex.b = b;
+ ex.o = o;
+ if(b)
+ {
+ ex.ss = b.get();
+ }
+ if(o)
+ {
+ ex.o2 = o.get();
+ }
+ throw ex;
+}
+
Optional<Ice::Byte>
InitialI::opByte(const Optional<Ice::Byte>& p1, Optional<Ice::Byte>& p3, const Current&)
{
@@ -51,6 +87,27 @@ InitialI::opByte(const Optional<Ice::Byte>& p1, Optional<Ice::Byte>& p3, const C
return p1;
}
+Optional<bool>
+InitialI::opBool(const Optional<bool>& p1, Optional<bool>& p3, const Current&)
+{
+ p3 = p1;
+ return p1;
+}
+
+Optional<Short>
+InitialI::opShort(const Optional<Short>& p1, Optional<Short>& p3, const Current&)
+{
+ p3 = p1;
+ return p1;
+}
+
+Optional<Int>
+InitialI::opInt(const Optional<Int>& p1, Optional<Int>& p3, const Current&)
+{
+ p3 = p1;
+ return p1;
+}
+
Optional<Long>
InitialI::opLong(const Optional<Long>& p1, Optional<Long>& p3, const Current&)
{
@@ -58,6 +115,20 @@ InitialI::opLong(const Optional<Long>& p1, Optional<Long>& p3, const Current&)
return p1;
}
+Optional<Float>
+InitialI::opFloat(const Optional<Float>& p1, Optional<Float>& p3, const Current&)
+{
+ p3 = p1;
+ return p1;
+}
+
+Optional<Double>
+InitialI::opDouble(const Optional<Double>& p1, Optional<Double>& p3, const Current&)
+{
+ p3 = p1;
+ return p1;
+}
+
Optional<string>
InitialI::opString(const Optional<string>& p1, Optional<string>& p3, const Current&)
{
@@ -65,6 +136,34 @@ InitialI::opString(const Optional<string>& p1, Optional<string>& p3, const Curre
return p1;
}
+Optional<MyEnum>
+InitialI::opMyEnum(const Optional<MyEnum>& p1, Optional<MyEnum>& p3, const Current&)
+{
+ p3 = p1;
+ return p1;
+}
+
+Optional<SmallStruct>
+InitialI::opSmallStruct(const Optional<SmallStruct>& p1, Optional<SmallStruct>& p3, const Current&)
+{
+ p3 = p1;
+ return p1;
+}
+
+Optional<FixedStruct>
+InitialI::opFixedStruct(const Optional<FixedStruct>& p1, Optional<FixedStruct>& p3, const Current&)
+{
+ p3 = p1;
+ return p1;
+}
+
+Optional<VarStruct>
+InitialI::opVarStruct(const Optional<VarStruct>& p1, Optional<VarStruct>& p3, const Current&)
+{
+ p3 = p1;
+ return p1;
+}
+
Optional<OneOptionalPtr>
InitialI::opOneOptional(const Optional<OneOptionalPtr>& p1, Optional<OneOptionalPtr>& p3, const Current&)
{
@@ -79,8 +178,8 @@ InitialI::opOneOptionalProxy(const Optional<OneOptionalPrx>& p1, Optional<OneOpt
return p1;
}
-Optional<Ice::ByteSeq>
-InitialI::opByteSeq(const Optional<pair<const Ice::Byte*, const Ice::Byte*> >& p1, Optional<Ice::ByteSeq>& p3,
+Optional<Test::ByteSeq>
+InitialI::opByteSeq(const Optional<pair<const Ice::Byte*, const Ice::Byte*> >& p1, Optional<Test::ByteSeq>& p3,
const Current&)
{
if(p1)
@@ -90,8 +189,19 @@ InitialI::opByteSeq(const Optional<pair<const Ice::Byte*, const Ice::Byte*> >& p
return p3;
}
-Optional<Ice::ShortSeq>
-InitialI::opShortSeq(const Optional<pair<const Short*, const Short*> >& p1, Optional<Ice::ShortSeq>& p3, const Current&)
+Optional<Test::BoolSeq>
+InitialI::opBoolSeq(const Optional<pair<const bool*, const bool*> >& p1, Optional<Test::BoolSeq>& p3, const Current&)
+{
+ if(p1)
+ {
+ p3 = Ice::BoolSeq(p1->first, p1->second);
+ }
+ return p3;
+}
+
+Optional<Test::ShortSeq>
+InitialI::opShortSeq(const Optional<pair<const Short*, const Short*> >& p1, Optional<Test::ShortSeq>& p3,
+ const Current&)
{
if(p1)
{
@@ -100,20 +210,51 @@ InitialI::opShortSeq(const Optional<pair<const Short*, const Short*> >& p1, Opti
return p3;
}
-Optional<Ice::BoolSeq>
-InitialI::opBoolSeq(const Optional<pair<const bool*, const bool*> >& p1, Optional<Ice::BoolSeq>& p3, const Current&)
+Optional<Test::IntSeq>
+InitialI::opIntSeq(const Optional<pair<const Int*, const Int*> >& p1, Optional<Test::IntSeq>& p3, const Current&)
{
if(p1)
{
- p3 = Ice::BoolSeq(p1->first, p1->second);
+ p3 = Test::IntSeq(p1->first, p1->second);
+ }
+ return p3;
+}
+
+Optional<Test::LongSeq>
+InitialI::opLongSeq(const Optional<pair<const Long*, const Long*> >& p1, Optional<Test::LongSeq>& p3, const Current&)
+{
+ if(p1)
+ {
+ p3 = Test::LongSeq(p1->first, p1->second);
+ }
+ return p3;
+}
+
+Optional<Test::FloatSeq>
+InitialI::opFloatSeq(const Optional<pair<const Float*, const Float*> >& p1, Optional<Test::FloatSeq>& p3,
+ const Current&)
+{
+ if(p1)
+ {
+ p3 = Test::FloatSeq(p1->first, p1->second);
+ }
+ return p3;
+}
+
+Optional<Test::DoubleSeq>
+InitialI::opDoubleSeq(const Optional<pair<const Double*, const Double*> >& p1, Optional<Test::DoubleSeq>& p3,
+ const Current&)
+{
+ if(p1)
+ {
+ p3 = Test::DoubleSeq(p1->first, p1->second);
}
return p3;
}
Optional<Ice::StringSeq>
InitialI::opStringSeq(const Optional<pair<Ice::StringSeq::const_iterator, Ice::StringSeq::const_iterator> >& p1,
- Optional<Ice::StringSeq>& p3,
- const Current&)
+ Optional<Ice::StringSeq>& p3, const Current&)
{
if(p1)
{
@@ -122,10 +263,31 @@ InitialI::opStringSeq(const Optional<pair<Ice::StringSeq::const_iterator, Ice::S
return p3;
}
+Optional<SmallStructSeq>
+InitialI::opSmallStructSeq(const Optional<pair<const SmallStruct*, const SmallStruct*> >& p1,
+ Optional<SmallStructSeq>& p3, const Current&)
+{
+ if(p1)
+ {
+ p3 = SmallStructSeq(p1->first, p1->second);
+ }
+ return p3;
+}
+
+Optional<SmallStructList>
+InitialI::opSmallStructList(const Optional<pair<const SmallStruct*, const SmallStruct*> >& p1,
+ Optional<SmallStructList>& p3, const Current&)
+{
+ if(p1)
+ {
+ p3 = SmallStructList(p1->first, p1->second);
+ }
+ return p3;
+}
+
Optional<FixedStructSeq>
InitialI::opFixedStructSeq(const Optional<pair<const FixedStruct*, const FixedStruct*> >& p1,
- Optional<FixedStructSeq>& p3,
- const Current&)
+ Optional<FixedStructSeq>& p3, const Current&)
{
if(p1)
{
@@ -134,10 +296,20 @@ InitialI::opFixedStructSeq(const Optional<pair<const FixedStruct*, const FixedSt
return p3;
}
+Optional<FixedStructList>
+InitialI::opFixedStructList(const Optional<pair<const FixedStruct*, const FixedStruct*> >& p1,
+ Optional<FixedStructList>& p3, const Current&)
+{
+ if(p1)
+ {
+ p3 = FixedStructList(p1->first, p1->second);
+ }
+ return p3;
+}
+
Optional<VarStructSeq>
InitialI::opVarStructSeq(const Optional<pair<VarStructSeq::const_iterator, VarStructSeq::const_iterator> >& p1,
- Optional<VarStructSeq>& p3,
- const Current&)
+ Optional<VarStructSeq>& p3, const Current&)
{
if(p1)
{
@@ -146,6 +318,26 @@ InitialI::opVarStructSeq(const Optional<pair<VarStructSeq::const_iterator, VarSt
return p3;
}
+Optional<IntIntDict>
+InitialI::opIntIntDict(const Optional<IntIntDict>& p1, Optional<IntIntDict>& p3, const Current&)
+{
+ if(p1)
+ {
+ p3 = p1;
+ }
+ return p3;
+}
+
+Optional<StringIntDict>
+InitialI::opStringIntDict(const Optional<StringIntDict>& p1, Optional<StringIntDict>& p3, const Current&)
+{
+ if(p1)
+ {
+ p3 = p1;
+ }
+ return p3;
+}
+
void
InitialI::opClassAndUnknownOptional(const APtr& a, const Ice::Current&)
{
diff --git a/cpp/test/Ice/optional/TestI.h b/cpp/test/Ice/optional/TestI.h
index e6d5d07c60b..2a0e769bc61 100644
--- a/cpp/test/Ice/optional/TestI.h
+++ b/cpp/test/Ice/optional/TestI.h
@@ -22,60 +22,147 @@ public:
virtual void shutdown(const Ice::Current&);
virtual Ice::ObjectPtr pingPong(const Ice::ObjectPtr&, const Ice::Current&);
- virtual void opOptionalException(const IceUtil::Optional< ::Ice::Int>&,
+ virtual void opOptionalException(const IceUtil::Optional< ::Ice::Int>&,
const IceUtil::Optional< ::std::string>&,
const IceUtil::Optional<Test::OneOptionalPtr>&,
const Ice::Current&);
- virtual IceUtil::Optional< ::Ice::Byte> opByte(const IceUtil::Optional< ::Ice::Byte>&,
- IceUtil::Optional< ::Ice::Byte>&,
+ virtual void opDerivedException(const IceUtil::Optional< ::Ice::Int>&,
+ const IceUtil::Optional< ::std::string>&,
+ const IceUtil::Optional<Test::OneOptionalPtr>&,
+ const Ice::Current&);
+
+ virtual void opRequiredException(const IceUtil::Optional< ::Ice::Int>&,
+ const IceUtil::Optional< ::std::string>&,
+ const IceUtil::Optional<Test::OneOptionalPtr>&,
+ const Ice::Current&);
+
+ virtual IceUtil::Optional< ::Ice::Byte> opByte(const IceUtil::Optional< ::Ice::Byte>&,
+ IceUtil::Optional< ::Ice::Byte>&,
const ::Ice::Current&);
-
- virtual IceUtil::Optional< ::Ice::Long> opLong(const IceUtil::Optional< ::Ice::Long>&,
- IceUtil::Optional< ::Ice::Long>&,
+
+ virtual IceUtil::Optional< bool> opBool(const IceUtil::Optional< bool>&, IceUtil::Optional< bool>&,
+ const ::Ice::Current&);
+
+ virtual IceUtil::Optional< ::Ice::Short> opShort(const IceUtil::Optional< ::Ice::Short>&,
+ IceUtil::Optional< ::Ice::Short>&,
+ const ::Ice::Current&);
+
+ virtual IceUtil::Optional< ::Ice::Int> opInt(const IceUtil::Optional< ::Ice::Int>&,
+ IceUtil::Optional< ::Ice::Int>&,
+ const ::Ice::Current&);
+
+ virtual IceUtil::Optional< ::Ice::Long> opLong(const IceUtil::Optional< ::Ice::Long>&,
+ IceUtil::Optional< ::Ice::Long>&,
const ::Ice::Current&);
- virtual IceUtil::Optional< ::std::string> opString(const IceUtil::Optional< ::std::string>&,
- IceUtil::Optional< ::std::string>&,
+ virtual IceUtil::Optional< ::Ice::Float> opFloat(const IceUtil::Optional< ::Ice::Float>&,
+ IceUtil::Optional< ::Ice::Float>&,
+ const ::Ice::Current&);
+
+ virtual IceUtil::Optional< ::Ice::Double> opDouble(const IceUtil::Optional< ::Ice::Double>&,
+ IceUtil::Optional< ::Ice::Double>&,
const ::Ice::Current&);
- virtual IceUtil::Optional<Test::OneOptionalPtr> opOneOptional(const IceUtil::Optional< Test::OneOptionalPtr>&,
- IceUtil::Optional< Test::OneOptionalPtr>&,
+ virtual IceUtil::Optional< ::std::string> opString(const IceUtil::Optional< ::std::string>&,
+ IceUtil::Optional< ::std::string>&,
+ const ::Ice::Current&);
+
+ virtual IceUtil::Optional< Test::MyEnum> opMyEnum(const IceUtil::Optional<Test::MyEnum>&,
+ IceUtil::Optional<Test::MyEnum>&,
+ const ::Ice::Current&);
+
+ virtual IceUtil::Optional<Test::SmallStruct> opSmallStruct(const IceUtil::Optional<Test::SmallStruct>&,
+ IceUtil::Optional<Test::SmallStruct>&,
+ const ::Ice::Current&);
+
+ virtual IceUtil::Optional<Test::FixedStruct> opFixedStruct(const IceUtil::Optional<Test::FixedStruct>&,
+ IceUtil::Optional<Test::FixedStruct>&,
+ const ::Ice::Current&);
+
+ virtual IceUtil::Optional<Test::VarStruct> opVarStruct(const IceUtil::Optional<Test::VarStruct>&,
+ IceUtil::Optional<Test::VarStruct>&,
+ const ::Ice::Current&);
+
+ virtual IceUtil::Optional<Test::OneOptionalPtr> opOneOptional(const IceUtil::Optional< Test::OneOptionalPtr>&,
+ IceUtil::Optional< Test::OneOptionalPtr>&,
const ::Ice::Current&);
-
- virtual IceUtil::Optional<Test::OneOptionalPrx> opOneOptionalProxy(const IceUtil::Optional< Test::OneOptionalPrx>&,
- IceUtil::Optional< Test::OneOptionalPrx>&,
+
+ virtual IceUtil::Optional<Test::OneOptionalPrx> opOneOptionalProxy(const IceUtil::Optional< Test::OneOptionalPrx>&,
+ IceUtil::Optional< Test::OneOptionalPrx>&,
const ::Ice::Current&);
-
+
virtual IceUtil::Optional< ::Test::ByteSeq> opByteSeq(
- const IceUtil::Optional< ::std::pair<const ::Ice::Byte*, const ::Ice::Byte*> >&,
- IceUtil::Optional< ::Test::ByteSeq>&,
+ const IceUtil::Optional< ::std::pair<const ::Ice::Byte*, const ::Ice::Byte*> >&,
+ IceUtil::Optional< ::Test::ByteSeq>&,
+ const ::Ice::Current& = ::Ice::Current());
+
+ virtual IceUtil::Optional< ::Test::BoolSeq> opBoolSeq(
+ const IceUtil::Optional< ::std::pair<const bool*, const bool*> >&,
+ IceUtil::Optional< ::Test::BoolSeq>&,
const ::Ice::Current& = ::Ice::Current());
virtual IceUtil::Optional< ::Test::ShortSeq> opShortSeq(
- const IceUtil::Optional< ::std::pair<const ::Ice::Short*, const ::Ice::Short*> >&,
- IceUtil::Optional< ::Test::ShortSeq>&,
+ const IceUtil::Optional< ::std::pair<const ::Ice::Short*, const ::Ice::Short*> >&,
+ IceUtil::Optional< ::Test::ShortSeq>&,
const ::Ice::Current& = ::Ice::Current());
- virtual IceUtil::Optional< ::Test::BoolSeq> opBoolSeq(
- const IceUtil::Optional< ::std::pair<const bool*, const bool*> >&,
- IceUtil::Optional< ::Test::BoolSeq>&,
+ virtual IceUtil::Optional< ::Test::IntSeq> opIntSeq(
+ const IceUtil::Optional< ::std::pair<const ::Ice::Int*, const ::Ice::Int*> >&,
+ IceUtil::Optional< ::Test::IntSeq>&,
+ const ::Ice::Current& = ::Ice::Current());
+
+ virtual IceUtil::Optional< ::Test::LongSeq> opLongSeq(
+ const IceUtil::Optional< ::std::pair<const ::Ice::Long*, const ::Ice::Long*> >&,
+ IceUtil::Optional< ::Test::LongSeq>&,
+ const ::Ice::Current& = ::Ice::Current());
+
+ virtual IceUtil::Optional< ::Test::FloatSeq> opFloatSeq(
+ const IceUtil::Optional< ::std::pair<const ::Ice::Float*, const ::Ice::Float*> >&,
+ IceUtil::Optional< ::Test::FloatSeq>&,
+ const ::Ice::Current& = ::Ice::Current());
+
+ virtual IceUtil::Optional< ::Test::DoubleSeq> opDoubleSeq(
+ const IceUtil::Optional< ::std::pair<const ::Ice::Double*, const ::Ice::Double*> >&,
+ IceUtil::Optional< ::Test::DoubleSeq>&,
const ::Ice::Current& = ::Ice::Current());
virtual IceUtil::Optional< ::Test::StringSeq> opStringSeq(
- const IceUtil::Optional< ::std::pair< ::Test::StringSeq::const_iterator,
+ const IceUtil::Optional< ::std::pair< ::Test::StringSeq::const_iterator,
::Test::StringSeq::const_iterator> >&,
- IceUtil::Optional< ::Test::StringSeq>&,
+ IceUtil::Optional< ::Test::StringSeq>&,
const ::Ice::Current& = ::Ice::Current());
+ virtual IceUtil::Optional< ::Test::SmallStructSeq> opSmallStructSeq(
+ const IceUtil::Optional< ::std::pair<const ::Test::SmallStruct*, const ::Test::SmallStruct*> >&,
+ IceUtil::Optional< ::Test::SmallStructSeq>&, const ::Ice::Current& = ::Ice::Current());
+
+ virtual IceUtil::Optional< ::Test::SmallStructList> opSmallStructList(
+ const IceUtil::Optional< ::std::pair<const ::Test::SmallStruct*, const ::Test::SmallStruct*> >&,
+ IceUtil::Optional< ::Test::SmallStructList>&, const ::Ice::Current& = ::Ice::Current());
+
virtual IceUtil::Optional< ::Test::FixedStructSeq> opFixedStructSeq(
const IceUtil::Optional< ::std::pair<const ::Test::FixedStruct*, const ::Test::FixedStruct*> >&,
IceUtil::Optional< ::Test::FixedStructSeq>&, const ::Ice::Current& = ::Ice::Current());
-
+
+ virtual IceUtil::Optional< ::Test::FixedStructList> opFixedStructList(
+ const IceUtil::Optional< ::std::pair<const ::Test::FixedStruct*, const ::Test::FixedStruct*> >&,
+ IceUtil::Optional< ::Test::FixedStructList>&, const ::Ice::Current& = ::Ice::Current());
+
virtual IceUtil::Optional< ::Test::VarStructSeq> opVarStructSeq(
- const IceUtil::Optional< ::std::pair< ::Test::VarStructSeq::const_iterator,
+ const IceUtil::Optional< ::std::pair< ::Test::VarStructSeq::const_iterator,
::Test::VarStructSeq::const_iterator> >&,
- IceUtil::Optional< ::Test::VarStructSeq>&,
+ IceUtil::Optional< ::Test::VarStructSeq>&,
+ const ::Ice::Current& = ::Ice::Current());
+
+ virtual IceUtil::Optional< ::Test::IntIntDict> opIntIntDict(
+ const IceUtil::Optional< ::Test::IntIntDict>&,
+ IceUtil::Optional< ::Test::IntIntDict>&,
+ const ::Ice::Current& = ::Ice::Current());
+
+ virtual IceUtil::Optional< ::Test::StringIntDict> opStringIntDict(
+ const IceUtil::Optional< ::Test::StringIntDict>&,
+ IceUtil::Optional< ::Test::StringIntDict>&,
const ::Ice::Current& = ::Ice::Current());
virtual void opClassAndUnknownOptional(const Test::APtr&, const Ice::Current&);