1// Boost string_algo library sequence_traits.hpp header file ---------------------------//
2
3// Copyright Pavol Droba 2002-2003.
4//
5// Distributed under the Boost Software License, Version 1.0.
6// (See accompanying file LICENSE_1_0.txt or copy at
7// http://www.boost.org/LICENSE_1_0.txt)
8
9// See http://www.boost.org/ for updates, documentation, and revision history.
10
11#ifndef BOOST_STRING_SEQUENCE_TRAITS_HPP
12#define BOOST_STRING_SEQUENCE_TRAITS_HPP
13
14#include <boost/config.hpp>
15#include <boost/mpl/bool.hpp>
16#include <boost/algorithm/string/yes_no_type.hpp>
17
18/*! \file
19 Traits defined in this header are used by various algorithms to achieve
20 better performance for specific containers.
21 Traits provide fail-safe defaults. If a container supports some of these
22 features, it is possible to specialize the specific trait for this container.
23 For lacking compilers, it is possible of define an override for a specific tester
24 function.
25
26 Due to a language restriction, it is not currently possible to define specializations for
27 stl containers without including the corresponding header. To decrease the overhead
28 needed by this inclusion, user can selectively include a specialization
29 header for a specific container. They are located in boost/algorithm/string/stl
30 directory. Alternatively she can include boost/algorithm/string/std_collection_traits.hpp
31 header which contains specializations for all stl containers.
32*/
33
34namespace boost {
35 namespace algorithm {
36
37// sequence traits -----------------------------------------------//
38
39
40 //! Native replace trait
41 /*!
42 This trait specifies that the sequence has \c std::string like replace method
43 */
44 template< typename T >
45 class has_native_replace
46 {
47
48 public:
49# if BOOST_WORKAROUND( __IBMCPP__, <= 600 )
50 enum { value = false };
51# else
52 BOOST_STATIC_CONSTANT(bool, value=false);
53# endif // BOOST_WORKAROUND( __IBMCPP__, <= 600 )
54
55
56 typedef mpl::bool_<has_native_replace<T>::value> type;
57 };
58
59
60 //! Stable iterators trait
61 /*!
62 This trait specifies that the sequence has stable iterators. It means
63 that operations like insert/erase/replace do not invalidate iterators.
64 */
65 template< typename T >
66 class has_stable_iterators
67 {
68 public:
69# if BOOST_WORKAROUND( __IBMCPP__, <= 600 )
70 enum { value = false };
71# else
72 BOOST_STATIC_CONSTANT(bool, value=false);
73# endif // BOOST_WORKAROUND( __IBMCPP__, <= 600 )
74
75 typedef mpl::bool_<has_stable_iterators<T>::value> type;
76 };
77
78
79 //! Const time insert trait
80 /*!
81 This trait specifies that the sequence's insert method has
82 constant time complexity.
83 */
84 template< typename T >
85 class has_const_time_insert
86 {
87 public:
88# if BOOST_WORKAROUND( __IBMCPP__, <= 600 )
89 enum { value = false };
90# else
91 BOOST_STATIC_CONSTANT(bool, value=false);
92# endif // BOOST_WORKAROUND( __IBMCPP__, <= 600 )
93
94 typedef mpl::bool_<has_const_time_insert<T>::value> type;
95 };
96
97
98 //! Const time erase trait
99 /*!
100 This trait specifies that the sequence's erase method has
101 constant time complexity.
102 */
103 template< typename T >
104 class has_const_time_erase
105 {
106 public:
107# if BOOST_WORKAROUND( __IBMCPP__, <= 600 )
108 enum { value = false };
109# else
110 BOOST_STATIC_CONSTANT(bool, value=false);
111# endif // BOOST_WORKAROUND( __IBMCPP__, <= 600 )
112
113 typedef mpl::bool_<has_const_time_erase<T>::value> type;
114 };
115
116 } // namespace algorithm
117} // namespace boost
118
119
120#endif // BOOST_STRING_SEQUENCE_TRAITS_HPP
121