x
Yes
No
Do you want to visit DriveHQ English website?
首页
产品服务
价格
免费试用
下载客户端
关于我们
云文件服务
|
云备份服务
|
FTP服务
|
企业邮箱服务
|
网站托管
|
客户端软件
云文件服务
云备份服务
FTP服务
企业级邮箱服务
网站托管
客户端软件
container_traits.hpp - Hosted on DriveHQ Cloud IT Platform
返回上层目录
上传
下载
共享
发布
新建文件夹
新建文件
复制
剪切
删除
粘贴
评论
升级服务
路径: \\game3dprogramming\materials\GameFactory\GameFactoryDemo\references\boost_1_35_0\boost\pending\container_traits.hpp
旋转
特效
属性
历史版本
// (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
网页地址
文件地址
上一页
2/21
下一页
下载
( 13 KB )
Comments
Total ratings:
0
Average rating:
无评论
of 10
Would you like to comment?
Join now
, or
Logon
if you are already a member.