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 Jeremy Siek 2004 // 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) #ifndef BOOST_GRAPH_DETAIL_CONTAINER_TRAITS_H #define BOOST_GRAPH_DETAIL_CONTAINER_TRAITS_H // Sure would be nice to be able to forward declare these // instead of pulling in all the headers. Too bad that // is not legal. There ought to be a standard
header. -JGS #include
#include
// for std::remove #include
#include
#include
#include
#if !defined BOOST_NO_HASH # ifdef BOOST_HASH_SET_HEADER # include BOOST_HASH_SET_HEADER # else # include
# endif # ifdef BOOST_HASH_MAP_HEADER # include BOOST_HASH_MAP_HEADER # else # include
# endif #endif #if !defined BOOST_NO_SLIST # ifdef BOOST_SLIST_HEADER # include BOOST_SLIST_HEADER # else # include
# endif #endif #if BOOST_WORKAROUND(BOOST_MSVC, < 1300) // Stay out of the way of concept checking class templates # define Container Container_ # define AssociativeContainer AssociativeContainer_ #endif // The content of this file is in 'graph_detail' because otherwise // there will be name clashes with // sandbox/boost/sequence_algo/container_traits.hpp // The 'detail' subnamespace will still cause problems. namespace boost { namespace graph_detail { //====================================================================== // Container Category Tags // // They use virtual inheritance because there are lots of // inheritance diamonds. struct container_tag { }; struct forward_container_tag : virtual public container_tag { }; struct reversible_container_tag : virtual public forward_container_tag { }; struct random_access_container_tag : virtual public reversible_container_tag { }; struct sequence_tag : virtual public forward_container_tag { }; struct associative_container_tag : virtual public forward_container_tag { }; struct sorted_associative_container_tag : virtual public associative_container_tag, virtual public reversible_container_tag { }; struct front_insertion_sequence_tag : virtual public sequence_tag { }; struct back_insertion_sequence_tag : virtual public sequence_tag { }; struct unique_associative_container_tag : virtual public associative_container_tag { }; struct multiple_associative_container_tag : virtual public associative_container_tag { }; struct simple_associative_container_tag : virtual public associative_container_tag { }; struct pair_associative_container_tag : virtual public associative_container_tag { }; //====================================================================== // Iterator Stability Tags // // Do mutating operations such as insert/erase/resize invalidate all // outstanding iterators? struct stable_tag { }; struct unstable_tag { }; //====================================================================== // Container Traits Class and container_category() function #if !defined BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION // don't use this unless there is partial specialization template
struct container_traits { typedef typename Container::category category; typedef typename Container::iterator_stability iterator_stability; }; #endif // Use this as a compile-time assertion that X is stable inline void require_stable(stable_tag) { } // std::vector struct vector_tag : virtual public random_access_container_tag, virtual public back_insertion_sequence_tag { }; template
vector_tag container_category(const std::vector
&) { return vector_tag(); } template
unstable_tag iterator_stability(const std::vector
&) { return unstable_tag(); } #if !defined BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION template
struct container_traits< std::vector
> { typedef vector_tag category; typedef unstable_tag iterator_stability; }; #endif // std::list struct list_tag : virtual public reversible_container_tag, virtual public back_insertion_sequence_tag // this causes problems for push_dispatch... // virtual public front_insertion_sequence_tag { }; template
list_tag container_category(const std::list
&) { return list_tag(); } template
stable_tag iterator_stability(const std::list
&) { return stable_tag(); } #if !defined BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION template
struct container_traits< std::list
> { typedef list_tag category; typedef stable_tag iterator_stability; }; #endif // std::slist #ifndef BOOST_NO_SLIST # ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION template
struct container_traits
> { typedef front_insertion_sequence_tag category; typedef stable_tag iterator_stability; }; #endif template
front_insertion_sequence_tag container_category( const BOOST_STD_EXTENSION_NAMESPACE::slist
& ) { return front_insertion_sequence_tag(); } template
stable_tag iterator_stability( const BOOST_STD_EXTENSION_NAMESPACE::slist
&) { return stable_tag(); } #endif // std::set struct set_tag : virtual public sorted_associative_container_tag, virtual public simple_associative_container_tag, virtual public unique_associative_container_tag { }; template
set_tag container_category(const std::set
&) { return set_tag(); } template
stable_tag iterator_stability(const std::set
&) { return stable_tag(); } #if !defined BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION template
struct container_traits< std::set
> { typedef set_tag category; typedef stable_tag iterator_stability; }; #endif // std::multiset struct multiset_tag : virtual public sorted_associative_container_tag, virtual public simple_associative_container_tag, virtual public multiple_associative_container_tag { }; template
multiset_tag container_category(const std::multiset
&) { return multiset_tag(); } template
stable_tag iterator_stability(const std::multiset
&) { return stable_tag(); } #if !defined BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION template
struct container_traits< std::multiset
> { typedef multiset_tag category; typedef stable_tag iterator_stability; }; #endif // deque // std::map struct map_tag : virtual public sorted_associative_container_tag, virtual public pair_associative_container_tag, virtual public unique_associative_container_tag { }; #if !defined BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION template
struct container_traits< std::map
> { typedef map_tag category; typedef stable_tag iterator_stability; }; #endif template
map_tag container_category(const std::map
&) { return map_tag(); } template
stable_tag iterator_stability(const std::map
&) { return stable_tag(); } // std::multimap struct multimap_tag : virtual public sorted_associative_container_tag, virtual public pair_associative_container_tag, virtual public multiple_associative_container_tag { }; #if !defined BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION template
struct container_traits< std::multimap
> { typedef multimap_tag category; typedef stable_tag iterator_stability; }; #endif template
multimap_tag container_category(const std::multimap
&) { return multimap_tag(); } template
stable_tag iterator_stability(const std::multimap
&) { return stable_tag(); } // hash_set, hash_map #ifndef BOOST_NO_HASH #ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION template
struct container_traits< BOOST_STD_EXTENSION_NAMESPACE::hash_set
> { typedef set_tag category; typedef stable_tag iterator_stability; // is this right? }; template
struct container_traits< BOOST_STD_EXTENSION_NAMESPACE::hash_map
> { typedef map_tag category; typedef stable_tag iterator_stability; // is this right? }; #endif template
set_tag container_category(const BOOST_STD_EXTENSION_NAMESPACE::hash_set
&) { return set_tag(); } template
map_tag container_category(const BOOST_STD_EXTENSION_NAMESPACE::hash_map
&) { return map_tag(); } template
stable_tag iterator_stability(const BOOST_STD_EXTENSION_NAMESPACE::hash_set
&) { return stable_tag(); } template
stable_tag iterator_stability(const BOOST_STD_EXTENSION_NAMESPACE::hash_map
&) { return stable_tag(); } #endif //=========================================================================== // Generalized Container Functions // Erase template
void erase_dispatch(Sequence& c, const T& x, sequence_tag) { c.erase(std::remove(c.begin(), c.end(), x), c.end()); } template
void erase_dispatch(AssociativeContainer& c, const T& x, associative_container_tag) { c.erase(x); } template
void erase(Container& c, const T& x) { erase_dispatch(c, x, container_category(c)); } // Erase If template
void erase_if_dispatch(Sequence& c, Predicate p, sequence_tag, IteratorStability) { #if 0 c.erase(std::remove_if(c.begin(), c.end(), p), c.end()); #else if (! c.empty()) c.erase(std::remove_if(c.begin(), c.end(), p), c.end()); #endif } template
void erase_if_dispatch(AssociativeContainer& c, Predicate p, associative_container_tag, stable_tag) { typename AssociativeContainer::iterator i, next; for (i = next = c.begin(); next != c.end(); i = next) { ++next; if (p(*i)) c.erase(i); } } template
void erase_if_dispatch(AssociativeContainer& c, Predicate p, associative_container_tag, unstable_tag) { // This method is really slow, so hopefully we won't have any // associative containers with unstable iterators! // Is there a better way to do this? typename AssociativeContainer::iterator i; typename AssociativeContainer::size_type n = c.size(); while (n--) for (i = c.begin(); i != c.end(); ++i) if (p(*i)) { c.erase(i); break; } } template
void erase_if(Container& c, Predicate p) { erase_if_dispatch(c, p, container_category(c), iterator_stability(c)); } // Push template
std::pair
push_dispatch(Container& c, const T& v, back_insertion_sequence_tag) { c.push_back(v); return std::make_pair(boost::prior(c.end()), true); } template
std::pair
push_dispatch(Container& c, const T& v, front_insertion_sequence_tag) { c.push_front(v); return std::make_pair(c.begin(), true); } template
std::pair
push_dispatch(AssociativeContainer& c, const T& v, unique_associative_container_tag) { return c.insert(v); } template
std::pair
push_dispatch(AssociativeContainer& c, const T& v, multiple_associative_container_tag) { return std::make_pair(c.insert(v), true); } template
std::pair
push(Container& c, const T& v) { return push_dispatch(c, v, container_category(c)); } }} // namespace boost::graph_detail #if BOOST_WORKAROUND(BOOST_MSVC, < 1300) // Stay out of the way of concept checking class templates # undef Container # undef AssociativeContainer #endif #endif // BOOST_GRAPH_DETAIL_CONTAINER_TRAITS_H
container_traits.hpp
Page URL
File URL
Prev
2/21
Next
Download
( 13 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.