1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- //////////////////////////////////////////////////////////////////////////////
- //
- // (C) Copyright Ion Gaztanaga 2008-2012.
- // 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.
- //
- //////////////////////////////////////////////////////////////////////////////
- #include <boost/move/detail/config_begin.hpp>
- #include <cassert>
- //[file_descriptor_def
- #include <boost/move/utility_core.hpp>
- #include <stdexcept>
- class file_descriptor
- {
- //<-
- int operating_system_open_file(const char *)
- {
- return 1;
- }
- void operating_system_close_file(int fd)
- { (void)fd; assert(fd != 0); }
- //->
- int os_descr_;
- private:
- BOOST_MOVABLE_BUT_NOT_COPYABLE(file_descriptor)
- public:
- explicit file_descriptor(const char *filename) //Constructor
- : os_descr_(operating_system_open_file(filename))
- { 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/container/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::container::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::container::vector<file_descriptor> v2(v);
- return 0;
- }
- //]
- #include <boost/move/detail/config_end.hpp>
|