DriveHQ Start Menu
Cloud Drive Mapping
Folder Sync
Cloud Backup
True Drop Box
FTP/SFTP Hosting
Group Account
DriveHQ Start Menu
Online File Server
My Storage
|
Manage Shares
|
Publishes
|
Drop Boxes
|
Group Account
WebDAV Drive Mapping
Cloud Drive Home
|
WebDAV Guide
|
Drive Mapping Tool
|
Drive Mapping URL
Complete Data Backup
Backup Guide
|
Online Backup Tool
|
Cloud-to-Cloud Backup
FTP, Email & Web Service
FTP Home
|
FTP Hosting FAQ
|
Email Hosting
|
EmailManager
|
Web Hosting
Help & Resources
About
|
Enterprise Service
|
Partnership
|
Comparisons
|
Support
Quick Links
Security and Privacy
Download Software
Service Manual
Use Cases
Group Account
Online Help
Blog
Contact
Cloud Surveillance
Sign Up
Login
Features
Business Features
Online File Server
FTP Hosting
Cloud Drive Mapping
Cloud File Backup
Email Backup & Hosting
Cloud File Sharing
Folder Synchronization
Group Management
True Drop Box
Full-text Search
AD Integration/SSO
Mobile Access
IP Camera & DVR Solution
More...
Personal Features
Personal Cloud Drive
Backup All Devices
Mobile APPs
Personal Web Hosting
Sub-Account (for Kids)
Home/PC/Kids Monitoring
More...
Software
DriveHQ Drive Mapping Tool
DriveHQ FileManager
DriveHQ Online Backup
DriveHQ Mobile Apps
Pricing
Business Plans & Pricing
Personal Plans & Pricing
Price Comparison with Others
Feature Comparison with Others
Install Mobile App
Sign up
Creating account...
Invalid character in username! Only 0-9, a-z, A-Z, _, -, . allowed.
Username is required!
Invalid email address!
E-mail is required!
Password is required!
Password is invalid!
Password and confirmation do not match.
Confirm password is required!
I accept
Membership Agreement
Please read the Membership Agreement and check "I accept"!
Free Quick Sign-up
Sign-up Page
Log in
Signing in...
Username or e-mail address is required!
Password is required!
Keep me logged in
Quick Login
Forgot Password
Up
Upload
Download
Share
Publish
New Folder
New File
Copy
Cut
Delete
Paste
Rate
Upgrade
Rotate
Effect
Edit
Slide
History
////////////////////////////////////////////////////////////////////////////// // // This file is the adaptation for Interprocess of boost/shared_ptr.hpp // // (C) Copyright Greg Colvin and Beman Dawes 1998, 1999. // (C) Copyright Peter Dimov 2001, 2002, 2003 // (C) Copyright Ion Gaztanaga 2006-2008. // 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/interprocess for documentation. // ////////////////////////////////////////////////////////////////////////////// #ifndef BOOST_INTERPROCESS_SHARED_PTR_HPP_INCLUDED #define BOOST_INTERPROCESS_SHARED_PTR_HPP_INCLUDED #include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
// for std::swap #include
// for std::less #include
// for std::bad_cast #include
// for std::basic_ostream //!\file //!Describes the smart pointer shared_ptr namespace boost{ namespace interprocess{ template
class weak_ptr; template
class enable_shared_from_this; namespace detail{ template
inline void sp_enable_shared_from_this (shared_count
const & pn, const typename pointer_to_other
::pointer, enable_shared_from_this
>::type &pe, const typename shared_count
::pointer &px) { if(pe != 0) pe->_internal_weak_this._internal_assign(pn); } /* template
inline void sp_enable_shared_from_this(shared_count
const &, ...) {} */ } // namespace detail //!shared_ptr stores a pointer to a dynamically allocated object. //!The object pointed to is guaranteed to be deleted when the last shared_ptr pointing to //!it is destroyed or reset. //! //!shared_ptr is parameterized on //!T (the type of the object pointed to), VoidAllocator (the void allocator to be used //!to allocate the auxiliary data) and Deleter (the deleter whose //!operator() will be used to delete the object. //! //!The internal pointer will be of the same pointer type as typename //!VoidAllocator::pointer type (that is, if typename VoidAllocator::pointer is //!offset_ptr
, the internal pointer will be offset_ptr
). //! //!Because the implementation uses reference counting, cycles of shared_ptr //!instances will not be reclaimed. For example, if main() holds a //!shared_ptr to A, which directly or indirectly holds a shared_ptr back //!to A, A's use count will be 2. Destruction of the original shared_ptr //!will leave A dangling with a use count of 1. //!Use weak_ptr to "break cycles." template
class shared_ptr { /// @cond private: typedef shared_ptr
this_type; /// @endcond public: typedef T element_type; typedef T value_type; typedef typename detail::pointer_to_other
::type pointer; typedef typename detail::add_reference
::type reference; typedef typename detail::add_reference
::type const_reference; typedef typename detail::pointer_to_other
::type const_deleter_pointer; typedef typename detail::pointer_to_other
::type const_allocator_pointer; public: //!Constructs an empty shared_ptr. //!Use_count() == 0 && get()== 0. shared_ptr() : m_pn() // never throws {} //!Constructs a shared_ptr that owns the pointer p. Auxiliary data will be allocated //!with a copy of a and the object will be deleted with a copy of d. //!Requirements: Deleter and A's copy constructor must not throw. explicit shared_ptr(const pointer&p, const VoidAllocator &a = VoidAllocator(), const Deleter &d = Deleter()) : m_pn(p, a, d) { //Check that the pointer passed is of the same type that //the pointer the allocator defines or it's a raw pointer typedef typename detail::pointer_to_other
::type ParameterPointer; BOOST_STATIC_ASSERT((detail::is_same
::value) || (detail::is_pointer
::value)); //detail::sp_enable_shared_from_this( m_pn, p, p ); } //!If r is empty, constructs an empty shared_ptr. Otherwise, constructs //!a shared_ptr that shares ownership with r. Never throws. template
shared_ptr(shared_ptr
const & r) : m_pn(r.m_pn) // never throws {} //!Constructs a shared_ptr that shares ownership with r and stores //!a copy of the pointer stored in r. template
explicit shared_ptr(weak_ptr
const & r) : m_pn(r.m_pn) // may throw {} /// @cond template
shared_ptr(shared_ptr
const & r, detail::static_cast_tag) : m_pn( pointer(static_cast
(detail::get_pointer(r.m_pn.get_pointer()))) , r.m_pn) {} template
shared_ptr(shared_ptr
const & r, detail::const_cast_tag) : m_pn( pointer(const_cast
(detail::get_pointer(r.m_pn.get_pointer()))) , r.m_pn) {} template
shared_ptr(shared_ptr
const & r, detail::dynamic_cast_tag) : m_pn( pointer(dynamic_cast
(detail::get_pointer(r.m_pn.get_pointer()))) , r.m_pn) { if(!m_pn.get_pointer()){ // need to allocate new counter -- the cast failed m_pn = detail::shared_count
(); } } /// @endcond //!Equivalent to shared_ptr(r).swap(*this). //!Never throws template
shared_ptr & operator=(shared_ptr
const & r) { m_pn = r.m_pn; // shared_count::op= doesn't throw return *this; } //!This is equivalent to: //!this_type().swap(*this); void reset() { this_type().swap(*this); } //!This is equivalent to: //!this_type(p, a, d).swap(*this); template
void reset(const Pointer &p, const VoidAllocator &a = VoidAllocator(), const Deleter &d = Deleter()) { //Check that the pointer passed is of the same type that //the pointer the allocator defines or it's a raw pointer typedef typename detail::pointer_to_other
::type ParameterPointer; BOOST_STATIC_ASSERT((detail::is_same
::value) || (detail::is_pointer
::value)); this_type(p, a, d).swap(*this); } //!Returns a reference to the //!pointed type reference operator* () const // never throws { BOOST_ASSERT(m_pn.get_pointer() != 0); return *m_pn.get_pointer(); } //!Returns the pointer pointing //!to the owned object pointer operator-> () const // never throws { BOOST_ASSERT(m_pn.get_pointer() != 0); return m_pn.get_pointer(); } //!Returns the pointer pointing //!to the owned object pointer get() const // never throws { return m_pn.get_pointer(); } /// @cond // implicit conversion to "bool" void unspecified_bool_type_func() const {} typedef void (this_type::*unspecified_bool_type)() const; operator unspecified_bool_type() const // never throws { return !m_pn.get_pointer() ? 0 : &this_type::unspecified_bool_type_func; } /// @endcond //!Not operator. //!Returns true if this->get() != 0, false otherwise bool operator! () const // never throws { return !m_pn.get_pointer(); } //!Returns use_count() == 1. //!unique() might be faster than use_count() bool unique() const // never throws { return m_pn.unique(); } //!Returns the number of shared_ptr objects, *this included, //!that share ownership with *this, or an unspecified nonnegative //!value when *this is empty. //!use_count() is not necessarily efficient. Use only for //!debugging and testing purposes, not for production code. long use_count() const // never throws { return m_pn.use_count(); } //!Exchanges the contents of the two //!smart pointers. void swap(shared_ptr
& other) // never throws { m_pn.swap(other.m_pn); } /// @cond template
bool _internal_less(shared_ptr
const & rhs) const { return m_pn < rhs.m_pn; } const_deleter_pointer get_deleter() const { return m_pn.get_deleter(); } // const_allocator_pointer get_allocator() const // { return m_pn.get_allocator(); } private: template
friend class shared_ptr; template
friend class weak_ptr; detail::shared_count
m_pn; // reference counter /// @endcond }; // shared_ptr template
inline bool operator==(shared_ptr
const & a, shared_ptr
const & b) { return a.get() == b.get(); } template
inline bool operator!=(shared_ptr
const & a, shared_ptr
const & b) { return a.get() != b.get(); } template
inline bool operator<(shared_ptr
const & a, shared_ptr
const & b) { return a._internal_less(b); } template
inline void swap(shared_ptr
& a, shared_ptr
& b) { a.swap(b); } template
inline shared_ptr
static_pointer_cast(shared_ptr
const & r) { return shared_ptr
(r, detail::static_cast_tag()); } template
inline shared_ptr
const_pointer_cast(shared_ptr
const & r) { return shared_ptr
(r, detail::const_cast_tag()); } template
inline shared_ptr
dynamic_pointer_cast(shared_ptr
const & r) { return shared_ptr
(r, detail::dynamic_cast_tag()); } // get_pointer() enables boost::mem_fn to recognize shared_ptr template
inline T * get_pointer(shared_ptr
const & p) { return p.get(); } // operator<< template
inline std::basic_ostream
& operator<< (std::basic_ostream
& os, shared_ptr
const & p) { os << p.get(); return os; } //!Returns the type of a shared pointer //!of type T with the allocator boost::interprocess::allocator allocator //!and boost::interprocess::deleter deleter //!that can be constructed in the given managed segment type. template
struct managed_shared_ptr { typedef typename ManagedMemory::template allocator
::type void_allocator; typedef typename ManagedMemory::template deleter
::type deleter; typedef shared_ptr< T, void_allocator, deleter> type; }; //!Returns an instance of a shared pointer constructed //!with the default allocator and deleter from a pointer //!of type T that has been allocated in the passed managed segment template
inline typename managed_shared_ptr
::type make_managed_shared_ptr(T *constructed_object, ManagedMemory &managed_memory) { return typename managed_shared_ptr
::type ( constructed_object , managed_memory.template get_allocator
() , managed_memory.template get_deleter
() ); } /* // get_deleter (experimental) template
typename detail::pointer_to_other
, Deleter>::type get_deleter(shared_ptr
const & p) { return static_cast
(p._internal_get_deleter(typeid(Deleter))); } */ } // namespace interprocess /// @cond #if defined(_MSC_VER) && (_MSC_VER < 1400) // get_pointer() enables boost::mem_fn to recognize shared_ptr template
inline T * get_pointer(boost::interprocess::shared_ptr
const & p) { return p.get(); } #endif /// @endcond } // namespace boost #include
#endif // #ifndef BOOST_INTERPROCESS_SHARED_PTR_HPP_INCLUDED
shared_ptr.hpp
Page URL
File URL
Prev
5/7
Next
Download
( 14 KB )
Note: The DriveHQ service banners will NOT be displayed if the file owner is a paid member.
Comments
Total ratings:
0
Average rating:
Not Rated
Would you like to comment?
Join DriveHQ
for a free account, or
Logon
if you are already a member.