| 
									
										
										
										
											2004-03-04 22:12:19 +00:00
										 |  |  | //  Boost string_algo library sequence_traits.hpp header file  ---------------------------//
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //  Copyright Pavol Droba 2002-2003. Use, modification and
 | 
					
						
							|  |  |  | //  distribution is subject to 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 for updates, documentation, and revision history.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef BOOST_STRING_SEQUENCE_TRAITS_HPP
 | 
					
						
							|  |  |  | #define BOOST_STRING_SEQUENCE_TRAITS_HPP
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <boost/config.hpp>
 | 
					
						
							|  |  |  | #include <boost/mpl/bool.hpp>
 | 
					
						
							|  |  |  | #include <boost/algorithm/string/yes_no_type.hpp>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*! \file
 | 
					
						
							|  |  |  |     Traits defined in this header are used by various algorithms to achieve | 
					
						
							|  |  |  |     better performance for specific containers. | 
					
						
							|  |  |  |     Traits provide fail-safe defaults. If a container supports some of these | 
					
						
							|  |  |  |     features, it is possible to specialize the specific trait for this container. | 
					
						
							|  |  |  |     For lacking compilers, it is possible of define an override for a specific tester | 
					
						
							|  |  |  |     function. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-07-15 21:48:25 +00:00
										 |  |  |     Due to a language restriction, it is not currently possible to define specializations for | 
					
						
							| 
									
										
										
										
											2004-07-14 22:24:12 +00:00
										 |  |  |     stl containers without including the corresponding header. To decrease the overhead | 
					
						
							| 
									
										
										
										
											2004-07-15 21:48:25 +00:00
										 |  |  |     needed by this inclusion, user can selectively include a specialization  | 
					
						
							| 
									
										
										
										
											2004-03-04 22:12:19 +00:00
										 |  |  |     header for a specific container. They are located in boost/algorithm/string/stl | 
					
						
							|  |  |  |     directory. Alternatively she can include boost/algorithm/string/std_collection_traits.hpp | 
					
						
							| 
									
										
										
										
											2004-07-15 21:48:25 +00:00
										 |  |  |     header which contains specializations for all stl containers. | 
					
						
							| 
									
										
										
										
											2004-03-04 22:12:19 +00:00
										 |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace boost { | 
					
						
							|  |  |  |     namespace algorithm { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //  sequence traits  -----------------------------------------------//
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-03-26 09:14:17 +00:00
										 |  |  | #ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-03-04 22:12:19 +00:00
										 |  |  |         //! Native replace tester
 | 
					
						
							|  |  |  |         /*!
 | 
					
						
							|  |  |  |             Declare an override of this tester function with return  | 
					
						
							|  |  |  |             type boost::string_algo::yes_type for a sequence with this property. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             \return yes_type if the container has basic_string like native replace | 
					
						
							|  |  |  |             method. | 
					
						
							|  |  |  |         */ | 
					
						
							|  |  |  |         no_type has_native_replace_tester(...); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-03-26 09:14:17 +00:00
										 |  |  |         //! Stable iterators tester
 | 
					
						
							|  |  |  |         /*!
 | 
					
						
							|  |  |  |             Declare an override of this tester function with return  | 
					
						
							|  |  |  |             type boost::string_algo::yes_type for a sequence with this property. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-07-14 22:24:12 +00:00
										 |  |  |             \return yes_type if the sequence's insert/replace/erase methods do not invalidate | 
					
						
							| 
									
										
										
										
											2004-03-26 09:14:17 +00:00
										 |  |  |             existing iterators. | 
					
						
							|  |  |  |         */ | 
					
						
							|  |  |  |         no_type has_stable_iterators_tester(...);                      | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         //! const time insert tester
 | 
					
						
							|  |  |  |         /*!
 | 
					
						
							|  |  |  |             Declare an override of this tester function with return  | 
					
						
							|  |  |  |             type boost::string_algo::yes_type for a sequence with this property. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             \return yes_type if the sequence's insert method is working in constant time | 
					
						
							|  |  |  |         */ | 
					
						
							|  |  |  |         no_type has_const_time_insert_tester(...);                         | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         //! const time erase tester
 | 
					
						
							|  |  |  |         /*!
 | 
					
						
							|  |  |  |             Declare an override of this tester function with return  | 
					
						
							|  |  |  |             type boost::string_algo::yes_type for a sequence with this property. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             \return yes_type if the sequence's erase method is working in constant time | 
					
						
							|  |  |  |         */ | 
					
						
							|  |  |  |         no_type has_const_time_erase_tester(...);                         | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif //BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-03-04 22:12:19 +00:00
										 |  |  |         //! Native replace trait
 | 
					
						
							|  |  |  |         /*!
 | 
					
						
							|  |  |  |             This trait specifies that the sequence has \c std::string like replace method | 
					
						
							|  |  |  |         */ | 
					
						
							|  |  |  |         template< typename T > | 
					
						
							|  |  |  |         class has_native_replace | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2004-03-26 09:14:17 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
 | 
					
						
							| 
									
										
										
										
											2004-03-04 22:12:19 +00:00
										 |  |  |         private: | 
					
						
							|  |  |  |             static T* t; | 
					
						
							|  |  |  |         public: | 
					
						
							|  |  |  |             BOOST_STATIC_CONSTANT(bool, value=(  | 
					
						
							|  |  |  |                 sizeof(has_native_replace_tester(t))==sizeof(yes_type) ) ); | 
					
						
							| 
									
										
										
										
											2004-03-26 09:14:17 +00:00
										 |  |  | #else  // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
 | 
					
						
							| 
									
										
										
										
											2004-07-14 21:21:54 +00:00
										 |  |  |         public: | 
					
						
							|  |  |  | #    if BOOST_WORKAROUND( __IBMCPP__, <= 600 )
 | 
					
						
							|  |  |  |             enum { value = false }; | 
					
						
							|  |  |  | #    else
 | 
					
						
							| 
									
										
										
										
											2004-03-26 09:14:17 +00:00
										 |  |  |             BOOST_STATIC_CONSTANT(bool, value=false); | 
					
						
							| 
									
										
										
										
											2004-07-14 21:21:54 +00:00
										 |  |  | #    endif // BOOST_WORKAROUND( __IBMCPP__, <= 600 )
 | 
					
						
							| 
									
										
										
										
											2004-03-26 09:14:17 +00:00
										 |  |  | #endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
 | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-03-04 22:12:19 +00:00
										 |  |  |             typedef mpl::bool_<value> type;      | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         //! Stable iterators trait
 | 
					
						
							|  |  |  |         /*!
 | 
					
						
							| 
									
										
										
										
											2004-07-15 21:48:25 +00:00
										 |  |  |             This trait specifies that the sequence has stable iterators. It means | 
					
						
							| 
									
										
										
										
											2004-03-04 22:12:19 +00:00
										 |  |  |             that operations like insert/erase/replace do not invalidate iterators. | 
					
						
							|  |  |  |         */ | 
					
						
							|  |  |  |         template< typename T > | 
					
						
							|  |  |  |         class has_stable_iterators | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2004-03-26 09:14:17 +00:00
										 |  |  | #ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
 | 
					
						
							| 
									
										
										
										
											2004-03-04 22:12:19 +00:00
										 |  |  |         private: | 
					
						
							|  |  |  |             static T* t; | 
					
						
							|  |  |  |         public: | 
					
						
							|  |  |  |             BOOST_STATIC_CONSTANT(bool, value=(  | 
					
						
							|  |  |  |                 sizeof(has_stable_iterators_tester(t))==sizeof(yes_type) ) ); | 
					
						
							| 
									
										
										
										
											2004-03-26 09:14:17 +00:00
										 |  |  | #else  // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
 | 
					
						
							| 
									
										
										
										
											2004-07-14 21:21:54 +00:00
										 |  |  |         public: | 
					
						
							|  |  |  | #    if BOOST_WORKAROUND( __IBMCPP__, <= 600 )
 | 
					
						
							|  |  |  |             enum { value = false }; | 
					
						
							|  |  |  | #    else
 | 
					
						
							| 
									
										
										
										
											2004-03-26 09:14:17 +00:00
										 |  |  |             BOOST_STATIC_CONSTANT(bool, value=false); | 
					
						
							| 
									
										
										
										
											2004-07-14 21:21:54 +00:00
										 |  |  | #    endif // BOOST_WORKAROUND( __IBMCPP__, <= 600 )
 | 
					
						
							| 
									
										
										
										
											2004-03-26 09:14:17 +00:00
										 |  |  | #endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-03-04 22:12:19 +00:00
										 |  |  |             typedef mpl::bool_<value> type; | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         //! Const time insert trait
 | 
					
						
							|  |  |  |         /*!
 | 
					
						
							|  |  |  |             This trait specifies that the sequence's insert method has  | 
					
						
							|  |  |  |             constant time complexity. | 
					
						
							|  |  |  |         */ | 
					
						
							|  |  |  |         template< typename T > | 
					
						
							|  |  |  |         class has_const_time_insert | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2004-03-26 09:14:17 +00:00
										 |  |  | #ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
 | 
					
						
							| 
									
										
										
										
											2004-03-04 22:12:19 +00:00
										 |  |  |         private: | 
					
						
							|  |  |  |             static T* t; | 
					
						
							|  |  |  |         public: | 
					
						
							|  |  |  |             BOOST_STATIC_CONSTANT(bool, value=(  | 
					
						
							| 
									
										
										
										
											2004-04-04 10:29:31 +00:00
										 |  |  |                 sizeof(has_const_time_insert_tester(t))==sizeof(yes_type) ) ); | 
					
						
							| 
									
										
										
										
											2004-03-26 09:14:17 +00:00
										 |  |  | #else  // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
 | 
					
						
							| 
									
										
										
										
											2004-07-14 21:21:54 +00:00
										 |  |  |         public: | 
					
						
							|  |  |  | #    if BOOST_WORKAROUND( __IBMCPP__, <= 600 )
 | 
					
						
							|  |  |  |             enum { value = false }; | 
					
						
							|  |  |  | #    else
 | 
					
						
							| 
									
										
										
										
											2004-03-26 09:14:17 +00:00
										 |  |  |             BOOST_STATIC_CONSTANT(bool, value=false); | 
					
						
							| 
									
										
										
										
											2004-07-14 21:21:54 +00:00
										 |  |  | #    endif // BOOST_WORKAROUND( __IBMCPP__, <= 600 )
 | 
					
						
							| 
									
										
										
										
											2004-03-26 09:14:17 +00:00
										 |  |  | #endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-03-04 22:12:19 +00:00
										 |  |  |             typedef mpl::bool_<value> type; | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         //! Const time erase trait
 | 
					
						
							|  |  |  |         /*!
 | 
					
						
							|  |  |  |             This trait specifies that the sequence's erase method has  | 
					
						
							|  |  |  |             constant time complexity. | 
					
						
							|  |  |  |         */ | 
					
						
							|  |  |  |         template< typename T > | 
					
						
							|  |  |  |         class has_const_time_erase | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2004-03-26 09:14:17 +00:00
										 |  |  | #ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
 | 
					
						
							| 
									
										
										
										
											2004-03-04 22:12:19 +00:00
										 |  |  |         private: | 
					
						
							|  |  |  |             static T* t; | 
					
						
							|  |  |  |         public: | 
					
						
							|  |  |  |             BOOST_STATIC_CONSTANT(bool, value=(  | 
					
						
							| 
									
										
										
										
											2004-04-04 10:29:31 +00:00
										 |  |  |                 sizeof(has_const_time_erase_tester(t))==sizeof(yes_type) ) ); | 
					
						
							| 
									
										
										
										
											2004-03-26 09:14:17 +00:00
										 |  |  | #else  // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
 | 
					
						
							| 
									
										
										
										
											2004-07-14 21:21:54 +00:00
										 |  |  |         public: | 
					
						
							|  |  |  | #    if BOOST_WORKAROUND( __IBMCPP__, <= 600 )
 | 
					
						
							|  |  |  |             enum { value = false }; | 
					
						
							|  |  |  | #    else
 | 
					
						
							| 
									
										
										
										
											2004-03-26 09:14:17 +00:00
										 |  |  |             BOOST_STATIC_CONSTANT(bool, value=false); | 
					
						
							| 
									
										
										
										
											2004-07-14 21:21:54 +00:00
										 |  |  | #    endif // BOOST_WORKAROUND( __IBMCPP__, <= 600 )
 | 
					
						
							| 
									
										
										
										
											2004-03-26 09:14:17 +00:00
										 |  |  | #endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-03-04 22:12:19 +00:00
										 |  |  |             typedef mpl::bool_<value> type; | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     } // namespace algorithm
 | 
					
						
							|  |  |  | } // namespace boost
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif  // BOOST_STRING_SEQUENCE_TRAITS_HPP
 |