doc_file_descriptor.cpp 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // (C) Copyright Ion Gaztanaga 2008-2012.
  4. // Distributed under the Boost Software License, Version 1.0.
  5. // (See accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt)
  7. //
  8. // See http://www.boost.org/libs/move for documentation.
  9. //
  10. //////////////////////////////////////////////////////////////////////////////
  11. #include <boost/move/detail/config_begin.hpp>
  12. #include <cassert>
  13. //[file_descriptor_def
  14. #include <boost/move/utility_core.hpp>
  15. #include <stdexcept>
  16. class file_descriptor
  17. {
  18. //<-
  19. int operating_system_open_file(const char *)
  20. {
  21. return 1;
  22. }
  23. void operating_system_close_file(int fd)
  24. { (void)fd; assert(fd != 0); }
  25. //->
  26. int os_descr_;
  27. private:
  28. BOOST_MOVABLE_BUT_NOT_COPYABLE(file_descriptor)
  29. public:
  30. explicit file_descriptor(const char *filename) //Constructor
  31. : os_descr_(operating_system_open_file(filename))
  32. { if(!os_descr_) throw std::runtime_error("file not found"); }
  33. ~file_descriptor() //Destructor
  34. { if(os_descr_) operating_system_close_file(os_descr_); }
  35. file_descriptor(BOOST_RV_REF(file_descriptor) x) // Move ctor
  36. : os_descr_(x.os_descr_)
  37. { x.os_descr_ = 0; }
  38. file_descriptor& operator=(BOOST_RV_REF(file_descriptor) x) // Move assign
  39. {
  40. if(os_descr_) operating_system_close_file(os_descr_);
  41. os_descr_ = x.os_descr_;
  42. x.os_descr_ = 0;
  43. return *this;
  44. }
  45. bool empty() const { return os_descr_ == 0; }
  46. };
  47. //]
  48. //[file_descriptor_example
  49. #include <boost/container/vector.hpp>
  50. #include <cassert>
  51. //Remember: 'file_descriptor' is NOT copyable, but it
  52. //can be returned from functions thanks to move semantics
  53. file_descriptor create_file_descriptor(const char *filename)
  54. { return file_descriptor(filename); }
  55. int main()
  56. {
  57. //Open a file obtaining its descriptor, the temporary
  58. //returned from 'create_file_descriptor' is moved to 'fd'.
  59. file_descriptor fd = create_file_descriptor("filename");
  60. assert(!fd.empty());
  61. //Now move fd into a vector
  62. boost::container::vector<file_descriptor> v;
  63. v.push_back(boost::move(fd));
  64. //Check ownership has been transferred
  65. assert(fd.empty());
  66. assert(!v[0].empty());
  67. //Compilation error if uncommented since file_descriptor is not copyable
  68. //and vector copy construction requires value_type's copy constructor:
  69. //boost::container::vector<file_descriptor> v2(v);
  70. return 0;
  71. }
  72. //]
  73. #include <boost/move/detail/config_end.hpp>