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
////////////////////////////////////////////////////////////////////////////// // // (C) Copyright Ion Gaztanaga 2005-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. // ////////////////////////////////////////////////////////////////////////////// // // This file comes from SGI's stl_list.h file. Modified by Ion Gaztanaga 2004 // Renaming, isolating and porting to generic algorithms. Pointer typedef // set to allocator::pointer to allow placing it in shared memory. // /////////////////////////////////////////////////////////////////////////////// /* * * Copyright (c) 1994 * Hewlett-Packard Company * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, * provided that the above copyright notice appear in all copies and * that both that copyright notice and this permission notice appear * in supporting documentation. Hewlett-Packard Company makes no * representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied warranty. * * * Copyright (c) 1996 * Silicon Graphics Computer Systems, Inc. * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, * provided that the above copyright notice appear in all copies and * that both that copyright notice and this permission notice appear * in supporting documentation. Silicon Graphics makes no * representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied warranty. * */ #ifndef BOOST_INTERPROCESS_LIST_HPP_ #define BOOST_INTERPROCESS_LIST_HPP_ #if (defined _MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif #include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
namespace boost { namespace interprocess { /// @cond namespace detail { template
struct list_node : public bi::make_list_base_hook
, bi::link_mode
>::type { typedef typename bi::make_list_base_hook
, bi::link_mode
>::type hook_type; list_node() : m_data() {} #ifndef BOOST_INTERPROCESS_RVALUE_REFERENCE template
list_node(const Convertible &conv) : m_data(conv) {} #else template
list_node(Convertible &&conv) : m_data(forward
(conv)) {} #endif T m_data; }; template
struct intrusive_list_type { typedef typename A::value_type value_type; typedef typename detail::pointer_to_other
::type void_pointer; typedef typename detail::list_node
node_type; typedef typename bi::make_list < node_type , bi::base_hook
, bi::constant_time_size
, bi::size_type
>::type container_type; typedef container_type type ; }; } //namespace detail { /// @endcond //! A list is a doubly linked list. That is, it is a Sequence that supports both //! forward and backward traversal, and (amortized) constant time insertion and //! removal of elements at the beginning or the end, or in the middle. Lists have //! the important property that insertion and splicing do not invalidate iterators //! to list elements, and that even removal invalidates only the iterators that point //! to the elements that are removed. The ordering of iterators may be changed //! (that is, list
::iterator might have a different predecessor or successor //! after a list operation than it did before), but the iterators themselves will //! not be invalidated or made to point to different elements unless that invalidation //! or mutation is explicit. template
class list : protected detail::node_alloc_holder
::type> { /// @cond typedef typename detail::intrusive_list_type
::type Icont; typedef detail::node_alloc_holder
AllocHolder; typedef typename AllocHolder::NodePtr NodePtr; typedef list
ThisType; typedef typename AllocHolder::NodeAlloc NodeAlloc; typedef typename AllocHolder::ValAlloc ValAlloc; typedef typename AllocHolder::Node Node; typedef detail::allocator_destroyer
Destroyer; typedef typename AllocHolder::allocator_v1 allocator_v1; typedef typename AllocHolder::allocator_v2 allocator_v2; typedef typename AllocHolder::alloc_version alloc_version; class equal_to_value { typedef typename AllocHolder::value_type value_type; const value_type &t_; public: equal_to_value(const value_type &t) : t_(t) {} bool operator()(const value_type &t)const { return t_ == t; } }; template
struct ValueCompareToNodeCompare : Pred { ValueCompareToNodeCompare(Pred pred) : Pred(pred) {} bool operator()(const Node &a, const Node &b) const { return static_cast
(*this)(a.m_data, b.m_data); } bool operator()(const Node &a) const { return static_cast
(*this)(a.m_data); } }; /// @endcond public: //! The type of object, T, stored in the list typedef T value_type; //! Pointer to T typedef typename A::pointer pointer; //! Const pointer to T typedef typename A::const_pointer const_pointer; //! Reference to T typedef typename A::reference reference; //! Const reference to T typedef typename A::const_reference const_reference; //! An unsigned integral type typedef typename A::size_type size_type; //! A signed integral type typedef typename A::difference_type difference_type; //! The allocator type typedef A allocator_type; //! The stored allocator type typedef NodeAlloc stored_allocator_type; /// @cond private: typedef difference_type list_difference_type; typedef pointer list_pointer; typedef const_pointer list_const_pointer; typedef reference list_reference; typedef const_reference list_const_reference; /// @endcond public: //! Const iterator used to iterate through a list. class const_iterator /// @cond : public std::iterator
{ protected: typename Icont::iterator m_it; explicit const_iterator(typename Icont::iterator it) : m_it(it){} void prot_incr() { ++m_it; } void prot_decr() { --m_it; } private: typename Icont::iterator get() { return this->m_it; } public: friend class list
; typedef list_difference_type difference_type; //Constructors const_iterator() : m_it() {} //Pointer like operators const_reference operator*() const { return m_it->m_data; } const_pointer operator->() const { return const_pointer(&m_it->m_data); } //Increment / Decrement const_iterator& operator++() { prot_incr(); return *this; } const_iterator operator++(int) { typename Icont::iterator tmp = m_it; ++*this; return const_iterator(tmp); } const_iterator& operator--() { prot_decr(); return *this; } const_iterator operator--(int) { typename Icont::iterator tmp = m_it; --*this; return const_iterator(tmp); } //Comparison operators bool operator== (const const_iterator& r) const { return m_it == r.m_it; } bool operator!= (const const_iterator& r) const { return m_it != r.m_it; } } /// @endcond ; //! Iterator used to iterate through a list class iterator /// @cond : public const_iterator { private: explicit iterator(typename Icont::iterator it) : const_iterator(it) {} typename Icont::iterator get() { return this->m_it; } public: friend class list
; typedef list_pointer pointer; typedef list_reference reference; //Constructors iterator(){} //Pointer like operators reference operator*() const { return this->m_it->m_data; } pointer operator->() const { return pointer(&this->m_it->m_data); } //Increment / Decrement iterator& operator++() { this->prot_incr(); return *this; } iterator operator++(int) { typename Icont::iterator tmp = this->m_it; ++*this; return iterator(tmp); } iterator& operator--() { this->prot_decr(); return *this; } iterator operator--(int) { iterator tmp = *this; --*this; return tmp; } } /// @endcond ; //! Iterator used to iterate backwards through a list. typedef std::reverse_iterator
reverse_iterator; //! Const iterator used to iterate backwards through a list. typedef std::reverse_iterator
const_reverse_iterator; //!
Effects
: Constructs a list taking the allocator as parameter. //! //!
Throws
: If allocator_type's copy constructor throws. //! //!
Complexity
: Constant. explicit list(const allocator_type &a = A()) : AllocHolder(a) {} // list(size_type n) // : AllocHolder(move(allocator_type())) // { this->resize(n); } //!
Effects
: Constructs a list that will use a copy of allocator a //! and inserts n copies of value. //! //!
Throws
: If allocator_type's default constructor or copy constructor //! throws or T's default or copy constructor throws. //! //!
Complexity
: Linear to n. list(size_type n, const T& value = T(), const A& a = A()) : AllocHolder(a) { this->insert(begin(), n, value); } //!
Effects
: Copy constructs a list. //! //!
Postcondition
: x == *this. //! //!
Throws
: If allocator_type's default constructor or copy constructor throws. //! //!
Complexity
: Linear to the elements x contains. list(const list& x) : AllocHolder(x) { this->insert(begin(), x.begin(), x.end()); } //!
Effects
: Move constructor. Moves mx's resources to *this. //! //!
Throws
: If allocator_type's default constructor throws. //! //!
Complexity
: Constant. #ifndef BOOST_INTERPROCESS_RVALUE_REFERENCE list(const detail::moved_object
&x) : AllocHolder(move((AllocHolder&)x.get())) {} #else list(list &&x) : AllocHolder(move((AllocHolder&)x)) {} #endif //!
Effects
: Constructs a list that will use a copy of allocator a //! and inserts a copy of the range [first, last) in the list. //! //!
Throws
: If allocator_type's default constructor or copy constructor //! throws or T's constructor taking an dereferenced InIt throws. //! //!
Complexity
: Linear to the range [first, last). template
list(InpIt first, InpIt last, const A &a = A()) : AllocHolder(a) { insert(begin(), first, last); } //!
Effects
: Destroys the list. All stored values are destroyed //! and used memory is deallocated. //! //!
Throws
: Nothing. //! //!
Complexity
: Linear to the number of elements. ~list() { this->clear(); } //!
Effects
: Returns a copy of the internal allocator. //! //!
Throws
: If allocator's copy constructor throws. //! //!
Complexity
: Constant. allocator_type get_allocator() const { return allocator_type(this->node_alloc()); } const stored_allocator_type &get_stored_allocator() const { return this->node_alloc(); } stored_allocator_type &get_stored_allocator() { return this->node_alloc(); } //!
Effects
: Erases all the elements of the list. //! //!
Throws
: Nothing. //! //!
Complexity
: Linear to the number of elements in the list. void clear() { AllocHolder::clear(alloc_version()); } //!
Effects
: Returns an iterator to the first element contained in the list. //! //!
Throws
: Nothing. //! //!
Complexity
: Constant. iterator begin() { return iterator(this->icont().begin()); } //!
Effects
: Returns a const_iterator to the first element contained in the list. //! //!
Throws
: Nothing. //! //!
Complexity
: Constant. const_iterator begin() const { return const_iterator(this->non_const_icont().begin()); } //!
Effects
: Returns an iterator to the end of the list. //! //!
Throws
: Nothing. //! //!
Complexity
: Constant. iterator end() { return iterator(this->icont().end()); } //!
Effects
: Returns a const_iterator to the end of the list. //! //!
Throws
: Nothing. //! //!
Complexity
: Constant. const_iterator end() const { return const_iterator(this->non_const_icont().end()); } //!
Effects
: Returns a reverse_iterator pointing to the beginning //! of the reversed list. //! //!
Throws
: Nothing. //! //!
Complexity
: Constant. reverse_iterator rbegin() { return reverse_iterator(end()); } //!
Effects
: Returns a const_reverse_iterator pointing to the beginning //! of the reversed list. //! //!
Throws
: Nothing. //! //!
Complexity
: Constant. const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); } //!
Effects
: Returns a reverse_iterator pointing to the end //! of the reversed list. //! //!
Throws
: Nothing. //! //!
Complexity
: Constant. reverse_iterator rend() { return reverse_iterator(begin()); } //!
Effects
: Returns a const_reverse_iterator pointing to the end //! of the reversed list. //! //!
Throws
: Nothing. //! //!
Complexity
: Constant. const_reverse_iterator rend() const { return const_reverse_iterator(begin()); } //!
Effects
: Returns true if the list contains no elements. //! //!
Throws
: Nothing. //! //!
Complexity
: Constant. bool empty() const { return !this->size(); } //!
Effects
: Returns the number of the elements contained in the list. //! //!
Throws
: Nothing. //! //!
Complexity
: Constant. size_type size() const { return this->icont().size(); } //!
Effects
: Returns the largest possible size of the list. //! //!
Throws
: Nothing. //! //!
Complexity
: Constant. size_type max_size() const { return AllocHolder::max_size(); } //!
Effects
: Inserts a copy of t in the beginning of the list. //! //!
Throws
: If memory allocation throws or //! T's copy constructor throws. //! //!
Complexity
: Amortized constant time. void push_front(const T& x) { this->insert(this->begin(), x); } //!
Effects
: Constructs a new element in the beginning of the list //! and moves the resources of t to this new element. //! //!
Throws
: If memory allocation throws. //! //!
Complexity
: Amortized constant time. #ifndef BOOST_INTERPROCESS_RVALUE_REFERENCE void push_front(const detail::moved_object
& x) { this->insert(this->begin(), x); } #else void push_front(T &&x) { this->insert(this->begin(), move(x)); } #endif //!
Effects
: Removes the last element from the list. //! //!
Throws
: Nothing. //! //!
Complexity
: Amortized constant time. void push_back (const T& x) { this->insert(this->end(), x); } //!
Effects
: Removes the first element from the list. //! //!
Throws
: Nothing. //! //!
Complexity
: Amortized constant time. #ifndef BOOST_INTERPROCESS_RVALUE_REFERENCE void push_back (const detail::moved_object
& x) { this->insert(this->end(), x); } #else void push_back (T &&x) { this->insert(this->end(), move(x)); } #endif //!
Effects
: Removes the first element from the list. //! //!
Throws
: Nothing. //! //!
Complexity
: Amortized constant time. void pop_front() { this->erase(this->begin()); } //!
Effects
: Removes the last element from the list. //! //!
Throws
: Nothing. //! //!
Complexity
: Amortized constant time. void pop_back() { iterator tmp = this->end(); this->erase(--tmp); } //!
Requires
: !empty() //! //!
Effects
: Returns a reference to the first element //! from the beginning of the container. //! //!
Throws
: Nothing. //! //!
Complexity
: Constant. reference front() { return *this->begin(); } //!
Requires
: !empty() //! //!
Effects
: Returns a const reference to the first element //! from the beginning of the container. //! //!
Throws
: Nothing. //! //!
Complexity
: Constant. const_reference front() const { return *this->begin(); } //!
Requires
: !empty() //! //!
Effects
: Returns a reference to the first element //! from the beginning of the container. //! //!
Throws
: Nothing. //! //!
Complexity
: Constant. reference back() { return *(--this->end()); } //!
Requires
: !empty() //! //!
Effects
: Returns a const reference to the first element //! from the beginning of the container. //! //!
Throws
: Nothing. //! //!
Complexity
: Constant. const_reference back() const { return *(--this->end()); } //!
Effects
: Inserts or erases elements at the end such that //! the size becomes n. New elements are copy constructed from x. //! //!
Throws
: If memory allocation throws, or T's copy constructor throws. //! //!
Complexity
: Linear to the difference between size() and new_size. void resize(size_type new_size, const T& x) { iterator i = this->begin(), iend = this->end(); size_type len = this->size(); if(len > new_size){ size_type to_erase = len - new_size; while(to_erase--){ --iend; } this->erase(iend, this->end()); } else{ this->priv_create_and_insert_nodes(iend, new_size - len, x); } } //!
Effects
: Inserts or erases elements at the end such that //! the size becomes n. New elements are default constructed. //! //!
Throws
: If memory allocation throws, or T's copy constructor throws. //! //!
Complexity
: Linear to the difference between size() and new_size. void resize(size_type new_size) { iterator i = this->begin(), iend = this->end(); size_type len = this->size(); if(len > new_size){ size_type to_erase = len - new_size; while(to_erase--){ --iend; } this->erase(iend, this->end()); } else{ this->priv_create_and_insert_nodes(this->end(), new_size - len); } } //!
Effects
: Swaps the contents of *this and x. //! If this->allocator_type() != x.allocator_type() //! allocators are also swapped. //! //!
Throws
: Nothing. //! //!
Complexity
: Constant. void swap(ThisType& x) { AllocHolder::swap(x); } //!
Effects
: Swaps the contents of *this and x. //! If this->allocator_type() != x.allocator_type() //! allocators are also swapped. //! //!
Throws
: Nothing. //! //!
Complexity
: Constant. //void swap(const detail::moved_object
& x) //{ this->swap(x.get()); } //!
Effects
: Makes *this contain the same elements as x. //! //!
Postcondition
: this->size() == x.size(). *this contains a copy //! of each of x's elements. //! //!
Throws
: If memory allocation throws or T's copy constructor throws. //! //!
Complexity
: Linear to the number of elements in x. ThisType& operator=(const ThisType& x) { if (this != &x) { this->assign(x.begin(), x.end()); } return *this; } //!
Effects
: Move assignment. All mx's values are transferred to *this. //! //!
Postcondition
: x.empty(). *this contains a the elements x had //! before the function. //! //!
Throws
: If allocator_type's copy constructor throws. //! //!
Complexity
: Constant. #ifndef BOOST_INTERPROCESS_RVALUE_REFERENCE ThisType& operator=(const detail::moved_object
& mx) { this->clear(); this->swap(mx.get()); return *this; } #else ThisType& operator=(ThisType &&mx) { this->clear(); this->swap(mx); return *this; } #endif //!
Requires
: p must be a valid iterator of *this. //! //!
Effects
: Inserts n copies of x before p. //! //!
Throws
: If memory allocation throws or T's copy constructor throws. //! //!
Complexity
: Linear to n. void insert(iterator p, size_type n, const T& x) { this->priv_create_and_insert_nodes(p, n, x); } //!
Requires
: p must be a valid iterator of *this. //! //!
Effects
: Insert a copy of the [first, last) range before p. //! //!
Throws
: If memory allocation throws, T's constructor from a //! dereferenced InpIt throws. //! //!
Complexity
: Linear to std::distance [first, last). template
void insert(iterator p, InpIt first, InpIt last) { const bool aux_boolean = detail::is_convertible
::value; typedef detail::bool_
Result; this->priv_insert_dispatch(p, first, last, Result()); } //!
Requires
: p must be a valid iterator of *this. //! //!
Effects
: Insert a copy of x before p. //! //!
Throws
: If memory allocation throws or x's copy constructor throws. //! //!
Complexity
: Amortized constant time. iterator insert(iterator p, const T& x) { NodePtr tmp = AllocHolder::create_node(x); return iterator(this->icont().insert(p.get(), *tmp)); } //!
Requires
: p must be a valid iterator of *this. //! //!
Effects
: Insert a new element before p with mx's resources. //! //!
Throws
: If memory allocation throws. //! //!
Complexity
: Amortized constant time. #ifndef BOOST_INTERPROCESS_RVALUE_REFERENCE iterator insert(iterator p, const detail::moved_object
& x) { NodePtr tmp = AllocHolder::create_node(x); return iterator(this->icont().insert(p.get(), *tmp)); } #else iterator insert(iterator p, T &&x) { NodePtr tmp = AllocHolder::create_node(move(x)); return iterator(this->icont().insert(p.get(), *tmp)); } #endif //!
Requires
: p must be a valid iterator of *this. //! //!
Effects
: Erases the element at p p. //! //!
Throws
: Nothing. //! //!
Complexity
: Amortized constant time. iterator erase(iterator p) { return iterator(this->icont().erase_and_dispose(p.get(), Destroyer(this->node_alloc()))); } //!
Requires
: first and last must be valid iterator to elements in *this. //! //!
Effects
: Erases the elements pointed by [first, last). //! //!
Throws
: Nothing. //! //!
Complexity
: Linear to the distance between first and last. iterator erase(iterator first, iterator last) { return iterator(AllocHolder::erase_range(first.get(), last.get(), alloc_version())); } //!
Effects
: Assigns the n copies of val to *this. //! //!
Throws
: If memory allocation throws or T's copy constructor throws. //! //!
Complexity
: Linear to n. void assign(size_type n, const T& val) { this->priv_fill_assign(n, val); } //!
Effects
: Assigns the the range [first, last) to *this. //! //!
Throws
: If memory allocation throws or //! T's constructor from dereferencing InpIt throws. //! //!
Complexity
: Linear to n. template
void assign(InpIt first, InpIt last) { const bool aux_boolean = detail::is_convertible
::value; typedef detail::bool_
Result; this->priv_assign_dispatch(first, last, Result()); } //!
Requires
: p must point to an element contained //! by the list. x != *this //! //!
Effects
: Transfers all the elements of list x to this list, before the //! the element pointed by p. No destructors or copy constructors are called. //! //!
Throws
: std::runtime_error if this' allocator and x's allocator //! are not equal. //! //!
Complexity
: Constant. //! //!
Note
: Iterators of values obtained from list x now point to elements of //! this list. Iterators of this list and all the references are not invalidated. void splice(iterator p, ThisType& x) { if((NodeAlloc&)*this == (NodeAlloc&)x){ this->icont().splice(p.get(), x.icont()); } else{ throw std::runtime_error("list::splice called with unequal allocators"); } } // void splice(iterator p, const detail::moved_object
& x) // { this->splice(p, x.get()); } //!
Requires
: p must point to an element contained //! by this list. i must point to an element contained in list x. //! //!
Effects
: Transfers the value pointed by i, from list x to this list, //! before the the element pointed by p. No destructors or copy constructors are called. //! If p == i or p == ++i, this function is a null operation. //! //!
Throws
: std::runtime_error if this' allocator and x's allocator //! are not equal. //! //!
Complexity
: Constant. //! //!
Note
: Iterators of values obtained from list x now point to elements of this //! list. Iterators of this list and all the references are not invalidated. void splice(iterator p, ThisType &x, iterator i) { if((NodeAlloc&)*this == (NodeAlloc&)x){ this->icont().splice(p.get(), x.icont(), i.get()); } else{ throw std::runtime_error("list::splice called with unequal allocators"); } } // void splice(iterator p, const detail::moved_object
&x, iterator i) // { this->splice(p, x.get(), i); } //!
Requires
: p must point to an element contained //! by this list. first and last must point to elements contained in list x. //! //!
Effects
: Transfers the range pointed by first and last from list x to this list, //! before the the element pointed by p. No destructors or copy constructors are called. //! //!
Throws
: std::runtime_error if this' allocator and x's allocator //! are not equal. //! //!
Complexity
: Linear to the number of elements transferred. //! //!
Note
: Iterators of values obtained from list x now point to elements of this //! list. Iterators of this list and all the references are not invalidated. void splice(iterator p, ThisType &x, iterator first, iterator last) { if((NodeAlloc&)*this == (NodeAlloc&)x){ this->icont().splice(p.get(), x.icont(), first.get(), last.get()); } else{ throw std::runtime_error("list::splice called with unequal allocators"); } } // void splice(iterator p, detail::moved_object
&x, iterator first, iterator last) // { return this->splice(p, x.get(), first, last); } //!
Requires
: p must point to an element contained //! by this list. first and last must point to elements contained in list x. //! n == std::distance(first, last) //! //!
Effects
: Transfers the range pointed by first and last from list x to this list, //! before the the element pointed by p. No destructors or copy constructors are called. //! //!
Throws
: std::runtime_error if this' allocator and x's allocator //! are not equal. //! //!
Complexity
: Constant. //! //!
Note
: Iterators of values obtained from list x now point to elements of this //! list. Iterators of this list and all the references are not invalidated. void splice(iterator p, ThisType &x, iterator first, iterator last, size_type n) { if((NodeAlloc&)*this == (NodeAlloc&)x){ this->icont().splice(p.get(), x.icont(), first.get(), last.get(), n); } else{ throw std::runtime_error("list::splice called with unequal allocators"); } } // void splice(iterator p, detail::moved_object
&x, iterator first, iterator last, size_type n) // { return this->splice(p, x.get(), first, last, n); } //!
Effects
: Reverses the order of elements in the list. //! //!
Throws
: Nothing. //! //!
Complexity
: This function is linear time. //! //!
Note
: Iterators and references are not invalidated void reverse() { this->icont().reverse(); } //!
Effects
: Removes all the elements that compare equal to value. //! //!
Throws
: Nothing. //! //!
Complexity
: Linear time. It performs exactly size() comparisons for equality. //! //!
Note
: The relative order of elements that are not removed is unchanged, //! and iterators to elements that are not removed remain valid. void remove(const T& value) { remove_if(equal_to_value(value)); } //!
Effects
: Removes all the elements for which a specified //! predicate is satisfied. //! //!
Throws
: If pred throws. //! //!
Complexity
: Linear time. It performs exactly size() calls to the predicate. //! //!
Note
: The relative order of elements that are not removed is unchanged, //! and iterators to elements that are not removed remain valid. template
void remove_if(Pred pred) { typedef ValueCompareToNodeCompare
Predicate; this->icont().remove_and_dispose_if(Predicate(pred), Destroyer(this->node_alloc())); } //!
Effects
: Removes adjacent duplicate elements or adjacent //! elements that are equal from the list. //! //!
Throws
: Nothing. //! //!
Complexity
: Linear time (size()-1 comparisons calls to pred()). //! //!
Note
: The relative order of elements that are not removed is unchanged, //! and iterators to elements that are not removed remain valid. void unique() { this->unique(value_equal()); } //!
Effects
: Removes adjacent duplicate elements or adjacent //! elements that satisfy some binary predicate from the list. //! //!
Throws
: If pred throws. //! //!
Complexity
: Linear time (size()-1 comparisons equality comparisons). //! //!
Note
: The relative order of elements that are not removed is unchanged, //! and iterators to elements that are not removed remain valid. template
void unique(BinaryPredicate binary_pred) { typedef ValueCompareToNodeCompare
Predicate; this->icont().unique_and_dispose(Predicate(binary_pred), Destroyer(this->node_alloc())); } //!
Requires
: The lists x and *this must be distinct. //! //!
Effects
: This function removes all of x's elements and inserts them //! in order into *this according to std::less
. The merge is stable; //! that is, if an element from *this is equivalent to one from x, then the element //! from *this will precede the one from x. //! //!
Throws
: Nothing. //! //!
Complexity
: This function is linear time: it performs at most //! size() + x.size() - 1 comparisons. void merge(list
& x) { this->merge(x, value_less()); } //!
Effects
: This function removes all of moved mx's elements and inserts them //! in order into *this according to std::less
. The merge is stable; //! that is, if an element from *this is equivalent to one from x, then the element //! from *this will precede the one from x. //! //!
Throws
: Nothing. //! //!
Complexity
: This function is linear time: it performs at most //! size() + x.size() - 1 comparisons. //! //!
Note
: Iterators and references to *this are not invalidated. //void merge(const detail::moved_object
>& x) //{ this->merge(x.get()); } //!
Requires
: p must be a comparison function that induces a strict weak //! ordering and both *this and x must be sorted according to that ordering //! The lists x and *this must be distinct. //! //!
Effects
: This function removes all of x's elements and inserts them //! in order into *this. The merge is stable; that is, if an element from *this is //! equivalent to one from x, then the element from *this will precede the one from x. //! //!
Throws
: Nothing. //! //!
Complexity
: This function is linear time: it performs at most //! size() + x.size() - 1 comparisons. //! //!
Note
: Iterators and references to *this are not invalidated. template
void merge(list
& x, StrictWeakOrdering comp) { if((NodeAlloc&)*this == (NodeAlloc&)x){ this->icont().merge(x.icont(), ValueCompareToNodeCompare
(comp)); } else{ throw std::runtime_error("list::merge called with unequal allocators"); } } //!
Requires
: p must be a comparison function that induces a strict weak //! ordering and both *this and x must be sorted according to that ordering //! The lists x and *this must be distinct. //! //!
Effects
: This function removes all of moved mx's elements and inserts them //! in order into *this. The merge is stable; that is, if an element from *this is //! equivalent to one from x, then the element from *this will precede the one from x. //! //!
Throws
: Nothing. //! //!
Complexity
: This function is linear time: it performs at most //! size() + x.size() - 1 comparisons. //! //!
Note
: Iterators and references to *this are not invalidated. //template
//void merge(const detail::moved_object
>& x, StrictWeakOrdering comp) //{ return this->merge(x.get(), comp); } //!
Effects
: This function sorts the list *this according to std::less
. //! The sort is stable, that is, the relative order of equivalent elements is preserved. //! //!
Throws
: Nothing. //! //!
Notes
: Iterators and references are not invalidated. //! //!
Complexity
: The number of comparisons is approximately N log N, where N //! is the list's size. void sort() { this->sort(value_less()); } //!
Effects
: This function sorts the list *this according to std::less
. //! The sort is stable, that is, the relative order of equivalent elements is preserved. //! //!
Throws
: Nothing. //! //!
Notes
: Iterators and references are not invalidated. //! //!
Complexity
: The number of comparisons is approximately N log N, where N //! is the list's size. template
void sort(StrictWeakOrdering comp) { // nothing if the list has length 0 or 1. if (this->size() < 2) return; this->icont().sort(ValueCompareToNodeCompare
(comp)); } /// @cond private: //Iterator range version template
void priv_create_and_insert_nodes (const_iterator pos, InpIterator beg, InpIterator end) { typedef typename std::iterator_traits
::iterator_category ItCat; priv_create_and_insert_nodes(pos, beg, end, alloc_version(), ItCat()); } template
void priv_create_and_insert_nodes (const_iterator pos, InpIterator beg, InpIterator end, allocator_v1, std::input_iterator_tag) { for (; beg != end; ++beg){ this->icont().insert(pos.get(), *this->create_node_from_it(beg)); } } template
void priv_create_and_insert_nodes (const_iterator pos, InpIterator beg, InpIterator end, allocator_v2, std::input_iterator_tag) { //Just forward to the default one priv_create_and_insert_nodes(pos, beg, end, allocator_v1(), std::input_iterator_tag()); } class insertion_functor; friend class insertion_functor; class insertion_functor { Icont &icont_; typename Icont::iterator pos_; public: insertion_functor(Icont &icont, typename Icont::iterator pos) : icont_(icont), pos_(pos) {} void operator()(Node &n) { this->icont_.insert(pos_, n); } }; template
void priv_create_and_insert_nodes (const_iterator pos, FwdIterator beg, FwdIterator end, allocator_v2, std::forward_iterator_tag) { //Optimized allocation and construction this->allocate_many_and_construct (beg, std::distance(beg, end), insertion_functor(this->icont(), pos.get())); } //Default constructed version void priv_create_and_insert_nodes(const_iterator pos, size_type n) { typedef default_construct_iterator
default_iterator; this->priv_create_and_insert_nodes(pos, default_iterator(n), default_iterator()); } //Copy constructed version void priv_create_and_insert_nodes(const_iterator pos, size_type n, const T& x) { typedef constant_iterator
cvalue_iterator; this->priv_create_and_insert_nodes(pos, cvalue_iterator(x, n), cvalue_iterator()); } //Dispatch to detect iterator range or integer overloads template
void priv_insert_dispatch(iterator p, InputIter first, InputIter last, detail::false_) { this->priv_create_and_insert_nodes(p, first, last); } template
void priv_insert_dispatch(iterator p, Integer n, Integer x, detail::true_) { this->insert(p, (size_type)n, x); } void priv_fill_assign(size_type n, const T& val) { iterator i = this->begin(), iend = this->end(); for ( ; i != iend && n > 0; ++i, --n) *i = val; if (n > 0){ this->priv_create_and_insert_nodes(this->end(), n, val); } else{ this->erase(i, end()); } } template
void priv_assign_dispatch(Integer n, Integer val, detail::true_) { this->priv_fill_assign((size_type) n, (T) val); } template
void priv_assign_dispatch(InputIter first2, InputIter last2, detail::false_) { iterator first1 = this->begin(); iterator last1 = this->end(); for ( ; first1 != last1 && first2 != last2; ++first1, ++first2) *first1 = *first2; if (first2 == last2) this->erase(first1, last1); else{ this->priv_create_and_insert_nodes(last1, first2, last2); } } //Functors for member algorithm defaults struct value_less { bool operator()(const value_type &a, const value_type &b) const { return a < b; } }; struct value_equal { bool operator()(const value_type &a, const value_type &b) const { return a == b; } }; /// @endcond }; template
inline bool operator==(const list
& x, const list
& y) { if(x.size() != y.size()){ return false; } typedef typename list
::const_iterator const_iterator; const_iterator end1 = x.end(); const_iterator i1 = x.begin(); const_iterator i2 = y.begin(); while (i1 != end1 && *i1 == *i2) { ++i1; ++i2; } return i1 == end1; } template
inline bool operator<(const list
& x, const list
& y) { return std::lexicographical_compare(x.begin(), x.end(), y.begin(), y.end()); } template
inline bool operator!=(const list
& x, const list
& y) { return !(x == y); } template
inline bool operator>(const list
& x, const list
& y) { return y < x; } template
inline bool operator<=(const list
& x, const list
& y) { return !(y < x); } template
inline bool operator>=(const list
& x, const list
& y) { return !(x < y); } #ifndef BOOST_INTERPROCESS_RVALUE_REFERENCE template
inline void swap(list
& x, list
& y) { x.swap(y); } template
inline void swap(const detail::moved_object
>& x, list
& y) { x.get().swap(y); } template
inline void swap(list
& x, const detail::moved_object
>& y) { x.swap(y.get()); } #else template
inline void swap(list
&&x, list
&&y) { x.swap(y); } #endif /// @cond //!This class is movable template
struct is_movable
> { enum { value = true }; }; //!This class is movable template
struct is_movable
> { enum { value = true }; }; /* //!This class is movable template
struct is_movable
> { enum { value = true }; }; */ //!has_trivial_destructor_after_move<> == true_type //!specialization for optimizations template
struct has_trivial_destructor_after_move
> { enum { value = has_trivial_destructor
::value }; }; /// @endcond } //namespace interprocess { } //namespace boost { #include
#endif // BOOST_INTERPROCESS_LIST_HPP_
list.hpp
Page URL
File URL
Prev
4/9
Next
Download
( 44 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.