mirror of
https://github.com/boostorg/move.git
synced 2025-07-30 12:27:14 +02:00
Added to trunk
[SVN r70067]
This commit is contained in:
87
example/doc_file_descriptor.cpp
Normal file
87
example/doc_file_descriptor.cpp
Normal file
@ -0,0 +1,87 @@
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// (C) Copyright Ion Gaztanaga 2008-2009.
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
//
|
||||
// See http://www.boost.org/libs/move for documentation.
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//[file_descriptor_def
|
||||
|
||||
#include <boost/move/move.hpp>
|
||||
#include <stdexcept>
|
||||
|
||||
class file_descriptor
|
||||
{
|
||||
//<-
|
||||
int operating_system_open_file(const char *)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
void operating_system_close_file(int)
|
||||
{}
|
||||
//->
|
||||
int os_descr_;
|
||||
|
||||
private:
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(file_descriptor)
|
||||
|
||||
public:
|
||||
explicit file_descriptor(const char *filename = 0) //Constructor
|
||||
: os_descr_(filename ? operating_system_open_file(filename) : 0)
|
||||
{ if(!os_descr_) throw std::runtime_error("file not found"); }
|
||||
|
||||
~file_descriptor() //Destructor
|
||||
{ if(!os_descr_) operating_system_close_file(os_descr_); }
|
||||
|
||||
file_descriptor(BOOST_RV_REF(file_descriptor) x) // Move ctor
|
||||
: os_descr_(x.os_descr_)
|
||||
{ x.os_descr_ = 0; }
|
||||
|
||||
file_descriptor& operator=(BOOST_RV_REF(file_descriptor) x) // Move assign
|
||||
{
|
||||
if(!os_descr_) operating_system_close_file(os_descr_);
|
||||
os_descr_ = x.os_descr_;
|
||||
x.os_descr_ = 0;
|
||||
return *this;
|
||||
}
|
||||
|
||||
bool empty() const { return os_descr_ == 0; }
|
||||
};
|
||||
|
||||
//]
|
||||
|
||||
//[file_descriptor_example
|
||||
#include <boost/interprocess/containers/vector.hpp>
|
||||
#include <cassert>
|
||||
|
||||
//Remember: 'file_descriptor' is NOT copyable, but it
|
||||
//can be returned from functions thanks to move semantics
|
||||
file_descriptor create_file_descriptor(const char *filename)
|
||||
{ return file_descriptor(filename); }
|
||||
|
||||
int main()
|
||||
{
|
||||
//Open a file obtaining its descriptor, the temporary
|
||||
//returned from 'create_file_descriptor' is moved to 'fd'.
|
||||
file_descriptor fd = create_file_descriptor("filename");
|
||||
assert(!fd.empty());
|
||||
|
||||
//Now move fd into a vector
|
||||
boost::interprocess::vector<file_descriptor> v;
|
||||
v.push_back(boost::move(fd));
|
||||
|
||||
//Check ownership has been transferred
|
||||
assert(fd.empty());
|
||||
assert(!v[0].empty());
|
||||
|
||||
//Compilation error if uncommented since file_descriptor is not copyable
|
||||
//and vector copy construction requires value_type's copy constructor:
|
||||
//boost::interprocess::vector<file_descriptor> v2(v);
|
||||
return 0;
|
||||
}
|
||||
//]
|
Reference in New Issue
Block a user