summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJose <jose@zeroc.com>2008-12-26 22:01:19 +0100
committerJose <jose@zeroc.com>2008-12-26 22:01:19 +0100
commitc80a7d15425c30b9e66f7ed7da26632eec14c432 (patch)
tree60f2f061f36c840a091c2bf74fd36a31c12ce07c
parentbug 3617 - more applet fixes (diff)
downloadice-c80a7d15425c30b9e66f7ed7da26632eec14c432.tar.bz2
ice-c80a7d15425c30b9e66f7ed7da26632eec14c432.tar.xz
ice-c80a7d15425c30b9e66f7ed7da26632eec14c432.zip
Fix 3375 - NRVO + custom sequence demo
-rw-r--r--cpp/demo/Ice/nrvo/.depend5
-rw-r--r--cpp/demo/Ice/nrvo/.gitignore7
-rw-r--r--cpp/demo/Ice/nrvo/Client.cpp141
-rw-r--r--cpp/demo/Ice/nrvo/Makefile42
-rw-r--r--cpp/demo/Ice/nrvo/Makefile.mak50
-rw-r--r--cpp/demo/Ice/nrvo/MyStringSeq.h32
-rw-r--r--cpp/demo/Ice/nrvo/Nrvo.ice30
-rw-r--r--cpp/demo/Ice/nrvo/NrvoI.cpp54
-rw-r--r--cpp/demo/Ice/nrvo/NrvoI.h31
-rw-r--r--cpp/demo/Ice/nrvo/README11
-rw-r--r--cpp/demo/Ice/nrvo/Server.cpp44
-rw-r--r--cpp/demo/Ice/nrvo/config.client20
-rw-r--r--cpp/demo/Ice/nrvo/config.server20
-rw-r--r--cpp/demo/Ice/nrvo/expect.py30
-rw-r--r--demoscript/Ice/nrvo.py27
15 files changed, 544 insertions, 0 deletions
diff --git a/cpp/demo/Ice/nrvo/.depend b/cpp/demo/Ice/nrvo/.depend
new file mode 100644
index 00000000000..927f573b68e
--- /dev/null
+++ b/cpp/demo/Ice/nrvo/.depend
@@ -0,0 +1,5 @@
+Nrvo$(OBJEXT): Nrvo.cpp Nrvo.h $(includedir)/Ice/LocalObjectF.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/Config.h $(includedir)/Ice/Handle.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/Exception.h $(includedir)/Ice/Config.h $(includedir)/Ice/ProxyHandle.h $(includedir)/Ice/ProxyF.h $(includedir)/Ice/ObjectF.h $(includedir)/Ice/GCCountMap.h $(includedir)/Ice/GCShared.h $(includedir)/Ice/Exception.h $(includedir)/Ice/LocalObject.h $(includedir)/Ice/Proxy.h $(includedir)/IceUtil/Mutex.h $(includedir)/IceUtil/Lock.h $(includedir)/IceUtil/ThreadException.h $(includedir)/IceUtil/Time.h $(includedir)/Ice/ProxyFactoryF.h $(includedir)/Ice/ConnectionIF.h $(includedir)/Ice/RequestHandlerF.h $(includedir)/Ice/EndpointIF.h $(includedir)/Ice/Endpoint.h $(includedir)/Ice/UndefSysMacros.h $(includedir)/Ice/ObjectAdapterF.h $(includedir)/Ice/ReferenceF.h $(includedir)/Ice/OutgoingAsyncF.h $(includedir)/Ice/Current.h $(includedir)/Ice/ConnectionF.h $(includedir)/Ice/Identity.h $(includedir)/Ice/StreamF.h $(includedir)/Ice/CommunicatorF.h $(includedir)/Ice/Object.h $(includedir)/Ice/IncomingAsyncF.h $(includedir)/Ice/Outgoing.h $(includedir)/IceUtil/Monitor.h $(includedir)/IceUtil/Cond.h $(includedir)/Ice/InstanceF.h $(includedir)/Ice/BasicStream.h $(includedir)/Ice/ObjectFactoryF.h $(includedir)/Ice/Buffer.h $(includedir)/Ice/Protocol.h $(includedir)/Ice/StringConverter.h $(includedir)/Ice/Plugin.h $(includedir)/Ice/LoggerF.h $(includedir)/IceUtil/Unicode.h $(includedir)/Ice/Incoming.h $(includedir)/Ice/ServantLocatorF.h $(includedir)/Ice/ServantManagerF.h $(includedir)/Ice/Direct.h MyStringSeq.h $(includedir)/Ice/LocalException.h $(includedir)/Ice/BuiltinSequences.h $(includedir)/Ice/ObjectFactory.h $(includedir)/IceUtil/Iterator.h $(includedir)/IceUtil/ScopedArray.h
+Client$(OBJEXT): Client.cpp $(includedir)/Ice/Ice.h $(includedir)/Ice/Initialize.h $(includedir)/Ice/CommunicatorF.h $(includedir)/Ice/LocalObjectF.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/Config.h $(includedir)/Ice/Handle.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/Exception.h $(includedir)/Ice/Config.h $(includedir)/Ice/ProxyHandle.h $(includedir)/Ice/ProxyF.h $(includedir)/Ice/ObjectF.h $(includedir)/Ice/GCCountMap.h $(includedir)/Ice/GCShared.h $(includedir)/Ice/Exception.h $(includedir)/Ice/LocalObject.h $(includedir)/Ice/UndefSysMacros.h $(includedir)/Ice/PropertiesF.h $(includedir)/Ice/Proxy.h $(includedir)/IceUtil/Mutex.h $(includedir)/IceUtil/Lock.h $(includedir)/IceUtil/ThreadException.h $(includedir)/IceUtil/Time.h $(includedir)/Ice/ProxyFactoryF.h $(includedir)/Ice/ConnectionIF.h $(includedir)/Ice/RequestHandlerF.h $(includedir)/Ice/EndpointIF.h $(includedir)/Ice/Endpoint.h $(includedir)/Ice/ObjectAdapterF.h $(includedir)/Ice/ReferenceF.h $(includedir)/Ice/OutgoingAsyncF.h $(includedir)/Ice/Current.h $(includedir)/Ice/ConnectionF.h $(includedir)/Ice/Identity.h $(includedir)/Ice/StreamF.h $(includedir)/Ice/Object.h $(includedir)/Ice/IncomingAsyncF.h $(includedir)/Ice/InstanceF.h $(includedir)/Ice/LoggerF.h $(includedir)/Ice/StatsF.h $(includedir)/Ice/StringConverter.h $(includedir)/Ice/Plugin.h $(includedir)/IceUtil/Unicode.h $(includedir)/Ice/BuiltinSequences.h $(includedir)/Ice/LocalException.h $(includedir)/Ice/Properties.h $(includedir)/Ice/Outgoing.h $(includedir)/IceUtil/Monitor.h $(includedir)/IceUtil/Cond.h $(includedir)/Ice/BasicStream.h $(includedir)/Ice/ObjectFactoryF.h $(includedir)/Ice/Buffer.h $(includedir)/Ice/Protocol.h $(includedir)/Ice/OutgoingAsync.h $(includedir)/IceUtil/Timer.h $(includedir)/IceUtil/Thread.h $(includedir)/Ice/Incoming.h $(includedir)/Ice/ServantLocatorF.h $(includedir)/Ice/ServantManagerF.h $(includedir)/Ice/Direct.h $(includedir)/Ice/Logger.h $(includedir)/Ice/LoggerUtil.h $(includedir)/Ice/Stats.h $(includedir)/Ice/Communicator.h $(includedir)/Ice/RouterF.h $(includedir)/Ice/LocatorF.h $(includedir)/Ice/PluginF.h $(includedir)/Ice/ImplicitContextF.h $(includedir)/Ice/ObjectFactory.h $(includedir)/Ice/ObjectAdapter.h $(includedir)/Ice/FacetMap.h $(includedir)/Ice/ServantLocator.h $(includedir)/Ice/IncomingAsync.h $(includedir)/Ice/Process.h $(includedir)/Ice/Application.h $(includedir)/Ice/Connection.h $(includedir)/Ice/Functional.h $(includedir)/IceUtil/Functional.h $(includedir)/Ice/Stream.h $(includedir)/Ice/ImplicitContext.h $(includedir)/Ice/Locator.h $(includedir)/Ice/UserExceptionFactory.h $(includedir)/Ice/FactoryTable.h $(includedir)/Ice/FactoryTableDef.h $(includedir)/IceUtil/StaticMutex.h $(includedir)/Ice/UserExceptionFactoryF.h $(includedir)/Ice/ProcessF.h $(includedir)/Ice/Router.h $(includedir)/Ice/DispatchInterceptor.h $(includedir)/Ice/IconvStringConverter.h Nrvo.h MyStringSeq.h
+NrvoI$(OBJEXT): NrvoI.cpp $(includedir)/Ice/Ice.h $(includedir)/Ice/Initialize.h $(includedir)/Ice/CommunicatorF.h $(includedir)/Ice/LocalObjectF.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/Config.h $(includedir)/Ice/Handle.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/Exception.h $(includedir)/Ice/Config.h $(includedir)/Ice/ProxyHandle.h $(includedir)/Ice/ProxyF.h $(includedir)/Ice/ObjectF.h $(includedir)/Ice/GCCountMap.h $(includedir)/Ice/GCShared.h $(includedir)/Ice/Exception.h $(includedir)/Ice/LocalObject.h $(includedir)/Ice/UndefSysMacros.h $(includedir)/Ice/PropertiesF.h $(includedir)/Ice/Proxy.h $(includedir)/IceUtil/Mutex.h $(includedir)/IceUtil/Lock.h $(includedir)/IceUtil/ThreadException.h $(includedir)/IceUtil/Time.h $(includedir)/Ice/ProxyFactoryF.h $(includedir)/Ice/ConnectionIF.h $(includedir)/Ice/RequestHandlerF.h $(includedir)/Ice/EndpointIF.h $(includedir)/Ice/Endpoint.h $(includedir)/Ice/ObjectAdapterF.h $(includedir)/Ice/ReferenceF.h $(includedir)/Ice/OutgoingAsyncF.h $(includedir)/Ice/Current.h $(includedir)/Ice/ConnectionF.h $(includedir)/Ice/Identity.h $(includedir)/Ice/StreamF.h $(includedir)/Ice/Object.h $(includedir)/Ice/IncomingAsyncF.h $(includedir)/Ice/InstanceF.h $(includedir)/Ice/LoggerF.h $(includedir)/Ice/StatsF.h $(includedir)/Ice/StringConverter.h $(includedir)/Ice/Plugin.h $(includedir)/IceUtil/Unicode.h $(includedir)/Ice/BuiltinSequences.h $(includedir)/Ice/LocalException.h $(includedir)/Ice/Properties.h $(includedir)/Ice/Outgoing.h $(includedir)/IceUtil/Monitor.h $(includedir)/IceUtil/Cond.h $(includedir)/Ice/BasicStream.h $(includedir)/Ice/ObjectFactoryF.h $(includedir)/Ice/Buffer.h $(includedir)/Ice/Protocol.h $(includedir)/Ice/OutgoingAsync.h $(includedir)/IceUtil/Timer.h $(includedir)/IceUtil/Thread.h $(includedir)/Ice/Incoming.h $(includedir)/Ice/ServantLocatorF.h $(includedir)/Ice/ServantManagerF.h $(includedir)/Ice/Direct.h $(includedir)/Ice/Logger.h $(includedir)/Ice/LoggerUtil.h $(includedir)/Ice/Stats.h $(includedir)/Ice/Communicator.h $(includedir)/Ice/RouterF.h $(includedir)/Ice/LocatorF.h $(includedir)/Ice/PluginF.h $(includedir)/Ice/ImplicitContextF.h $(includedir)/Ice/ObjectFactory.h $(includedir)/Ice/ObjectAdapter.h $(includedir)/Ice/FacetMap.h $(includedir)/Ice/ServantLocator.h $(includedir)/Ice/IncomingAsync.h $(includedir)/Ice/Process.h $(includedir)/Ice/Application.h $(includedir)/Ice/Connection.h $(includedir)/Ice/Functional.h $(includedir)/IceUtil/Functional.h $(includedir)/Ice/Stream.h $(includedir)/Ice/ImplicitContext.h $(includedir)/Ice/Locator.h $(includedir)/Ice/UserExceptionFactory.h $(includedir)/Ice/FactoryTable.h $(includedir)/Ice/FactoryTableDef.h $(includedir)/IceUtil/StaticMutex.h $(includedir)/Ice/UserExceptionFactoryF.h $(includedir)/Ice/ProcessF.h $(includedir)/Ice/Router.h $(includedir)/Ice/DispatchInterceptor.h $(includedir)/Ice/IconvStringConverter.h NrvoI.h Nrvo.h MyStringSeq.h
+Nrvo.cpp: Nrvo.ice
+Nrvo.ice: $(SLICE2CPP) $(SLICEPARSERLIB)
diff --git a/cpp/demo/Ice/nrvo/.gitignore b/cpp/demo/Ice/nrvo/.gitignore
new file mode 100644
index 00000000000..ee1193c8569
--- /dev/null
+++ b/cpp/demo/Ice/nrvo/.gitignore
@@ -0,0 +1,7 @@
+// Generated by makegitignore.py
+
+// IMPORTANT: Do not edit this file -- any edits made here will be lost!
+client
+server
+Throughput.cpp
+Throughput.h
diff --git a/cpp/demo/Ice/nrvo/Client.cpp b/cpp/demo/Ice/nrvo/Client.cpp
new file mode 100644
index 00000000000..2b98af66eed
--- /dev/null
+++ b/cpp/demo/Ice/nrvo/Client.cpp
@@ -0,0 +1,141 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2008 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#include <Ice/Ice.h>
+#include <Nrvo.h>
+#include <MyStringSeq.h>
+#include <iomanip>
+
+using namespace std;
+using namespace Demo;
+
+class NrvoClient : public Ice::Application
+{
+public:
+
+ NrvoClient();
+ virtual int run(int, char*[]);
+
+private:
+
+ void menu();
+};
+
+int
+main(int argc, char* argv[])
+{
+ NrvoClient app;
+ return app.main(argc, argv, "config.client");
+}
+
+NrvoClient::NrvoClient()
+{
+}
+
+int
+NrvoClient::run(int argc, char* argv[])
+{
+ if(argc > 1)
+ {
+ cerr << appName() << ": too many arguments" << endl;
+ return EXIT_FAILURE;
+ }
+
+ NrvoPrx nrvo = NrvoPrx::checkedCast(communicator()->propertyToProxy("Nrvo.Proxy"));
+ if(!nrvo)
+ {
+ cerr << argv[0] << ": invalid proxy" << endl;
+ return EXIT_FAILURE;
+ }
+
+ menu();
+
+ char currentOperation = '1';
+ char c;
+ do
+ {
+ try
+ {
+ cout << "==> ";
+ cin >> c;
+
+ if(c == '1' || c == '2' || c == '3' || c == 's' || c == '?' || c == 'x')
+ {
+ currentOperation = c;
+ switch(c)
+ {
+ case '1':
+ {
+ cout << "calling op1" << endl;
+ MyStringSeq seq = nrvo->op1();
+ break;
+ }
+
+ case '2':
+ {
+ cout << "calling op2" << endl;
+ StringSeq seq= nrvo->op2();
+ break;
+ }
+
+ case '3':
+ {
+ cout << "calling op3" << endl;
+ StringSeq seq= nrvo->op3(10);
+ break;
+ }
+
+ case 's':
+ {
+ nrvo->shutdown();
+ }
+
+ case '?':
+ {
+ menu();
+ break;
+ }
+
+ case 'x':
+ {
+ break;
+ }
+ }
+ }
+ else
+ {
+ cout << "unknown command `" << c << "'" << endl;
+ menu();
+ }
+ }
+ catch(const Ice::Exception& ex)
+ {
+ cerr << ex << endl;
+ }
+ }
+ while(cin.good() && c != 'x');
+
+ return EXIT_SUCCESS;
+}
+
+
+void
+NrvoClient::menu()
+{
+ cout <<
+ "usage:\n"
+ "\n"
+ "Operation to call:\n"
+ "1: return a value object.\n"
+ "2: return a value object that is a member attribute.\n"
+ "3: return a value object from an operation with multiple return path.\n"
+ "s: shutdown server.\n"
+ "x: exit.\n"
+ "?: show this menu.\n";
+}
diff --git a/cpp/demo/Ice/nrvo/Makefile b/cpp/demo/Ice/nrvo/Makefile
new file mode 100644
index 00000000000..e4440c95693
--- /dev/null
+++ b/cpp/demo/Ice/nrvo/Makefile
@@ -0,0 +1,42 @@
+# **********************************************************************
+#
+# Copyright (c) 2003-2008 ZeroC, Inc. All rights reserved.
+#
+# This copy of Ice is licensed to you under the terms described in the
+# ICE_LICENSE file included in this distribution.
+#
+# **********************************************************************
+
+top_srcdir = ../../..
+
+CLIENT = client
+SERVER = server
+
+TARGETS = $(CLIENT) $(SERVER)
+
+OBJS = Nrvo.o
+
+COBJS = Client.o
+
+SOBJS = NrvoI.o \
+ Server.o
+
+SRCS = $(OBJS:.o=.cpp) \
+ $(COBJS:.o=.cpp) \
+ $(SOBJS:.o=.cpp)
+
+SLICE_SRCS = Nrvo.ice
+
+include $(top_srcdir)/config/Make.rules
+
+CPPFLAGS := -I. $(CPPFLAGS)
+
+$(CLIENT): $(OBJS) $(COBJS)
+ rm -f $@
+ $(CXX) $(LDFLAGS) -o $@ $(OBJS) $(COBJS) $(LIBS)
+
+$(SERVER): $(OBJS) $(SOBJS)
+ rm -f $@
+ $(CXX) $(LDFLAGS) -o $@ $(OBJS) $(SOBJS) $(LIBS)
+
+include .depend
diff --git a/cpp/demo/Ice/nrvo/Makefile.mak b/cpp/demo/Ice/nrvo/Makefile.mak
new file mode 100644
index 00000000000..d99fe2775f7
--- /dev/null
+++ b/cpp/demo/Ice/nrvo/Makefile.mak
@@ -0,0 +1,50 @@
+# **********************************************************************
+#
+# Copyright (c) 2003-2008 ZeroC, Inc. All rights reserved.
+#
+# This copy of Ice is licensed to you under the terms described in the
+# ICE_LICENSE file included in this distribution.
+#
+# **********************************************************************
+
+top_srcdir = ..\..\..
+
+CLIENT = client.exe
+SERVER = server.exe
+
+TARGETS = $(CLIENT) $(SERVER)
+
+OBJS = Nrvo.obj
+
+COBJS = Client.obj
+
+SOBJS = NrvoI.obj \
+ Server.obj
+
+SRCS = $(OBJS:.obj=.cpp) \
+ $(COBJS:.obj=.cpp) \
+ $(SOBJS:.obj=.cpp)
+
+!include $(top_srcdir)/config/Make.rules.mak
+
+CPPFLAGS = -I. $(CPPFLAGS) -DWIN32_LEAN_AND_MEAN
+
+!if "$(GENERATE_PDB)" == "yes"
+CPDBFLAGS = /pdb:$(CLIENT:.exe=.pdb)
+SPDBFLAGS = /pdb:$(SERVER:.exe=.pdb)
+!endif
+
+$(CLIENT): $(OBJS) $(COBJS)
+ $(LINK) $(LD_EXEFLAGS) $(CPDBFLAGS) $(SETARGV) $(OBJS) $(COBJS) $(PREOUT)$@ $(PRELIBS)$(LIBS)
+ @if exist $@.manifest echo ^ ^ ^ Embedding manifest using $(MT) && \
+ $(MT) -nologo -manifest $@.manifest -outputresource:$@;#1 && del /q $@.manifest
+
+$(SERVER): $(OBJS) $(SOBJS)
+ $(LINK) $(LD_EXEFLAGS) $(SPDBFLAGS) $(SETARGV) $(OBJS) $(SOBJS) $(PREOUT)$@ $(PRELIBS)$(LIBS)
+ @if exist $@.manifest echo ^ ^ ^ Embedding manifest using $(MT) && \
+ $(MT) -nologo -manifest $@.manifest -outputresource:$@;#1 && del /q $@.manifest
+
+clean::
+ del /q Nrvo.cpp Nrvo.h
+
+!include .depend
diff --git a/cpp/demo/Ice/nrvo/MyStringSeq.h b/cpp/demo/Ice/nrvo/MyStringSeq.h
new file mode 100644
index 00000000000..e5adfc4b45e
--- /dev/null
+++ b/cpp/demo/Ice/nrvo/MyStringSeq.h
@@ -0,0 +1,32 @@
+#ifndef MY_STRING_SEQ
+#define MY_STRING_SEQ
+
+#include <vector>
+#include <string>
+#include <iostream>
+
+class MyStringSeq : public std::vector<std::string>
+{
+public:
+
+ MyStringSeq()
+ {}
+
+ MyStringSeq(size_t n) :
+ std::vector<std::string>(n)
+ {
+ }
+
+ MyStringSeq(size_t n, const std::string& str) :
+ std::vector<std::string>(n, str)
+ {
+ }
+
+ MyStringSeq(const MyStringSeq& seq) :
+ std::vector<std::string>(seq)
+ {
+ std::cout << "MyStringSeq copy ctor" << std::endl;
+ }
+};
+
+#endif
diff --git a/cpp/demo/Ice/nrvo/Nrvo.ice b/cpp/demo/Ice/nrvo/Nrvo.ice
new file mode 100644
index 00000000000..0ca0c63965b
--- /dev/null
+++ b/cpp/demo/Ice/nrvo/Nrvo.ice
@@ -0,0 +1,30 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2008 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#ifndef NRV0_ICE
+#define NRV0_ICE
+
+module Demo
+{
+
+[["cpp:include:MyStringSeq.h"]]
+["cpp:type:MyStringSeq"] sequence<string> StringSeq;
+const int StringSeqSize = 50000;
+
+interface Nrvo
+{
+ StringSeq op1();
+ StringSeq op2();
+ StringSeq op3(int size);
+ void shutdown();
+};
+
+};
+
+#endif
diff --git a/cpp/demo/Ice/nrvo/NrvoI.cpp b/cpp/demo/Ice/nrvo/NrvoI.cpp
new file mode 100644
index 00000000000..dc07ff8d10f
--- /dev/null
+++ b/cpp/demo/Ice/nrvo/NrvoI.cpp
@@ -0,0 +1,54 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2008 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#include <Ice/Ice.h>
+#include <iostream>
+#include <NrvoI.h>
+
+using namespace std;
+
+NrvoI::NrvoI() :
+ _stringSeq(Demo::StringSeqSize, "hello")
+{
+}
+
+Demo::StringSeq
+NrvoI::op1(const Ice::Current&)
+{
+ cout << "running op1" << endl;
+ MyStringSeq seq = MyStringSeq(Demo::StringSeqSize, "hello");
+ return seq;
+}
+
+Demo::StringSeq
+NrvoI::op2(const Ice::Current&)
+{
+ cout << "running op2" << endl;
+ return _stringSeq;
+}
+
+Demo::StringSeq
+NrvoI::op3(int size, const Ice::Current&)
+{
+ cout << "running op3" << endl;
+ MyStringSeq seq;
+ if(size < 10)
+ {
+ return MyStringSeq(size, "hello");
+ }
+ seq = MyStringSeq(10, "hello");
+ return seq;
+}
+
+
+void
+NrvoI::shutdown(const Ice::Current& c)
+{
+ c.adapter->getCommunicator()->shutdown();
+}
diff --git a/cpp/demo/Ice/nrvo/NrvoI.h b/cpp/demo/Ice/nrvo/NrvoI.h
new file mode 100644
index 00000000000..5439c2ca15e
--- /dev/null
+++ b/cpp/demo/Ice/nrvo/NrvoI.h
@@ -0,0 +1,31 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2008 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#ifndef NRVO_I_H
+#define NRVO_I_H
+
+#include <Nrvo.h>
+#include <MyStringSeq.h>
+
+class NrvoI : public Demo::Nrvo
+{
+public:
+
+ NrvoI();
+ virtual Demo::StringSeq op1(const Ice::Current&);
+ virtual Demo::StringSeq op2(const Ice::Current&);
+ virtual Demo::StringSeq op3(int size, const Ice::Current&);
+ virtual void shutdown(const Ice::Current&);
+
+private:
+
+ MyStringSeq _stringSeq;
+};
+
+#endif
diff --git a/cpp/demo/Ice/nrvo/README b/cpp/demo/Ice/nrvo/README
new file mode 100644
index 00000000000..dc4d60c3866
--- /dev/null
+++ b/cpp/demo/Ice/nrvo/README
@@ -0,0 +1,11 @@
+
+A simple demo that show how Ice take advantage of NRVO (Named Return Value Optimization)
+include in Visual Studio c++ compiler.
+
+To run the demo, first start the server:
+
+$ server
+
+In a separate window, start the client:
+
+$ client
diff --git a/cpp/demo/Ice/nrvo/Server.cpp b/cpp/demo/Ice/nrvo/Server.cpp
new file mode 100644
index 00000000000..52b9d27f3d8
--- /dev/null
+++ b/cpp/demo/Ice/nrvo/Server.cpp
@@ -0,0 +1,44 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2008 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#include <Ice/Ice.h>
+#include <NrvoI.h>
+
+using namespace std;
+
+class NrvotServer : public Ice::Application
+{
+public:
+
+ virtual int run(int, char*[]);
+};
+
+int
+main(int argc, char* argv[])
+{
+ NrvotServer app;
+ return app.main(argc, argv, "config.server");
+}
+
+int
+NrvotServer::run(int argc, char* argv[])
+{
+ if(argc > 1)
+ {
+ cerr << appName() << ": too many arguments" << endl;
+ return EXIT_FAILURE;
+ }
+
+ Ice::ObjectAdapterPtr adapter = communicator()->createObjectAdapter("Nrvo");
+ Demo::NrvoPtr servant = new NrvoI();
+ adapter->add(servant, communicator()->stringToIdentity("nrvo"));
+ adapter->activate();
+ communicator()->waitForShutdown();
+ return EXIT_SUCCESS;
+}
diff --git a/cpp/demo/Ice/nrvo/config.client b/cpp/demo/Ice/nrvo/config.client
new file mode 100644
index 00000000000..c582c4dd677
--- /dev/null
+++ b/cpp/demo/Ice/nrvo/config.client
@@ -0,0 +1,20 @@
+#
+# The client reads this property to create the reference to the
+# "Throughput" object in the server.
+#
+Nrvo.Proxy=nrvo:default -p 10000 -h 127.0.0.1
+
+#
+# Disable client-side ACM.
+#
+Ice.ACM.Client=0
+
+#
+# SSL Configuration
+#
+Ice.Plugin.IceSSL=IceSSL:createIceSSL
+IceSSL.DefaultDir=../../../../certs
+IceSSL.CertAuthFile=cacert.pem
+IceSSL.CertFile=c_rsa1024_pub.pem
+IceSSL.KeyFile=c_rsa1024_priv.pem
+
diff --git a/cpp/demo/Ice/nrvo/config.server b/cpp/demo/Ice/nrvo/config.server
new file mode 100644
index 00000000000..2a90e37a37c
--- /dev/null
+++ b/cpp/demo/Ice/nrvo/config.server
@@ -0,0 +1,20 @@
+#
+# The server creates one single object adapter with the name
+# "Throughput". The following line sets the endpoints for this
+# adapter.
+#
+Nrvo.Endpoints=default -p 10000 -h 127.0.0.1
+
+#
+# Warn about connection exceptions
+#
+Ice.Warn.Connections=1
+
+#
+# SSL Configuration
+#
+Ice.Plugin.IceSSL=IceSSL:createIceSSL
+IceSSL.DefaultDir=../../../../certs
+IceSSL.CertAuthFile=cacert.pem
+IceSSL.CertFile=s_rsa1024_pub.pem
+IceSSL.KeyFile=s_rsa1024_priv.pem
diff --git a/cpp/demo/Ice/nrvo/expect.py b/cpp/demo/Ice/nrvo/expect.py
new file mode 100644
index 00000000000..bce4683e291
--- /dev/null
+++ b/cpp/demo/Ice/nrvo/expect.py
@@ -0,0 +1,30 @@
+#!/usr/bin/env python
+# **********************************************************************
+#
+# Copyright (c) 2003-2008 ZeroC, Inc. All rights reserved.
+#
+# This copy of Ice is licensed to you under the terms described in the
+# ICE_LICENSE file included in this distribution.
+#
+# **********************************************************************
+
+import sys, os
+
+path = [ ".", "..", "../..", "../../..", "../../../.." ]
+head = os.path.dirname(sys.argv[0])
+if len(head) > 0:
+ path = [os.path.join(head, p) for p in path]
+path = [os.path.abspath(p) for p in path if os.path.exists(os.path.join(p, "demoscript")) ]
+if len(path) == 0:
+ raise "can't find toplevel directory!"
+sys.path.append(path[0])
+
+from demoscript import *
+from demoscript.Ice import nrvo
+
+server = Util.spawn('./server --Ice.PrintAdapterReady')
+server.expect('.* ready')
+client = Util.spawn('./client')
+client.expect('.*==>')
+
+nrvo.run(client, server)
diff --git a/demoscript/Ice/nrvo.py b/demoscript/Ice/nrvo.py
new file mode 100644
index 00000000000..f0446b677ec
--- /dev/null
+++ b/demoscript/Ice/nrvo.py
@@ -0,0 +1,27 @@
+#!/usr/bin/env python
+# **********************************************************************
+#
+# Copyright (c) 2003-2008 ZeroC, Inc. All rights reserved.
+#
+# This copy of Ice is licensed to you under the terms described in the
+# ICE_LICENSE file included in this distribution.
+#
+# **********************************************************************
+
+import sys
+from demoscript import *
+from scripts import Expect
+
+def run(client, server):
+ print "testing client... ",
+ sys.stdout.flush()
+ client.sendline('1')
+ client.expect('==> ', timeout=2000)
+ client.sendline('2')
+ client.expect('==> ', timeout=2000)
+ client.sendline('3')
+ client.expect('==> ', timeout=2000)
+ client.sendline('s')
+ client.expect('==> ', timeout=2000)
+ client.sendline('x')
+ print "ok"