#include <vector>
#include <memory>
typedef std:: vector < int > CBuffer;
static CBuffer& PostProcess( CBuffer& data) {
for ( auto & el : data)
el / = 2 ;
return data;
}
struct CSource
{
CSource( ) : _data( std:: make_shared < CBuffer> ( 10 ) ) { }
std:: shared_ptr < CBuffer> GetData( ) { return _data; }
std:: shared_ptr < const CBuffer> GetData( ) const { return _data; }
private :
std:: shared_ptr < CBuffer> _data;
} ;
struct CPlug
{
CPlug( bool postProcess = true ) : m_postProcess( postProcess) { }
std:: shared_ptr < const CBuffer> ProcessData( ) const
{
/* get the data from the source, implicitely const */
auto buffer = m_source.GetData ( ) ;
if ( ! m_postProcess)
return buffer;
// clone!
auto clone = * buffer;
return std:: make_shared < CBuffer> ( PostProcess( clone) ) ;
}
private :
bool m_postProcess;
CSource m_source;
} ;
int main( )
{
CPlug intance;
auto x = instance.ProcessData ( ) ;
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPG1lbW9yeT4KCnR5cGVkZWYgc3RkOjp2ZWN0b3I8aW50PiBDQnVmZmVyOwoKc3RhdGljIENCdWZmZXImIFBvc3RQcm9jZXNzKENCdWZmZXImIGRhdGEpICB7IAogICAgZm9yKGF1dG8mIGVsIDogZGF0YSkKICAgICAgICBlbCAvPSAyOwogICAgcmV0dXJuIGRhdGE7Cn0KCnN0cnVjdCBDU291cmNlCnsKICAgIENTb3VyY2UoKSA6IF9kYXRhKHN0ZDo6bWFrZV9zaGFyZWQ8Q0J1ZmZlcj4oMTApKSB7fQoKICAgIHN0ZDo6c2hhcmVkX3B0cjxDQnVmZmVyPiAgICAgICBHZXREYXRhKCkgICAgICAgeyByZXR1cm4gX2RhdGE7IH0KICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDQnVmZmVyPiBHZXREYXRhKCkgY29uc3QgeyByZXR1cm4gX2RhdGE7IH0KCiAgcHJpdmF0ZToKICAgIHN0ZDo6c2hhcmVkX3B0cjxDQnVmZmVyPiBfZGF0YTsKfTsKCnN0cnVjdCBDUGx1Zwp7CiAgICBDUGx1Zyhib29sIHBvc3RQcm9jZXNzID0gdHJ1ZSkgOiBtX3Bvc3RQcm9jZXNzKHBvc3RQcm9jZXNzKSB7IH0KCiAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQ0J1ZmZlcj4gUHJvY2Vzc0RhdGEoKSBjb25zdAogICAgewogICAgICAgIC8qIGdldCB0aGUgZGF0YSBmcm9tIHRoZSBzb3VyY2UsIGltcGxpY2l0ZWx5IGNvbnN0ICovCiAgICAgICAgYXV0byBidWZmZXIgPSBtX3NvdXJjZS5HZXREYXRhKCk7CgogICAgICAgIGlmICghbV9wb3N0UHJvY2VzcykKICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjsKCiAgICAgICAgLy8gY2xvbmUhCiAgICAgICAgYXV0byBjbG9uZSA9ICpidWZmZXI7CiAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8Q0J1ZmZlcj4oUG9zdFByb2Nlc3MoY2xvbmUpKTsKICAgIH0KCiAgcHJpdmF0ZToKICAgIGJvb2wgICAgbV9wb3N0UHJvY2VzczsKICAgIENTb3VyY2UgbV9zb3VyY2U7Cn07CgppbnQgbWFpbigpCnsKICAgIENQbHVnIGludGFuY2U7CiAgICBhdXRvIHggPSBpbnN0YW5jZS5Qcm9jZXNzRGF0YSgpOwp9Cg==