| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 
 | // **********************************************************************
//
// Copyright (c) 2003-2013 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;
NrvoI::NrvoI() :
    _stringSeq(10, "hello")
{
}
//
// NRVO (Named Return Value Optimization):
// the return value is a stack-allocated variable,
// and there is only a single return path.
//
Demo::StringSeq
NrvoI::op1(const Ice::Current&)
{
    cout << "running op1" << endl;
    //
    // Not "return MyStringSeq(10, "hello")", since this lacks a name.
    //
    MyStringSeq seq = MyStringSeq(10, "hello");
    return seq;
}
//
// No optimization: the return value is a data member.
//
Demo::StringSeq
NrvoI::op2(const Ice::Current&)
{
    cout << "running op2" << endl;
    return _stringSeq;
}
//
// Operation with multiple return paths.
//
Demo::StringSeq
NrvoI::op3(int size, const Ice::Current&)
{
    cout << "running op3" << endl;
    if(size < 10)
    {
        //
        // RVO (Return Value Optimization): return value
        // is constructed in place.
        //
        return MyStringSeq(size, "hello");
    }
    //
    // No optimization: NRVO requires a single return path.
    //
    MyStringSeq seq = MyStringSeq(10, "hello");
    return seq;
}
void
NrvoI::shutdown(const Ice::Current& c)
{
    c.adapter->getCommunicator()->shutdown();
}
 |